Merge 0.9.25 branch pre-macOS fixes. Discard desyncing changes at nemo's direction
authorraptor <buckyballreaction@gmail.com>
Fri, 16 Aug 2019 10:59:50 -0600
changeset 15338 c4d68ab7aecb
parent 15333 79b73f04e43e (diff)
parent 14594 9c03b3cd6d16 (current diff)
child 15339 8951eaad20e5
Merge 0.9.25 branch pre-macOS fixes. Discard desyncing changes at nemo's direction
hedgewars/uGearsHandlersMess.pas
--- a/.hgignore	Mon Jan 14 15:11:15 2019 -0500
+++ b/.hgignore	Fri Aug 16 10:59:50 2019 -0600
@@ -20,6 +20,7 @@
 cmake_install.cmake
 QTfrontend/hwconsts.cpp
 QTfrontend/servermessages.h
+QTfrontend/creditsmessages.h
 CPackConfig.cmake
 CPackSourceConfig.cmake
 tools/cmake_uninstall.cmake
@@ -89,3 +90,8 @@
 *.user
 *.iml
 build-qmlfrontend*
+.cabal-sandbox
+cabal.sandbox.config
+*.so
+*_autogen
+build/
--- a/.travis.yml	Mon Jan 14 15:11:15 2019 -0500
+++ b/.travis.yml	Fri Aug 16 10:59:50 2019 -0600
@@ -1,5 +1,5 @@
 sudo: required
-dist: bionic
+dist: xenial
 language: c
 sudo: true
 os:
@@ -23,7 +23,7 @@
   - BUILD_ARGS="-DCMAKE_BUILD_TYPE=Release"
   - BUILD_ARGS="-DCMAKE_BUILD_TYPE=Debug"
   - BUILD_ARGS="-DNOSERVER=1 -DGL2=1 -DNOPNG=1"
-  - BUILD_ARGS="-DNOSERVER=1 -DLUA_SYSTEM=0 -DPHYSFS_SYSTEM=0"
+  - BUILD_ARGS="-DNOSERVER=1 -DLUA_SYSTEM=0"
 
 matrix:
   include:
@@ -54,7 +54,7 @@
   if [ "$TRAVIS_OS_NAME" == "linux" ]; then
     sudo apt-get update -qq
   elif [ "$TRAVIS_OS_NAME" == "osx" ]; then
-    brew update --all
+    brew update
   elif [ "$TRAVIS_OS_NAME" == "ios" ]; then
     hg clone http://hg.libsdl.org/SDL $SDL_LIB_PATH/SDL/
     hg clone http://hg.libsdl.org/SDL_image $SDL_LIB_PATH/SDL_image/
@@ -65,11 +65,22 @@
 
 install: |
   if [ "$TRAVIS_OS_NAME" == "linux" ]; then
-    sudo apt-get install -y debhelper cmake dpkg-dev qtbase5-dev qtbase5-private-dev qttools5-dev-tools qttools5-dev libphysfs-dev libsdl2-dev libsdl2-ttf-dev libsdl2-mixer-dev libsdl2-image-dev libsdl2-net-dev bzip2 ghc libghc-mtl-dev libghc-vector-dev libghc-zlib-dev libghc-random-dev libghc-network-dev libghc-sandi-dev libghc-hslogger-dev libghc-utf8-string-dev libghc-sha-dev libghc-entropy-dev libghc-regex-tdfa-dev libghc-aeson-dev libghc-yaml-dev libghc-text-dev liblua5.1-0-dev fpc fp-compiler fp-units-misc libpng-dev fp-units-gfx libavcodec-dev libavformat-dev libglew1.6-dev
+    sudo apt-get install -y debhelper cmake dpkg-dev qtbase5-dev qtbase5-private-dev qttools5-dev-tools qttools5-dev libsdl2-dev libsdl2-ttf-dev libsdl2-mixer-dev libsdl2-image-dev libsdl2-net-dev bzip2 ghc libghc-mtl-dev libghc-vector-dev libghc-zlib-dev libghc-random-dev libghc-network-dev libghc-sandi-dev libghc-hslogger-dev libghc-utf8-string-dev libghc-sha-dev libghc-entropy-dev libghc-regex-tdfa-dev libghc-aeson-dev libghc-yaml-dev libghc-text-dev liblua5.1-0-dev fpc fp-compiler fp-units-misc libpng-dev fp-units-gfx libavcodec-dev libavformat-dev libglew1.6-dev
+
+    # for xenial last availible version of libphysfs is 2.0.x, but we need >= 3.0
+    # so... building from sources!
+    wget https://icculus.org/physfs/downloads/physfs-3.0.1.tar.bz2
+    tar -xjf physfs-3.0.1.tar.bz2
+    mkdir physfs-3.0.1-build
+    pushd physfs-3.0.1-build
+    cmake ../physfs-3.0.1
+    make
+    sudo make install
+    popd
   elif [ "$TRAVIS_OS_NAME" == "osx" ]; then
     brew install qt5
     brew install fpc glew physfs lua51 sdl2 sdl2_image sdl2_net sdl2_ttf ffmpeg ghc cabal-install
-    brew install sdl2_mixer --with-libvorbis
+    brew install sdl2_mixer
     # use cabal install haskell deps, pas2c ones are covered by server
     if [[ "$BUILD_ARGS" != *"NOSERVER"* ]]; then
       cabal update
--- a/CMakeLists.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/CMakeLists.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -20,16 +20,18 @@
 
 #possible cmake configuration
 option(NOSERVER "Disable gameServer build (off)" OFF)
-option(NOPNG "Disable screenshoot compression (off)" OFF)
+if(NOT WIN32)
+    option(NOPNG "Disable screenshoot compression (off)" OFF)
+endif()
 option(NOVIDEOREC "Disable video recording (off)" OFF)
 
 #libraries are built shared unless explicitly added as a static
 option(BUILD_SHARED_LIBS "Build libraries as shared modules (on)" ON)
 
 if(WIN32 OR APPLE)
-    option(LUA_SYSTEM "Use system lua (off)" OFF)
+    option(LUA_SYSTEM "Use system Lua (off)" OFF)
 else()
-    option(LUA_SYSTEM "Use system lua (on)" ON)
+    option(LUA_SYSTEM "Use system Lua (on)" ON)
 endif()
 
 option(BUILD_ENGINE_LIBRARY "Enable hwengine library (off)" OFF)
@@ -40,8 +42,8 @@
 option(SKIPBUNDLE "Do not create relocate bundle (off)" OFF)
 
 option(BUILD_ENGINE_C "Compile hwengine as native C (off)" OFF)
-option(BUILD_ENGINE_JS "Compile hwengine as javascript (off)" OFF)
-option(GL2 "Enable OpenGL 2 rendering !!!EXPERIMENTAL - DO NOT USE!!! [default: off)" OFF)
+option(BUILD_ENGINE_JS "Compile hwengine as JavaScript (off)" OFF)
+option(GL2 "Enable OpenGL 2 rendering, only use if you know what you're doing (off)" OFF)
 
 set(GHFLAGS "" CACHE STRING "Additional Haskell flags")
 if(UNIX AND NOT APPLE)
@@ -51,6 +53,14 @@
 option(NOVERSIONINFOUPDATE "Disable update of version_info.txt. To be used if source is in a git/repo that is NOT the hedgewars repo" OFF)
 
 
+if(BUILD_ENGINE_C AND NOT NOVIDEOREC)
+    if((CMAKE_BUILD_TYPE MATCHES "RELEASE") OR (CMAKE_BUILD_TYPE MATCHES "RELWITHDEBUGINFO"))
+        message("NOTE: Video recorder support disabled. It's incompatible with BUILD_ENGINE_C")
+        set(BUILD_ENGINE_C ON CACHE STRING "Required for BUILD_ENGINE_JS" FORCE)
+    else()
+        message("WARNING: Video recorder support is currently incompatible with BUILD_ENGINE_C, the video recorder won't work (but demos are fine)! See <https://issues.hedgewars.org/show_bug.cgi?id=722>.")
+    endif()
+endif()
 if(BUILD_ENGINE_JS)
     if(NOT CMAKE_TOOLCHAIN_FILE)
         message(FATAL_ERROR "Missing emscripten toolchain file\nClean your cache and rerun cmake with -DCMAKE_TOOLCHAIN_FILE=${CMAKE_SOURCE_DIR}/cmake_modules/Platform/Emscripten.cmake")
@@ -72,9 +82,6 @@
 if("${CMAKE_SIZEOF_VOID_P}" EQUAL "4" AND UNIX AND NOT APPLE)
     set(BUILD_ENGINE_C ON CACHE STRING "PAS2C force-enabled due to a freepascal 32 bit alignment bug" FORCE)
 endif()
-if(BUILD_ENGINE_C)
-    set(NOVIDEOREC ON CACHE STRING "PAS2C does not support video recording at present" FORCE)
-endif()
 
 #system paths for finding required fonts (see share/hedgewars/Data/fonts)
 #subdirectories will NOT be searched.
@@ -82,11 +89,15 @@
 set(FONTS_DIRS "" CACHE STRING "Additional paths to folders where required fonts can be found ( ; is separator)")
 
 #versioning
-set(CPACK_PACKAGE_VERSION_MAJOR 0)
-set(CPACK_PACKAGE_VERSION_MINOR 9)
-set(CPACK_PACKAGE_VERSION_PATCH 25)
-set(HEDGEWARS_PROTO_VER 57)
-set(HEDGEWARS_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
+set(CPACK_PACKAGE_VERSION_MAJOR 1)
+set(CPACK_PACKAGE_VERSION_MINOR 0)
+set(CPACK_PACKAGE_VERSION_PATCH 0)
+set(HEDGEWARS_PROTO_VER 58)
+if((CMAKE_BUILD_TYPE MATCHES "RELEASE") OR (CMAKE_BUILD_TYPE MATCHES "RELWITHDEBUGINFO"))
+    set(HEDGEWARS_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
+else()
+    set(HEDGEWARS_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}-dev")
+endif()
 include(${CMAKE_MODULE_PATH}/revinfo.cmake)
 
 message(STATUS "Building ${HEDGEWARS_VERSION}-r${HEDGEWARS_REVISION} (${HEDGEWARS_HASH})")
--- a/CREDITS	Mon Jan 14 15:11:15 2019 -0500
+++ b/CREDITS	Fri Aug 16 10:59:50 2019 -0600
@@ -1,6 +1,7 @@
 =============================
 === EXTENDED CREDITS LIST ===
 =============================
+For the main credits, click on the Hedgewars logo in the main menu.
 
 IF NOT OTHERWISE SPECIFIED, ALL OTHER CONTENT IS PROPERTY OF Andrey Korotaev <unC0Rr@gmail.com>.
 IF NO LICENSE IS SPECIFIED, THE LICENSE IS THE SAME AS MENTIONED IN README.md.
@@ -12,26 +13,6 @@
 ==========
 - see Fonts_LICENSE.txt
 
-=================
-= FRONTEND IMAGES
-=================
-(File name suffixes are omitted)
-
-- Tango Project and Wuzzy -> audio, home (CC0)
-- abustany and Wuzzy -> Videos (CC0)
-- Juliane Krug and Wuzzy -> Palette (CC0)
-- raseone and Wuzzy -> folder (CC0)
-
-==========
-= FORTS
-==========
-- Carlos Vives -> Tank (2010)
-- Dragonfly -> EvilChicken (2010)
-- Randy Broda -> SteelTower (2013)
-- Jon Dum and Wuzzy -> Snail (2017)
-- Maciej Mroziński (a.k.a. alzen) and Wuzzy -> Lonely_Island (2017)
-- Guillaume Englert and Wuzzy -> Olympic (2017)
-
 ==========
 = HATS
 ==========
@@ -51,57 +32,33 @@
 - Terrington_Snyde -> pirate_eyepatch (2013), jester (2013)
 - Wohlstand -> policegirl [based on policecap and sm_daisy] (2014)
 - TheMadCharles -> barrelhider (CC BY 3.0) (2015)
+- Trey Perry <perry.j@gmail.com> -> Other hats
+- alfadur -> zoo_crocodile (2019)
 
 ==========
-= GRAVESTONES
+= GRAVES
 ==========
 - Randy Broda -> dragonball (2012)
 - CheezeMonkey -> pi (2011)
 - rosenholz -> Whisky (2013)
 
-==========
-= MAPS
-==========
-- John Dum <fizzy@gmail.com> -> Bath (2008), Hedgelove (2008), Hedgewars (2008), Hydrant (2008), mushrooms (2008), Plane (2008)
-- Joshua Frese <joshfrese@gmail.com> -> Bamboo (2008), EarthRise (2008), Freeway (2008), BambooPlinko (2008)
-- Stanko Tadić <stanko@mfhinc.net> -> Castle (2008), PirateFlag (2008)
-- dctPL -> Sticks (2010)
-- wolfmarc & Dragonfly -> TrophyRace (2010), ShoppaKing (2010)
+=================
+= FRONTEND IMAGES
+=================
+(File name suffixes are omitted)
 
-==========
-= MUSIC
-==========
-- HSR ( http://elhombresinremedio.com ) -> (new) City theme, Rock theme and many other tracks
-- John Dum <fizzy@gmail.com> -> Nature theme
-- Jonatan Nilsson <jonatanfan@gmail.com> -> Pirate theme, EarthRise (former City) theme, Oriental theme, Snow theme)
-- yd - http://opengameart.org/users/yd -> "oriented", used as Olympics SD theme
-- Kevin MacLeod - http://incompetech.com/ -> "hitman", used as basis for preliminary default SD theme
-- Valentin Kraevskiy (alias alfadur) -> Jungle theme, Fruit theme
+- Tango Project and Wuzzy -> audio, home (CC0)
+- abustany and Wuzzy -> Videos (CC0)
+- Juliane Krug and Wuzzy -> Palette (CC0)
+- raseone and Wuzzy -> folder (CC0)
+
+==================
+= OTHER GRAPHICS =
+==================
+- Custom ammo images for Continental supplies: KarBoy2314PL
 
 ==========
-= THEMES
-==========
-- John Dum <fizzy@gmail.com> -> Nature (2008), Snow (2008), City
-- Joshua Frese <joshfrese@gmail.com> -> Bamboo (2008), EarthRise (2008), Freeway (2008), BambooPlinko (2008)
-- Stanko Tadić <stanko@mfhinc.net> -> Hell (2008)
-- Julien Koesten <julienkoesten@aol.com> -> Sheep (2008)
-- KoRn666 - Jungle (2010)
-- Randy Broda -> Fruit (2013), Cake (2014)
-
-==========
-= VOICES
-==========
-- Stephen Alexander <ArmagonNo1@gmail.com>
-- mtg90pl <mtg90pl@gmail.com>: Default_pl, Russian_pl
-
-==========
-= MISSIONS
-==========
-- Arkhnen -> Teamwork 2 (2012)
-- Wuzzy -> Big Armory (2016)
-
-==========
-= SOUNDS
+= SOUND EFFECTS
 ==========
 - Mine impact sound from http://www.freesound.org/people/adcbicycle/sounds/13947/
 - Hammer sound from http://www.freesound.org/people/Syna-Max/sounds/43586/
@@ -139,11 +96,6 @@
 - Shoryuken hit: Based off sound by CGEffex (CC-BY 3.0), tweaked by alfadur
      http://freesound.org/people/CGEffex/sounds/98341/
 
-==================
-= OTHER GRAPHICS =
-==================
-- Custom ammo images for Continental supplies: KarBoy2314PL
-
 ======================
 = LICENSE REFERENCES =
 ======================
--- a/ChangeLog.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/ChangeLog.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -1,5 +1,220 @@
 + features
 * bugfixes
+============== 1.0.0-dev (unreleased) ==============
+Highlights:
+ + Campaigns now respect your team identity instead of overwriting it
+ + Single missions now support team selection and track your progress
+ + Challenges track the team's highscores
+ + Hand-drawn maps can now be scaled with slider
+ + Quick games are more random
+ + Homing bee can be used as secondary ammo
+ + Can change hedgehog order in The Specialists
+ + Turn transition is less hectic
+ + Various small HUD improvements
+ * Fix wrong key names being displayed in key selection
+
+Gameplay:
+ + Quick games are more random: More map types, random team size and difficulty
+ + Hand-drawn maps can now be scaled with slider
+ + Slightly longer delays between turns to make it easier to follow the game
+ + Track high scores in singleplayer challenges
+ + Show check mark for completed scenarios, challenges and trainings
+ + Training/challenge/scenario menu now supports team selection
+ + Most target practices now highlight position of next target (must be unlocked first)
+ + Homing bee can now be used as secondary ammo
+ + If bee target was placed in the dark area in a wrap world edge map, bee will first fly across border
+ + Teach computer players how to use extra time
+ * Fix hedgehogs being pushed around (and other collision bugs) when they overlap
+ * Fix homing bee flying weird if passing wrap world edge or target was placed beyond it
+ * Fix air mine not colliding with crates initially
+ * Fix buggy behaviour of time box if hog took damage or died before it arrived
+ * Fix poison damage not working in first round
+ * Use player-chosen team identity in campaigns and singleplayer missions
+ * Fix player-chosen teams ignoring custom team controls in campaigns
+ * Fix broken behaviour of airborne attacks when placed near bounce world edge
+ * Fix crate sometimes collected twice when switching to hedgehog that touches it
+ * Deny placement of piano beyond bounce world edge
+ * Fix laser sight not working properly when it starts out of map bounds
+ * Fix parachute making hog stuck or fast when bumping into wall while looking other way
+ * Add missing winner animation in single missions
+ * Fix hog floating when switching to moving hog
+ * Fix jump key not being ignored after placing girder or target
+ * Fix buggy hog when hog took damage during "idle" phase in kamikaze attack
+ * Fix movement stopping when activating flying saucer after long jump
+ * Girder/rubber can no longer be placed inside moving hogs and land objects
+
+Styles and schemes:
+ + The Specialists: Unlock game scheme
+ + The Specialists: Add script parameter support to set custom specialists order
+ + Control, CTF_Blizzard: Display scores in stats screen
+ + CTF_Blizzard: Various minor graphical and text improvements
+ + Frenzy: Change ammo slots
+ + Continental supplies: Show continent in team bars
+ * Balanced Random Weapon: Fix Lua errors after using Time Box
+ * Racer: Fix racer ghost not getting reset after a skip
+ * Space Invasion: No longer allow to set start shield above shield limit
+ * Battalion, WxW: Crates drop between turns, when appropriate
+ * Battalion: Sudden Death effects are now like in the base game
+ * King Mode: Fix team sometimes not being killed properly if king drowned
+ * King Mode: Kill resurrected minions if king is not alive
+ * King Mode: Fix whole clan being killed if a king died
+ * King Mode: Fix king placement phase not working correctly with multiple teams in a clan
+ * HedgeEditor: Fix major FPS drop when there are a lot of objects
+ * Control: Fix score failure after using extra time
+ * Frenzy: Fix incorrect ammo slot numbers in ammo menu
+ * Continental supplies: Computer teams now select random continent
+ * WxW, Racer: Computer teams no longer block setup phase
+ * Mutant: Delete excess teams when a clan has more than one team
+
+A Classic Fairytale:
+ + Backstab: Disable utilities before traitor has been dealt with
+ * Backstab: Prevent attacking the cannibals before making the choice
+ * Backstab: Fix/tweak behaviour in 3rd enemy wave
+ * First blood: Fix Lua error when hitting Attack after failing the rope challenge
+ * First blood: Fix a cut scene being played twice in row
+ * The Shadow Falls: Fix Lua error when hog dies during choice phase
+ * The Shadow Falls: Fix mission getting stuck when hog dies after accepting offer, but before returning
+ * The Shadow Falls: Fix many other Lua errors when hogs die in certain situations
+ * General: Clear hazards around cyborg when it appears in cut scenes
+ * General: Disable Sudden Death for all missions
+ * Various minor tweaks and bugfixes
+
+A Space Adventure:
+ + Show your current records at mission start when re-playing one of the challenges
+ + Spacetrip: Move flowers of desert planet above cactus
+ + Searching in the dust: Enable skip in entire mission
+ + Getting to the device: Different ending when hero chose to battle in "Bad timing" mission
+ * Searching in the dust: Fix mission ending when all smugglers are dead
+ * Searching in the dust: Fix a lot of broken/stupid smuggler behaviours
+ * Chasing the blue hog: Fix player not losing the race when timing out while still having the rope
+ * Chasing the blue hog: Fix player winning if Crazy Runner died
+ * Bad timing: Win mission in "flee" variant if all enemy hogs are dead
+ * Getting to the device: Fix clan colors
+ * Fix errors when hero and enemies die in same turn
+ * Various minor tweaks and bugfixes
+
+Controls:
+ + Add control to unselect current weapon (no key chosen by default)
+ + Add support for 4th and 5th mouse buttons
+ + Allow to leave a control unused
+ + Reset zoom resets zoom to zoom level set in options
+ + Add control to display mines time and health crate health (default: O)
+ + Precise + Reset zoom resets zoom to 100% (instead of zoom in options)
+ + Precise + zoom in/out changes zoom in smaller steps
+ + Precise + volume up/down changes volume in smaller steps
+ + Precise + cursor move keys move camera slower
+ + New chat command: “/help room” (shows room chat commands within the game)
+ + Default demo fast-forward key changed from “S” to “F”
+ * Fix broken default keyboard controls for team chat and camera movement
+
+Graphics:
+ + Animate drill rockets
+ + New idle shoryuken animation
+ + Scatter molotov cocktail pieces
+ + Improve air plane effects when used with wrap or ocean world edge
+ * Fix speech bubbles overlapping in the wrong order
+ * Fix wrong ice beam angle if it goes diagonally up out of map through world wrap
+ * Fix double water splash when flying saucer drowns
+ * Fix odd floating pixels when wielding and rotating cleaver
+ * Fix parachute and birdy sometimes being drawn behind hedgehogs and objects
+
+Game HUD:
+ + Display current hog health (and related status icons) at top right corner
+ + Display laser sight icon above wind bar when laser sight utility is active
+ + Display selected weapon above hedgehog for some weapons/tools
+ + Change cursor of piano strike
+ + New style for switching arrows
+ + Colorize switching arrows, pointing arrow and target cross in clan color
+ + Skip ammo menu animation when playing with turn time of 10s or less
+ + Don't show crate spawn message for initial crates in missions
+ + Don't show hedgehog health if “invulnerable” game modifier is active
+ + Display player name of own teams in online games
+ + Show contour of flying saucer and air mines when in highly opaque water
+ + Remove visual clutter in cut scenes
+ + Add setting to set default/initial zoom
+ * Black clan color can now be used without visual problems
+ * Fix last 2 characters in demo chat being missing
+ * Hide most HUD elements in cinematic mode
+ * Don't show "F1", "F2", etc. in ammo menu if these aren't the actual slot keys
+ * Fix wind bar animation not looping properly
+ * Fix airplane line being drawn above many HUD elements
+ * Suppress “<team> is gone.” message at end of game
+ * Fix game engine ignoring appropriate number formatting of user language
+ * Fix buggy behaviour when entering speech bubble command in hog placement phase
+ * Fix switching arrows overlapping hedgehog tags of own hedgehog
+
+Translations:
+ + Complete: German, Polish
+ + Major updates: Chinese, Scottish Gaelic
+ + Credits page is now translatable
+ * Remove Arabic translation from release
+
+Frontend:
+ + Add button in main menu at top left corner to open credits page
+ + Restructure credits page
+ + More intelligent automatic mission selection in campaign screen
+ + New data directory for video thumbnails: Data/VideoThumbnails
+ + Display a warning when the same key is used multiple times
+ + Stats screen now hides empty sections
+ + Visual notification when someone joins the room online
+ + Display recommended max. hedgehog count for Perlin maps
+ + Various minor style tweaks
+ + Remember maximized state of frontend/game window
+ * Fix broken handling of /watch chat command on official server
+ * Fix renaming a video leading to loss of thumbnail after restart
+ * Fix controls list failing to display correct key names with regards to keyboard layout
+ * Fix force-locked schemes getting unlocked when changing map types
+ * Fix possible to select background-only or hidden themes indirectly by changing map type
+ * Disallow slash, backslash and colon characters in team and scheme names
+
+Sounds and voicepacks:
+ + sndYoohoo has been split to sndYoohoo and sndKiss
+ + Voice files sndPoisonCough and sndPoisonMoan are now optional (fall back to Default voicepack)
+ + Add taunt: sndFlyAway / Flyaway.ogg: When hedgehog flies off the map
+ + Add underwater sound for airplane
+ + Tweak some taunts: sndFirstBlood, sndLeaveMeAlone, sndCutItOut
+ * Fix English voicepack selection of team being overwritten when playing in non-English locale
+ * Remove Coward.ogg in Default_es voicepack, it contained an insult
+
+Theme customization
+ + Default fallback Sudden Death music of themes (fallback-sd-music) is now sdmusic.ogg
+ + Make rope stylable by theme: Support for RopeNode.png and rope-step in theme.cfg
+
+Other game media:
+ + New hat: zoo_crocodile
+
+Lua API:
+ + New call: SaveMissionVar(varname, value): Save value to mission variable (variable for non-campaign mission)
+ + New call: GetMissionVar(varname): Get value of mission variable
+ + New call: SetTurnTimePaused(isPaused): Call with true to pause turn time, false to unpause
+ + New call: GetTurnTimePaused(): Returns true if turn time is paused due to Lua
+ + New call: AddMissionTeam(color): Add mission team, i.e. the team selected by player in campaign/mission page. Returns <team name>, <team index>
+ + New call: AddMissionHog(health): Add a hedgehog for the mission team
+ + New call: SetTeamPassive(teamname, isPassive): Mark a team as passive. Passive teams do not play and are treated like frozen teams.
+ + New call: IsHogAlive(gear): Returns true if gear is a hegehog which is alive, not about to die and not hidden
+ + New call: SetAmmoSlot(ammoType, slot): Overwrite ammo slot of ammo type (use with care!)
+ + New return value: AddTeam returns <real team name>, <team index>
+ + SetClanColor: Now accepts negative color argument for user clan color, like in AddTeam
+ + AddTeam: Append “_qau” to voicepack name to enable automatic selection of voicepack language
+ + ShowMission: Add new icons: hedgehog (10), flags (11)
+ + Utils library: New calls: getReadableChallengeRecord, updateChallengeRecord, integerSqrt, integerHypotenuse
+ + New callback: onGameResult(winningClan): Called when the game ends normally. winningClan = index of winning clan or -1 on draw
+ + New callback: onCaseDrop(gear): Called at the point where a crate MIGHT be dropped between turns. Gear is the crate gear or nil
+ + New callback: onHogSwitch(oldHog): Called when hog was switched with the “switch hedgehog” utility
+ + SendStat extension: Option to use predefined modes with siPointType: statMessage = "!POINTS", "!TIME", "!TIME0" to "!TIME3", "!CRATES", or "!EMPTY"
+ + SimpleMission: Add isMissionTeam attribute for teams
+ + SpeedShoppa/TargetPractice libraries: Remove custom hog and team info settings
+ + TargetPractice library: Add faceLeft parameter
+ + Params explode, poison in the SpawnFake*Crate functions now optional and default to false
+ + New global: InitHealth: Initial hog health value from game scheme (read-only)
+ + Animate library: AnimOutOfNowhere: destX and destY are now optional (default: current position)
+ * Fix SetClanColor causing crashes and severe rendering bugs
+ * Fix SetAmmoDelay not working properly when called after onGameStart
+ * Fix DismissTeam not clearing team properly
+ * SimpleMission: Fix Lua error spam when a custom goal fails
+ * gstWinner state is preserved after the game ended
+ * If there's a mission team, IsHogLocal now only returns true for hogs in the same clan as the mission team
+
 ====================== 0.9.25 ======================
 HIGHLIGHTS:
  + Complete overhaul of Continental supplies
@@ -300,6 +515,7 @@
  * Capture the Flag: Fix many bugs caused by playing with >2 teams
  * Capture the Flag: Properly place flag when first hog uses kamikaze or TimeBox
  * Capture the Flag: Fix flag not being dropped when carrier uses piano strike
+ * Capture the Flag: Fix clan not winning if enemy was in time travel
  * CTF_Blizzard: Don't allow more than 2 clans. Excess hogs will be removed
 
 A Space Adventure:
--- a/INSTALL.md	Mon Jan 14 15:11:15 2019 -0500
+++ b/INSTALL.md	Fri Aug 16 10:59:50 2019 -0600
@@ -26,13 +26,14 @@
 - SDL\_ttf >= 2.0
 - PhysFS >= 3.0.0
 
+On FreeBSD, you also need the package “fpc-rtl-extra”.
+
 ### Recommended optional dependencies
 
 These are not strictly required to build Hedgewars, but it's
 usually better to have them installed. Hedgewars has fallback mechanisms
 in if these are not found on your system.
 
-- qtstyleplugins (for Qt 5)
 - Lua = 5.1.0
 
 ### Optional dependencies
--- a/QTfrontend/CMakeLists.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/CMakeLists.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -45,6 +45,37 @@
 list(APPEND locsout ${firstline} "\n}\\;\n")
 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/servermessages.h ${locsout})
 
+
+# Credits localization
+file(GLOB CreditsCSV ${CMAKE_SOURCE_DIR}/QTfrontend/res/credits.csv)
+foreach(csvfile ${CreditsCSV})
+    # Load credits.csv
+    file(READ ${csvfile} csv)
+
+    # Match first line of CSV file
+    string(REGEX MATCH "(E|S|U),\"[^\n\"]+\"" loc_top ${csv})
+    string(REGEX REPLACE "(E|S|U),\"([^\n\"]+)\"" "\nQT_TRANSLATE_NOOP(\"credits\", \"\\2\")" s ${loc_top})
+    list(APPEND csvlocs ${s})
+
+    # Match remaining lines of CSV file
+    string(REGEX MATCHALL "\n(E|S|U),\"[^\n\"]+\"" locs ${csv})
+    foreach(str ${locs})
+        string(REGEX REPLACE "(E|S|U),\"([^\n\"]+)\"" "QT_TRANSLATE_NOOP(\"credits\", \"\\2\")" s ${str})
+        list(APPEND csvlocs ${s})
+    endforeach(str)
+endforeach(csvfile)
+
+list(REMOVE_DUPLICATES csvlocs)
+list(GET csvlocs 0 firstline)
+list(REMOVE_AT csvlocs 0)
+set(locsout "const char * creditsMessages[] = {")
+foreach(l ${csvlocs})
+    list(APPEND locsout ${l} ",")
+endforeach(l)
+list(APPEND locsout ${firstline} "\n}\\;\n")
+file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/creditsmessages.h ${locsout})
+
+
 include_directories(${CMAKE_CURRENT_BINARY_DIR})
 include_directories(${CMAKE_CURRENT_SOURCE_DIR})
 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/model)
@@ -92,6 +123,7 @@
     main.cpp
     team.cpp
     campaign.cpp
+    mission.cpp
     ui_hwform.cpp
     ${CMAKE_CURRENT_BINARY_DIR}/hwconsts.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/sdlkeys.cpp
@@ -137,7 +169,9 @@
     hwconsts.h
     sdlkeys.h
     campaign.h
+    mission.h
     ${CMAKE_CURRENT_BINARY_DIR}/servermessages.h
+    ${CMAKE_CURRENT_BINARY_DIR}/creditsmessages.h
     )
 
 set(hwfr_rez hedgewars.qrc)
@@ -214,7 +248,10 @@
 endif()
 
 if(CMAKE_CXX_COMPILER MATCHES "clang*")
-    list(APPEND HW_LINK_LIBS stdc++ m atomic)
+    list(APPEND HW_LINK_LIBS stdc++ m)
+    if(NOT APPLE)
+        list(APPEND HW_LINK_LIBS atomic)
+    endif()
 endif()
 
 if(WIN32 AND VCPKG_TOOLCHAIN)
--- a/QTfrontend/HWApplication.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/HWApplication.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -90,6 +90,7 @@
             form->NetConnectQuick(address, (quint16) port);
             return true;
         } else {
+            //: Here, “scheme” refers to the scheme of a Uniform Resource Identifier”
             const QString errmsg = tr("Scheme '%1' not supported").arg(scheme);
             MessageDialog::ShowErrorMessage(errmsg, form);
             return false;
--- a/QTfrontend/binds.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/binds.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -25,9 +25,13 @@
     {"+right",    "right",      QT_TRANSLATE_NOOP("binds", "right"),           NULL, NULL},
     {"+down",     "down",       QT_TRANSLATE_NOOP("binds", "down"),            NULL, NULL},
     {"+precise",  "left_shift", QT_TRANSLATE_NOOP("binds", "precise aim"),     NULL, NULL},
+    {"!MULTI",    QT_TRANSLATE_NOOP("binds (combination)", "hold down precise"), QT_TRANSLATE_NOOP("binds", "stand still on slippery land"), NULL, NULL},
+    {"!MULTI",    QT_TRANSLATE_NOOP("binds (combination)", "precise + left/right"), QT_TRANSLATE_NOOP("binds", "change direction without moving"), NULL, NULL},
     {"ljump",     "return",     QT_TRANSLATE_NOOP("binds", "long jump"),       NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Traverse gaps and obstacles by jumping:")},
     {"hjump",     "backspace",  QT_TRANSLATE_NOOP("binds", "high jump"),       NULL, NULL},
+    {"!MULTI",    QT_TRANSLATE_NOOP("binds (combination)", "high jump (twice)"), QT_TRANSLATE_NOOP("binds", "backwards jump"), NULL, NULL},
     {"switch",    "tab",        QT_TRANSLATE_NOOP("binds", "switch"),          NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Switch your currently active hog (if possible):")},
+    {"!MULTI",    QT_TRANSLATE_NOOP("binds (combination)", "precise + switch"), QT_TRANSLATE_NOOP("binds", "switch backwards"), NULL, NULL},
     {"ammomenu",  "mouser",     QT_TRANSLATE_NOOP("binds", "ammo menu"),       QT_TRANSLATE_NOOP("binds (categories)", "Weapons"), QT_TRANSLATE_NOOP("binds (descriptions)", "Pick a weapon or utility item:")},
     {"slot 1",    "f1",         QT_TRANSLATE_NOOP("binds", "slot 1"),          NULL, NULL},
     {"slot 2",    "f2",         QT_TRANSLATE_NOOP("binds", "slot 2"),          NULL, NULL},
@@ -39,12 +43,14 @@
     {"slot 8",    "f8",         QT_TRANSLATE_NOOP("binds", "slot 8"),          NULL, NULL},
     {"slot 9",    "f9",         QT_TRANSLATE_NOOP("binds", "slot 9"),          NULL, NULL},
     {"slot :",    "f10",        QT_TRANSLATE_NOOP("binds", "slot 10"),         NULL, NULL},
+    {"setweap ~", "none",       QT_TRANSLATE_NOOP("binds", "unselect weapon"), NULL, NULL},
     {"timer 1",   "1",          QT_TRANSLATE_NOOP("binds", "timer 1 sec"),     NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Set the timer on bombs and timed weapons:")},
     {"timer 2",   "2",          QT_TRANSLATE_NOOP("binds", "timer 2 sec"),     NULL, NULL},
     {"timer 3",   "3",          QT_TRANSLATE_NOOP("binds", "timer 3 sec"),     NULL, NULL},
     {"timer 4",   "4",          QT_TRANSLATE_NOOP("binds", "timer 4 sec"),     NULL, NULL},
     {"timer 5",   "5",          QT_TRANSLATE_NOOP("binds", "timer 5 sec"),     NULL, NULL},
     {"timer_u",   "n",          QT_TRANSLATE_NOOP("binds", "change timer"),    NULL, NULL},
+    {"!MULTI",    QT_TRANSLATE_NOOP("binds (combination)", "precise + timer"), QT_TRANSLATE_NOOP("binds", "change bounciness"), NULL, NULL},
     {"+attack",   "space",      QT_TRANSLATE_NOOP("binds", "attack"),          NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Fire your selected weapon or trigger an utility item:")},
     {"put",       "mousel",     QT_TRANSLATE_NOOP("binds", "put"),             NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Pick a weapon or a target location under the cursor:")},
     {"findhh",    "h",          QT_TRANSLATE_NOOP("binds", "autocam / find hedgehog"),QT_TRANSLATE_NOOP("binds (categories)", "Camera"), QT_TRANSLATE_NOOP("binds (descriptions)", "Toggle automatic camera / refocus on active hedgehog:")},
@@ -55,7 +61,8 @@
 //  {"+cur_m",    "",           QT_TRANSLATE_NOOP("binds", "movement key modifier"),    NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Specify a modifier key to move camera and cursor using your default hog movement keys:")},
     {"zoomin",    "wheelup",    QT_TRANSLATE_NOOP("binds", "zoom in"),         NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Modify the camera's zoom level:")},
     {"zoomout",   "wheeldown",  QT_TRANSLATE_NOOP("binds", "zoom out"),        NULL, NULL},
-    {"zoomreset", "mousem",     QT_TRANSLATE_NOOP("binds", "reset zoom"),      NULL, NULL},
+    {"zoomreset", "mousem",     QT_TRANSLATE_NOOP("binds", "reset zoom to start value"), NULL, NULL},
+    {"!MULTI",    QT_TRANSLATE_NOOP("binds (combination)", "precise + reset zoom"), QT_TRANSLATE_NOOP("binds", "set zoom to 100%"), NULL, NULL},
     {"chat",      "t",          QT_TRANSLATE_NOOP("binds", "chat"),            QT_TRANSLATE_NOOP("binds (categories)", "Miscellaneous"), QT_TRANSLATE_NOOP("binds (descriptions)", "Talk to your clan or all participants:")},
     {"chat team", "u",          QT_TRANSLATE_NOOP("binds", "clan chat"),       NULL, NULL},
     {"history",   "`",          QT_TRANSLATE_NOOP("binds", "chat history"),    NULL, NULL},
@@ -66,12 +73,18 @@
     {"+volup",    "0",          QT_TRANSLATE_NOOP("binds", "volume up"),       NULL, NULL},
     {"mute",      "8",          QT_TRANSLATE_NOOP("binds", "mute audio"),      NULL, NULL},
     {"fullscr",   "f12",        QT_TRANSLATE_NOOP("binds", "change mode"),     NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Toggle fullscreen mode:")},
-    {"capture",   "c",          QT_TRANSLATE_NOOP("binds", "capture"),         NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Take a screenshot:")},
-    {"+speedup",  "s",          QT_TRANSLATE_NOOP("binds", "speed up replay"),         NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Demo replay:")},
+    {"capture",   "c",          QT_TRANSLATE_NOOP("binds", "screenshot"),      NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Take a screenshot:")},
+    {"!MULTI",    QT_TRANSLATE_NOOP("binds (combination)", "precise + screenshot"), QT_TRANSLATE_NOOP("binds", "save map as image"), NULL, NULL},
+    {"+speedup",  "f",          QT_TRANSLATE_NOOP("binds", "speed up replay"),         NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Demo replay:")},
     {"+mission",  "m",          QT_TRANSLATE_NOOP("binds", "show mission information"), NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Heads-up display:")},
+    {"gearinfo",  "o",          QT_TRANSLATE_NOOP("binds", "show object information"), NULL, NULL},
     //: This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen
     {"rotmask",   "delete",     QT_TRANSLATE_NOOP("binds", "toggle team bars"), NULL, NULL},
     {"rottags",   "home",       QT_TRANSLATE_NOOP("binds", "toggle hedgehog tags"), NULL, NULL},
+    {"!MULTI",    QT_TRANSLATE_NOOP("binds (combination)", "precise + toggle hedgehog tags"), QT_TRANSLATE_NOOP("binds", "change hedgehog tag types"), NULL, NULL},
+    {"!MULTI",    QT_TRANSLATE_NOOP("binds (combination)", "switch + toggle hedgehog tags"), QT_TRANSLATE_NOOP("binds", "toggle hedgehog tag translucency"), NULL, NULL},
+
+    {"!MULTI",    QT_TRANSLATE_NOOP("binds (combination)", "precise + switch + toggle hedgehog tags"), QT_TRANSLATE_NOOP("binds", "toggle HUD"), NULL, NULL},
 #ifdef VIDEOREC
     {"record",    "r",          QT_TRANSLATE_NOOP("binds", "record"),          NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Record video:")}
 #endif
--- a/QTfrontend/binds.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/binds.h	Fri Aug 16 10:59:50 2019 -0600
@@ -22,9 +22,9 @@
 #include <QString>
 
 #ifdef VIDEOREC
-#define BINDS_NUMBER 51
+#define BINDS_NUMBER 63
 #else
-#define BINDS_NUMBER 50
+#define BINDS_NUMBER 62
 #endif
 
 struct BindAction
--- a/QTfrontend/campaign.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/campaign.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -52,12 +52,20 @@
     missionInList: QComboBox index of the mission as selected in the mission widget
     teamName: Name of the playing team
 */
-bool isMissionWon(QString & campaignName, int missionInList, QString & teamName)
+bool isCampMissionWon(QString & campaignName, int missionInList, QString & teamName)
 {
     QSettings* teamfile = getCampTeamFile(campaignName, teamName);
     int progress = teamfile->value("Campaign " + campaignName + "/Progress", 0).toInt();
     int unlockedMissions = teamfile->value("Campaign " + campaignName + "/UnlockedMissions", 0).toInt();
-    if(progress>0 && unlockedMissions==0)
+    // The CowardMode cheat unlocks all campaign missions,
+    // but as "punishment", none of them will be marked as completed.
+    // Added to make it easier to test campaigns.
+    bool cheat = teamfile->value("Team/CowardMode", false).toBool();
+    if(cheat)
+    {
+        return false;
+    }
+    else if(progress>0 && unlockedMissions==0)
     {
         QSettings campfile("physfs://Missions/Campaign/" + campaignName + "/campaign.ini", QSettings::IniFormat, 0);
         campfile.setIniCodec("UTF-8");
@@ -79,7 +87,8 @@
 {
     QSettings* teamfile = getCampTeamFile(campaignName, teamName);
     bool won = teamfile->value("Campaign " + campaignName + "/Won", false).toBool();
-    return won;
+    bool cheat = teamfile->value("Team/CowardMode", false).toBool();
+    return won && !cheat;
 }
 
 QSettings* getCampMetaInfo()
@@ -118,13 +127,18 @@
 
     int progress = teamfile->value("Campaign " + campaignName + "/Progress", 0).toInt();
     int unlockedMissions = teamfile->value("Campaign " + campaignName + "/UnlockedMissions", 0).toInt();
+    bool cheat = teamfile->value("Team/CowardMode", false).toBool();
 
     QSettings campfile("physfs://Missions/Campaign/" + campaignName + "/campaign.ini", QSettings::IniFormat, 0);
     campfile.setIniCodec("UTF-8");
 
     QSettings* m_info = getCampMetaInfo();
 
-    if(progress >= 0 && unlockedMissions == 0)
+    if(cheat)
+    {
+        progress = campfile.value("MissionNum", 1).toInt();
+    }
+    if((progress >= 0 && unlockedMissions == 0) || cheat)
     {
         for(unsigned int i = progress + 1; i > 0; i--)
         {
--- a/QTfrontend/campaign.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/campaign.h	Fri Aug 16 10:59:50 2019 -0600
@@ -36,7 +36,7 @@
 QSettings* getCampTeamFile(QString & campaignName, QString & teamName);
 QSettings* getCampMetaInfo();
 bool isCampWon(QString & campaignName, QString & teamName);
-bool isMissionWon(QString & campaignName, int missionInList, QString & teamName);
+bool isCampMissionWon(QString & campaignName, int missionInList, QString & teamName);
 QString getRealCampName(const QString & campaignName);
 QList<MissionInfo> getCampMissionList(QString & campaignName, QString & teamName);
 
--- a/QTfrontend/game.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/game.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -29,6 +29,8 @@
 
 #include "hwform.h"
 #include "ui/page/pageoptions.h"
+#include "ui/page/pagetraining.h"
+#include "ui/page/pagecampaign.h"
 #include "game.h"
 #include "hwconsts.h"
 #include "gameuiconfig.h"
@@ -44,15 +46,14 @@
 // last game info
 QList<QVariant> lastGameStartArgs = QList<QVariant>();
 GameType lastGameType = gtNone;
-QString lastTrainingSubFolder = NULL;
 GameCFGWidget * lastGameCfg = NULL;
 QString lastGameAmmo = NULL;
 TeamSelWidget * lastGameTeamSel = NULL;
 
-QString training, campaign, campaignScript, campaignTeam; // TODO: Cleaner solution?
+QString trainingName, trainingScript, trainingTeam, campaign, campaignScript, campaignTeam; // TODO: Cleaner solution?
 
 HWGame::HWGame(GameUIConfig * config, GameCFGWidget * gamecfg, QString ammo, TeamSelWidget* pTeamSelWidget) :
-    TCPBase(true, 0),
+    TCPBase(true, !config->language().isEmpty(), 0),
     ammostr(ammo),
     m_pTeamSelWidget(pTeamSelWidget)
 {
@@ -75,22 +76,29 @@
 
 void HWGame::onClientDisconnect()
 {
-    switch (gameType)
+    if (demoIsPresent)
     {
-        case gtDemo:
-            // for video recording we need demo anyway
-            emit HaveRecord(rtNeither, demo);
-            break;
-        case gtNet:
-            emit HaveRecord(rtDemo, demo);
-            break;
-        default:
-            if (gameState == gsInterrupted || gameState == gsHalted)
-                emit HaveRecord(rtSave, demo);
-            else if (gameState == gsFinished)
+        switch (gameType)
+        {
+            case gtDemo:
+                // for video recording we need demo anyway
+                emit HaveRecord(rtNeither, demo);
+                break;
+            case gtNet:
                 emit HaveRecord(rtDemo, demo);
-            else
-                emit HaveRecord(rtNeither, demo);
+                break;
+            default:
+                if (gameState == gsInterrupted || gameState == gsHalted)
+                    emit HaveRecord(rtSave, demo);
+                else if (gameState == gsFinished)
+                    emit HaveRecord(rtDemo, demo);
+                else
+                    emit HaveRecord(rtNeither, demo);
+        }
+    }
+    else
+    {
+        emit HaveRecord(rtNeither, demo);
     }
     SetGameState(gsStopped);
 }
@@ -139,37 +147,196 @@
 
 void HWGame::SendQuickConfig()
 {
+    /* Load and increase Quick Game experience level.
+    Experience increases by 1 for each started game and maxes out
+    at 20. Low experience levels will introduce a "beginner's bias" to make
+    the first quick games easier and simpler. The max. possible difficulty
+    increases progressively the longer you play.
+    If experience is maxed out, the beginner's bias is gone and quick games
+    are completely random. */
+    int exp = config->quickGameExperience();
+    if(exp < 20)
+    {
+       config->setQuickGameExperience(exp + 1);
+    }
+    qDebug("Starting quick game ...");
+    qDebug("Quick Game experience level: %d", exp);
+
+    // Init stuff
     QByteArray teamscfg;
     QAbstractItemModel * themeModel = DataManager::instance().themeModel()->withoutHidden();
 
     HWProto::addStringToBuffer(teamscfg, "TL");
-    HWProto::addStringToBuffer(teamscfg, QString("etheme %1")
-                               .arg((themeModel->rowCount() > 0) ? themeModel->index(rand() % themeModel->rowCount(), 0).data(ThemeModel::ActualNameRole).toString() : "Nature"));
+
+    // Random seed
     HWProto::addStringToBuffer(teamscfg, "eseed " + QUuid::createUuid().toString());
 
-    HWProto::addStringToBuffer(teamscfg, "e$template_filter 2");
-    HWProto::addStringToBuffer(teamscfg, "e$feature_size "+QString::number(rand()%18+4));
+    int r, minhogs, maxhogs;
 
+    // Random map type
+    r = rand() % 10000;
+    if(r < 3000) { // 30%
+        // Random
+        r = 0;
+    } else if(r < 5250) { // 22.5%
+        // Maze
+        if(exp <= 3)
+            r = 0;
+        else
+            r = 1;
+    } else if(r < 7490) { // 22.4%
+        // Perlin
+        if(exp <= 7)
+            r = 1;
+        else
+            r = 2;
+    } else if(r < 7500 && exp >= 5) { // 0.1%
+        // Floating Flowers (just for fun)
+        r = 5;
+    } else if(r < 8750) { // 12.5%
+        // Image map
+        r = 3;
+    } else { // 12.5%
+        // Forts
+        r = 4;
+    }
+    switch(r)
+    {
+        // Random map
+        default:
+        case 0: {
+            r = rand() % 3;
+            if(r == 0)
+            {
+                // small island
+                HWProto::addStringToBuffer(teamscfg, "e$template_filter 1");
+                minhogs = 3;
+                maxhogs = 4;
+            }
+            else if(r == 1 || exp <= 6)
+            {
+                // medium island
+                HWProto::addStringToBuffer(teamscfg, "e$template_filter 2");
+                minhogs = 4;
+                maxhogs = 5;
+            }
+            else
+            {
+                // cave (locked at low experience because these maps can be huge)
+                HWProto::addStringToBuffer(teamscfg, "e$template_filter 4");
+                minhogs = 4;
+                maxhogs = 6;
+            }
+            HWProto::addStringToBuffer(teamscfg, "e$feature_size "+QString::number(rand()%18+4));
+            break;
+        }
+        // Maze
+        case 1: {
+            minhogs = 4;
+            maxhogs = 6;
+            HWProto::addStringToBuffer(teamscfg, "e$mapgen 1");
+            HWProto::addStringToBuffer(teamscfg, "e$template_filter "+QString::number(rand()%6));
+            HWProto::addStringToBuffer(teamscfg, "e$feature_size "+QString::number(rand()%16+6));
+            break;
+        }
+        // Perlin
+        case 2: {
+            minhogs = 4;
+            maxhogs = 6;
+            HWProto::addStringToBuffer(teamscfg, "e$mapgen 2");
+            HWProto::addStringToBuffer(teamscfg, "e$template_filter "+QString::number(rand()%6));
+            HWProto::addStringToBuffer(teamscfg, "e$feature_size "+QString::number(rand()%18+4));
+            break;
+        }
+        // Image map
+        case 3: {
+            minhogs = 4;
+            maxhogs = 6;
+            HWProto::addStringToBuffer(teamscfg, "e$mapgen 3");
+            // Select map from hardcoded list.
+            // TODO: find a more dynamic solution.
+            r = rand() % cQuickGameMaps.count();
+            HWProto::addStringToBuffer(teamscfg, "e$map " + cQuickGameMaps[r]);
+            break;
+        }
+        // Forts
+        case 4: {
+            minhogs = 4;
+            maxhogs = 6;
+            HWProto::addStringToBuffer(teamscfg, "e$mapgen 4");
+            HWProto::addStringToBuffer(teamscfg, "e$feature_size "+QString::number(rand()%20+1));
+            break;
+        }
+        // Floating Flowers
+        // (actually empty map; this forces the engine to generate fallback structures to have
+        // something for hogs to stand on)
+        case 5: {
+            minhogs = 4;
+            maxhogs = 8;
+            HWProto::addStringToBuffer(teamscfg, "e$mapgen 3");
+            HWProto::addStringToBuffer(teamscfg, "e$feature_size "+QString::number(rand()%4+3));
+            break;
+        }
+    }
+
+    // Theme
+    HWProto::addStringToBuffer(teamscfg, QString("etheme %1")
+        .arg((themeModel->rowCount() > 0) ? themeModel->index(rand() % themeModel->rowCount(), 0).data(ThemeModel::ActualNameRole).toString() : "Nature"));
+
+    int hogs = minhogs + rand() % (maxhogs-minhogs+1);
+    // Cap hog count at low experience
+    if((exp <= 8) && (hogs > 5))
+        hogs = 5;
+    else if((exp <= 5) && (hogs > 4))
+        hogs = 4;
+
+    // Teams
+    // Player team
     HWTeam team1;
     team1.setDifficulty(0);
     team1.setColor(0);
-    team1.setNumHedgehogs(4);
+    team1.setNumHedgehogs(hogs);
     HWNamegen::teamRandomEverything(team1);
-    team1.setVoicepack("Default");
-    HWProto::addStringListToBuffer(teamscfg,
-                                   team1.teamGameConfig(100));
+    team1.setVoicepack("Default_qau");
 
+    // Computer team
     HWTeam team2;
-    team2.setDifficulty(4);
+    // Random difficulty.
+    // Max. possible difficulty is capped at low experience levels.
+    if(exp >= 15) // very easy to very hard (full range)
+        r = 5 - rand() % 5;
+    else if(exp >= 9) // very easy to hard
+        r = 5 - rand() % 4;
+    else if(exp >= 6) // very easy to medium
+        r = 5 - rand() % 3;
+    else if(exp >= 2) // very easy to easy
+        r = 5 - rand() % 2;
+    else // very easy
+        r = 5;
+    team2.setDifficulty(r);
     team2.setColor(1);
-    team2.setNumHedgehogs(4);
+    team2.setNumHedgehogs(hogs);
+    // Make sure the team names are not equal
     do
         HWNamegen::teamRandomEverything(team2);
     while(!team2.name().compare(team1.name()) || !team2.hedgehog(0).Hat.compare(team1.hedgehog(0).Hat));
-    team2.setVoicepack("Default");
-    HWProto::addStringListToBuffer(teamscfg,
-                                   team2.teamGameConfig(100));
+    team2.setVoicepack("Default_qau");
 
+    // Team play order
+    r = rand() % 2;
+    if(r == 0 || exp <= 4) // player plays first
+    {
+        HWProto::addStringListToBuffer(teamscfg, team1.teamGameConfig(100));
+        HWProto::addStringListToBuffer(teamscfg, team2.teamGameConfig(100));
+    }
+    else // computer plays first
+    {
+        HWProto::addStringListToBuffer(teamscfg, team2.teamGameConfig(100));
+        HWProto::addStringListToBuffer(teamscfg, team1.teamGameConfig(100));
+    }
+
+    // Ammo scheme "Default"
+    // TODO: Random schemes
     HWProto::addStringToBuffer(teamscfg, QString("eammloadt %1").arg(cDefaultAmmoStore->mid(0, cAmmoNumber)));
     HWProto::addStringToBuffer(teamscfg, QString("eammprob %1").arg(cDefaultAmmoStore->mid(cAmmoNumber, cAmmoNumber)));
     HWProto::addStringToBuffer(teamscfg, QString("eammdelay %1").arg(cDefaultAmmoStore->mid(2 * cAmmoNumber, cAmmoNumber)));
@@ -184,8 +351,16 @@
 {
     QByteArray traincfg;
     HWProto::addStringToBuffer(traincfg, "TL");
+
+    HWTeam missionTeam = HWTeam();
+    missionTeam.setName(config->Form->ui.pageTraining->CBTeam->currentText());
+    missionTeam.loadFromFile();
+    missionTeam.setNumHedgehogs(HEDGEHOGS_PER_TEAM);
+    missionTeam.setMissionTeam(true);
+    HWProto::addStringListToBuffer(traincfg, missionTeam.teamGameConfig(100));
+
     HWProto::addStringToBuffer(traincfg, "eseed " + QUuid::createUuid().toString());
-    HWProto::addStringToBuffer(traincfg, "escript " + training);
+    HWProto::addStringToBuffer(traincfg, "escript " + trainingScript);
 
     RawSendIPC(traincfg);
 }
@@ -194,8 +369,15 @@
 {
     QByteArray campaigncfg;
     HWProto::addStringToBuffer(campaigncfg, "TL");
+
+    HWTeam missionTeam = HWTeam();
+    missionTeam.setName(config->Form->ui.pageCampaign->CBTeam->currentText());
+    missionTeam.loadFromFile();
+    missionTeam.setNumHedgehogs(HEDGEHOGS_PER_TEAM);
+    missionTeam.setMissionTeam(true);
+    HWProto::addStringListToBuffer(campaigncfg, missionTeam.teamGameConfig(100));
+
     HWProto::addStringToBuffer(campaigncfg, "eseed " + QUuid::createUuid().toString());
-
     HWProto::addStringToBuffer(campaigncfg, "escript " + campaignScript);
 
     RawSendIPC(campaigncfg);
@@ -277,6 +459,11 @@
             SetGameState(gsFinished);
             break;
         }
+        case 'm':
+        {
+            SetDemoPresence(false);
+            break;
+        }
         case 'H':
         {
             SetGameState(gsHalted);
@@ -288,7 +475,7 @@
             QString msgbody = QString::fromUtf8(msg.mid(2).left(size - 4));
             emit SendChat(msgbody);
             QByteArray buf;
-            HWProto::addStringToBuffer(buf, "s" + HWProto::formatChatMsg(config->netNick(), msgbody));
+            HWProto::addStringToBuffer(buf, "s" + HWProto::formatChatMsg(config->netNick(), msgbody) + "\x20\x20");
             demo.append(buf);
             break;
         }
@@ -307,14 +494,33 @@
                 writeCampaignVar(msg.right(msg.size() - 3));
             break;
         }
+        case 'v':
+        {
+            if (msg.at(2) == '?')
+                sendMissionVar(msg.right(msg.size() - 3));
+            else if (msg.at(2) == '!')
+                writeMissionVar(msg.right(msg.size() - 3));
+            break;
+        }
         case 'W':
         {
             // fetch new window resolution via IPC and save it in the settings
             int size = msg.size();
             QString newResolution = QString().append(msg.mid(2)).left(size - 4);
+            bool windowMaximized;
+            if (newResolution.endsWith('M'))
+            {
+                windowMaximized = true;
+                newResolution.chop(1);
+            }
+            else
+            {
+                windowMaximized = false;
+            }
             QStringList wh = newResolution.split('x');
             config->Form->ui.pageOptions->windowWidthEdit->setValue(wh[0].toInt());
             config->Form->ui.pageOptions->windowHeightEdit->setValue(wh[1].toInt());
+            config->vid_SetMaximized(windowMaximized);
             break;
         }
         case '~':
@@ -342,21 +548,21 @@
 void HWGame::FromNetChat(const QString & msg)
 {
     QByteArray buf;
-    HWProto::addStringToBuffer(buf, 's' + msg);
+    HWProto::addStringToBuffer(buf, 's' + msg + "\x20\x20");
     RawSendIPC(buf);
 }
 
 void HWGame::FromNetWarning(const QString & msg)
 {
     QByteArray buf;
-    HWProto::addStringToBuffer(buf, "s\x00" + msg);
+    HWProto::addStringToBuffer(buf, "s\x00" + msg + "\x20\x20");
     RawSendIPC(buf);
 }
 
 void HWGame::FromNetError(const QString & msg)
 {
     QByteArray buf;
-    HWProto::addStringToBuffer(buf, "s\x05" + msg);
+    HWProto::addStringToBuffer(buf, "s\x05" + msg + "\x20\x20");
     RawSendIPC(buf);
 }
 
@@ -414,6 +620,12 @@
     arguments << QString::number(resolutions.second.width());
     arguments << "--height";
     arguments << QString::number(resolutions.second.height());
+    if (config->vid_Maximized())
+        arguments << "--maximized";
+    if (config->zoom() != 100) {
+        arguments << "--zoom";
+        arguments << QString::number(config->zoom());
+    }
     arguments << "--raw-quality";
     arguments << QString::number(config->translateQuality());
     arguments << "--stereo";
@@ -443,6 +655,8 @@
         arguments << "--no-healthtag";
     if (config->Form->ui.pageOptions->CBTagOpacity->isChecked())
         arguments << "--translucent-tags";
+    if (!config->isHolidaySillinessEnabled())
+        arguments << "--no-holiday-silliness";
 
     return arguments;
 }
@@ -467,6 +681,19 @@
     SetGameState(gsStarted);
 }
 
+void HWGame::PlayOfficialServerDemo()
+{
+    // TODO: Use gtDemo so fast-forward is available.
+    // Needs engine support first.
+    lastGameStartArgs.clear();
+    lastGameType = gtLocal;
+
+    gameType = gtLocal;
+    demo.clear();
+    Start(false);
+    SetGameState(gsStarted);
+}
+
 void HWGame::StartNet()
 {
     lastGameStartArgs.clear();
@@ -500,16 +727,19 @@
     SetGameState(gsStarted);
 }
 
-void HWGame::StartTraining(const QString & file, const QString & subFolder)
+void HWGame::StartTraining(const QString & file, const QString & subFolder, const QString & trainTeam)
 {
     lastGameStartArgs.clear();
     lastGameStartArgs.append(file);
+    lastGameStartArgs.append(subFolder);
+    lastGameStartArgs.append(trainTeam);
     lastGameType = gtTraining;
-    lastTrainingSubFolder = subFolder;
 
     gameType = gtTraining;
 
-    training = "Missions/" + subFolder + "/" + file + ".lua";
+    trainingScript  = "Missions/" + subFolder + "/" + file + ".lua";
+    trainingName = file;
+    trainingTeam = trainTeam;
     demo.clear();
     Start(false);
     SetGameState(gsStarted);
@@ -538,10 +768,19 @@
     emit GameStateChanged(state);
     if (gameType == gtCampaign)
     {
-      emit CampStateChanged(1);
+        emit CampStateChanged(state);
+    }
+    else if (gameType == gtTraining)
+    {
+        emit TrainingStateChanged(1);
     }
 }
 
+void HWGame::SetDemoPresence(bool hasDemo)
+{
+    emit DemoPresenceChanged(hasDemo);
+}
+
 void HWGame::abort()
 {
     QByteArray buf;
@@ -574,3 +813,28 @@
     teamfile.setValue("Campaign " + campaign + "/" + varToWrite, varValue);
 }
 
+void HWGame::sendMissionVar(const QByteArray &varToSend)
+{
+    QString varToFind = QString::fromUtf8(varToSend);
+    QSettings teamfile(QString(cfgdir->absolutePath() + "/Teams/%1.hwt").arg(trainingTeam), QSettings::IniFormat, 0);
+    teamfile.setIniCodec("UTF-8");
+    QString varValue = teamfile.value("Mission " + trainingName + "/" + varToFind, "").toString();
+    QByteArray command;
+    HWProto::addStringToBuffer(command, "v." + varValue);
+    RawSendIPC(command);
+}
+
+void HWGame::writeMissionVar(const QByteArray & varVal)
+{
+    int i = varVal.indexOf(" ");
+    if(i < 0)
+        return;
+
+    QString varToWrite = QString::fromUtf8(varVal.left(i));
+    QString varValue = QString::fromUtf8(varVal.mid(i + 1));
+
+    QSettings teamfile(QString(cfgdir->absolutePath() + "/Teams/%1.hwt").arg(trainingTeam), QSettings::IniFormat, 0);
+    teamfile.setIniCodec("UTF-8");
+    teamfile.setValue("Mission " + trainingName + "/" + varToWrite, varValue);
+}
+
--- a/QTfrontend/game.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/game.h	Fri Aug 16 10:59:50 2019 -0600
@@ -64,7 +64,6 @@
 // last game info
 extern QList<QVariant> lastGameStartArgs;
 extern GameType lastGameType;
-extern QString lastTrainingSubFolder;
 extern GameCFGWidget * lastGameCfg;
 extern QString lastGameAmmo;
 extern TeamSelWidget * lastGameTeamSel;
@@ -77,10 +76,11 @@
         virtual ~HWGame();
         void AddTeam(const QString & team);
         void PlayDemo(const QString & demofilename, bool isSave);
+        void PlayOfficialServerDemo();
         void StartLocal();
         void StartQuick();
         void StartNet();
-        void StartTraining(const QString & file, const QString & subFolder);
+        void StartTraining(const QString & file, const QString & subFolder, const QString & trainTeam);
         void StartCampaign(const QString & camp, const QString & campScript, const QString & campTeam);
         void abort();
         GameState gameState;
@@ -96,10 +96,12 @@
         void SendChat(const QString & msg);
         void SendTeamMessage(const QString & msg);
         void GameStateChanged(GameState gameState);
+        void DemoPresenceChanged(bool hasDemo);
         void GameStats(char type, const QString & info);
         void HaveRecord(RecordType type, const QByteArray & record);
         void ErrorMessage(const QString &);
         void CampStateChanged(int);
+        void TrainingStateChanged(int);
         void SendConsoleCommand(const QString & command);
 
     public slots:
@@ -125,8 +127,11 @@
         void SendCampaignConfig();
         void ParseMessage(const QByteArray & msg);
         void SetGameState(GameState state);
+        void SetDemoPresence(bool hasDemo);
         void sendCampaignVar(const QByteArray & varToSend);
         void writeCampaignVar(const QByteArray &varVal);
+        void sendMissionVar(const QByteArray & varToSend);
+        void writeMissionVar(const QByteArray &varVal);
         void flushNetBuffer();
 };
 
--- a/QTfrontend/gameuiconfig.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/gameuiconfig.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -93,6 +93,7 @@
     QString heightStr = QString::number(screenSize.height());
     QString wWidth = value("video/windowedWidth", widthStr).toString();
     QString wHeight = value("video/windowedHeight", heightStr).toString();
+    pIsEngineWindowMaximized = value("video/windowedMaximized", false).toBool();
     // If left blank reset the resolution to the default
     wWidth = (wWidth == "" ? widthStr : wWidth);
     wHeight = (wHeight == "" ? heightStr : wHeight);
@@ -105,6 +106,7 @@
     Form->ui.pageOptions->CBFrontendFullscreen->setChecked(ffscr);
 
     Form->ui.pageOptions->SLQuality->setValue(value("video/quality", 5).toUInt());
+    Form->ui.pageOptions->SLZoom->setValue(value("video/zoom", 100).toUInt());
     Form->ui.pageOptions->CBStereoMode->setCurrentIndex(value("video/stereo", 0).toUInt());
     Form->ui.pageOptions->CBFrontendEffects->setChecked(value("frontend/effects", true).toBool());
     Form->ui.pageOptions->CBSound->setChecked(value("audio/sound", true).toBool());
@@ -114,7 +116,7 @@
     Form->ui.pageOptions->CBDampenAudio->setChecked(value("audio/dampen", true).toBool());
     Form->ui.pageOptions->SLVolume->setValue(value("audio/volume", 100).toUInt());
 
-    QString netNick = value("net/nick", tr("Guest")+QString("%1").arg(rand())).toString();
+    QString netNick = value("net/nick", getRandomNick()).toString();
     Form->ui.pageOptions->editNetNick->setText(netNick);
     bool savePwd = value("net/savepassword",true).toBool();
     Form->ui.pageOptions->CBSavePassword->setChecked(savePwd);
@@ -229,6 +231,10 @@
     const QRect deskSize = HWApplication::desktop()->screenGeometry(-1);
     Form->resize(value("frontend/width", qMin(qMax(deskSize.width()*2/3,800),deskSize.width())).toUInt(),
                  value("frontend/height", qMin(qMax(deskSize.height()*2/3,600),deskSize.height())).toUInt());
+    if(value("frontend/maximized", false) == true)
+        Form->setWindowState(Form->windowState() | Qt::WindowMaximized);
+    else
+        Form->setWindowState(Form->windowState() & ~Qt::WindowMaximized);
 
     // move the window to the center of the screen
     QPoint center = HWApplication::desktop()->availableGeometry(-1).center();
@@ -242,9 +248,11 @@
     setValue("video/fullscreenResolution", Form->ui.pageOptions->CBResolution->currentText());
     setValue("video/windowedWidth", Form->ui.pageOptions->windowWidthEdit->value());
     setValue("video/windowedHeight", Form->ui.pageOptions->windowHeightEdit->value());
+    setValue("video/windowedMaximized", vid_Maximized());
     setValue("video/fullscreen", vid_Fullscreen());
 
     setValue("video/quality", Form->ui.pageOptions->SLQuality->value());
+    setValue("video/zoom", Form->ui.pageOptions->SLZoom->value());
     setValue("video/stereo", stereoMode());
 
     setValue("frontend/effects", isFrontendEffects());
@@ -258,6 +266,7 @@
     {
         setValue("frontend/width", Form->width());
         setValue("frontend/height", Form->height());
+        setValue("frontend/maximized", (Form->windowState() & Qt::WindowMaximized) != 0);
     }
     else
     {
@@ -377,6 +386,16 @@
         return result.second;
 }
 
+bool GameUIConfig::vid_Maximized()
+{
+    return pIsEngineWindowMaximized;
+}
+
+void GameUIConfig::vid_SetMaximized(bool isMaximized)
+{
+    pIsEngineWindowMaximized = isMaximized;
+}
+
 bool GameUIConfig::vid_Fullscreen()
 {
     return Form->ui.pageOptions->CBFullscreen->isChecked();
@@ -441,6 +460,26 @@
     return Form->ui.pageOptions->CBFrontendFullscreen->isChecked();
 }
 
+quint16 GameUIConfig::zoom()
+{
+    return Form->ui.pageOptions->SLZoom->value();
+}
+
+bool GameUIConfig::isHolidaySillinessEnabled() const
+{
+    return value("misc/holidaySilliness", true).toBool();
+}
+
+int GameUIConfig::quickGameExperience() const
+{
+    return value("misc/quickGameExperience", 0).toInt();
+}
+
+void GameUIConfig::setQuickGameExperience(int exp)
+{
+    setValue("misc/quickGameExperience", exp);
+}
+
 bool GameUIConfig::isSoundEnabled()
 {
     return Form->ui.pageOptions->CBSound->isChecked();
@@ -505,6 +544,16 @@
     Form->ui.pageOptions->editNetNick->setText(value("net/nick", "").toString());
 }
 
+QString GameUIConfig::getRandomNick()
+{
+    // Generate random nick name or pick old one if one was already generated.
+    QString nick;
+    if (cachedRandomNick.isNull())
+        // "Guest" + number between 1 and 99999
+        cachedRandomNick = tr("Guest") + QString("%1").arg(rand() % 99999 + 1);
+    return cachedRandomNick;
+}
+
 QByteArray GameUIConfig::netPasswordHash()
 {
     return QCryptographicHash::hash(Form->ui.pageOptions->editNetPassword->text().toUtf8(), QCryptographicHash::Md5).toHex();
--- a/QTfrontend/gameuiconfig.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/gameuiconfig.h	Fri Aug 16 10:59:50 2019 -0600
@@ -40,6 +40,8 @@
         QStringList GetTeamsList();
         QRect vid_Resolution();
         std::pair<QRect, QRect> vid_ResolutionPair();
+        bool vid_Maximized();
+        void vid_SetMaximized(bool isMaximized);
         bool vid_Fullscreen();
         quint32 translateQuality();
         bool isSoundEnabled();
@@ -54,6 +56,7 @@
         quint8 volume();
         quint8 timerInterval();
         QString netNick();
+        QString getRandomNick();
         QByteArray netPasswordHash();
         int netPasswordLength();
         void clearPasswordHash();
@@ -66,6 +69,10 @@
         bool isReducedQuality() const;
         bool isFrontendEffects() const;
         bool isFrontendFullscreen() const;
+        quint16 zoom();
+        bool isHolidaySillinessEnabled() const;
+        int quickGameExperience() const;
+        void setQuickGameExperience(int exp);
         void resizeToConfigValues();
         quint32 stereoMode() const;
         void setValue(const QString & key, const QVariant & value);
@@ -102,6 +109,9 @@
         QList<BindAction> m_binds;
 
         void applyProxySettings();
+        bool pIsEngineWindowMaximized;
+
+        QString cachedRandomNick;
 };
 
 #endif
--- a/QTfrontend/hedgewars.qrc	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/hedgewars.qrc	Fri Aug 16 10:59:50 2019 -0600
@@ -1,6 +1,7 @@
 <RCC>
     <qresource prefix="/">
         <file alias="Ammos.png">../share/hedgewars/Data/Graphics/AmmoMenu/Ammos_base.png</file>
+        <file alias="keys.csv">../share/hedgewars/Data/misc/keys.csv</file>
         <file>res/css/qt.css</file>
         <file>res/css/chat.css</file>
         <file>res/css/christmas.css</file>
@@ -39,11 +40,14 @@
         <file>res/Hedgehog.png</file>
         <file>res/net.png</file>
         <file>res/About.png</file>
+        <file>res/AboutIcon.png</file>
         <file>res/SimpleGame.png</file>
         <file>res/Campaign.png</file>
         <file>res/CampaignDefault.png</file>
         <file>res/Multiplayer.png</file>
         <file>res/Trainings.png</file>
+        <file>res/Challenges.png</file>
+        <file>res/Scenarios.png</file>
         <file>res/Background.png</file>
         <file>res/BackgroundChristmas.png</file>
         <file>res/BackgroundEaster.png</file>
@@ -61,6 +65,8 @@
         <file>res/dropdown.png</file>
         <file>res/dropdown_disabled.png</file>
         <file>res/dropdown_selected.png</file>
+        <file>res/keyconflict.png</file>
+        <file>res/keyconflict_selected.png</file>
         <file>res/new.png</file>
         <file>res/edit.png</file>
         <file>res/delete.png</file>
@@ -97,6 +103,10 @@
         <file>res/panelbg.png</file>
         <file>res/lightbulb_on.png</file>
         <file>res/lightbulb_off.png</file>
+        <file>res/scroll_up.png</file>
+        <file>res/scroll_down.png</file>
+        <file>res/scroll_left.png</file>
+        <file>res/scroll_right.png</file>
         <file>res/spin_up.png</file>
         <file>res/spin_up_disabled.png</file>
         <file>res/spin_down.png</file>
@@ -206,10 +216,13 @@
         <file>res/chat/lamp_off.png</file>
         <file>res/chat/ingame.png</file>
         <file>res/splash.png</file>
-        <file>res/html/about.html</file>
+        <file>res/credits.csv</file>
         <file>res/chat/hedgehogcontributor.png</file>
         <file>res/chat/hedgehogcontributor_gray.png</file>
         <file>res/chat/roomadmincontributor.png</file>
         <file>res/chat/roomadmincontributor_gray.png</file>
     </qresource>
+    <qresource lang="en">
+        <file alias="res/Trainings.png">res/Trainings_en.png</file>
+    </qresource>
 </RCC>
--- a/QTfrontend/hwconsts.cpp.in	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/hwconsts.cpp.in	Fri Aug 16 10:59:50 2019 -0600
@@ -34,6 +34,8 @@
 QString * cRevisionString = new QString("${HEDGEWARS_REVISION}");
 QString * cHashString = new QString("${HEDGEWARS_HASH}");
 
+// For disallowing some characters that would screw up file name
+QString * cSafeFileNameRegExp = new QString("[^:/\\\\]*");
 
 QDir * bindir = new QDir();
 QDir * cfgdir = new QDir();
@@ -45,6 +47,7 @@
 int cMaxTeams = 8;
 int cMaxHHs = HEDGEHOGS_PER_TEAM * cMaxTeams;
 int cMinServerVersion = 3;
+unsigned char cInvertTextColorAt = 64;
 
 QString * cDefaultAmmoStore = new QString( AMMOLINE_DEFAULT_QT AMMOLINE_DEFAULT_PROB
                                            AMMOLINE_DEFAULT_DELAY AMMOLINE_DEFAULT_CRATE );
@@ -93,6 +96,33 @@
             AMMOLINE_HEDGEEDITOR_DELAY AMMOLINE_HEDGEEDITOR_CRATE ))
         ;
 
+QStringList cQuickGameMaps = QStringList()
+    << "Bamboo"
+    << "Bath"
+    << "Battlefield"
+    << "Blox"
+    << "Bubbleflow"
+    << "Cake"
+    << "Castle"
+    << "Cheese"
+    << "Cogs"
+    << "CrazyMission"
+    << "EarthRise"
+    << "Eyes"
+    << "Hammock"
+    << "HedgeFortress"
+    << "Hedgelove"
+    << "Hedgewars"
+    << "Hydrant"
+    << "Lonely_Island"
+    << "Mushrooms"
+    << "Octorama"
+    << "PirateFlag"
+    << "Plane"
+    << "Sheep"
+    << "Trash"
+    << "Tree";
+
 unsigned int colors[] = HW_TEAMCOLOR_ARRAY;
 
 QString * netHost = new QString();
--- a/QTfrontend/hwconsts.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/hwconsts.h	Fri Aug 16 10:59:50 2019 -0600
@@ -28,6 +28,7 @@
 extern QString * cRevisionString;
 extern QString * cHashString;
 extern QString * cDataDir;
+extern QString * cSafeFileNameRegExp;
 
 extern QDir * bindir;
 extern QDir * cfgdir;
@@ -39,6 +40,7 @@
 extern int cMaxTeams;
 extern int cMaxHHs;
 extern int cMinServerVersion;
+extern unsigned char cInvertTextColorAt;
 
 class QStandardItemModel;
 
@@ -46,6 +48,7 @@
 extern QString * cEmptyAmmoStore;
 extern int cAmmoNumber;
 extern QList< QPair<QString, QString> > cDefaultAmmos;
+extern QStringList cQuickGameMaps;
 
 extern unsigned int colors[];
 
--- a/QTfrontend/hwform.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/hwform.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -57,6 +57,7 @@
 #include "hwform.h"
 #include "game.h"
 #include "team.h"
+#include "mission.h"
 #include "campaign.h"
 #include "teamselect.h"
 #include "selectWeapon.h"
@@ -128,6 +129,7 @@
 // I started handing this down to each place it touches, but it was getting ridiculous
 // and this one flag does not warrant a static class
 bool frontendEffects = true;
+bool demoIsPresent = true;
 QString playerHash;
 
 QIcon finishedIcon;
@@ -167,7 +169,10 @@
 
     config = new GameUIConfig(this, DataManager::instance().settingsFileName());
     frontendEffects = config->value("frontend/effects", true).toBool();
-    playerHash = QString(QCryptographicHash::hash(config->value("net/nick",tr("Guest")+QString("%1").arg(rand())).toString().toUtf8(), QCryptographicHash::Md5).toHex());
+    bool frontendSounds = config->value("frontend/sound", true).toBool();
+    onFrontendSoundsToggled(frontendSounds);
+
+    playerHash = QString(QCryptographicHash::hash(config->value("net/nick", config->getRandomNick()).toString().toUtf8(), QCryptographicHash::Md5).toHex());
 
     // Icons for finished missions
     finishedIcon.addFile(":/res/missionFinished.png", QSize(), QIcon::Normal, QIcon::On);
@@ -218,6 +223,7 @@
     previousTeamName = "";
     UpdateTeamsLists();
     InitCampaignPage();
+    RestoreSingleplayerTeamSelection();
     UpdateCampaignPage(0);
     UpdateCampaignPageTeam(0);
     UpdateCampaignPageMission(0);
@@ -240,6 +246,9 @@
 
     connect(ui.pageMain->BtnFeedback, SIGNAL(clicked()), this, SLOT(showFeedbackDialog()));
 
+    connect(ui.pageMain->BtnTitle, SIGNAL(clicked()), pageSwitchMapper, SLOT(map()));
+    pageSwitchMapper->setMapping(ui.pageMain->BtnTitle, ID_PAGE_INFO);
+
     connect(ui.pageMain->BtnInfo, SIGNAL(clicked()), pageSwitchMapper, SLOT(map()));
     pageSwitchMapper->setMapping(ui.pageMain->BtnInfo, ID_PAGE_INFO);
 
@@ -284,12 +293,13 @@
     connect(ui.pageOptions->SchemeNew, SIGNAL(clicked()), this, SLOT(GoToNewScheme()));
     connect(ui.pageOptions->SchemeDelete, SIGNAL(clicked()), this, SLOT(DeleteScheme()));
     connect(ui.pageOptions->CBFrontendEffects, SIGNAL(toggled(bool)), this, SLOT(onFrontendEffects(bool)) );
+    connect(ui.pageOptions->CBFrontendSound, SIGNAL(toggled(bool)), this, SLOT(onFrontendSoundsToggled(bool)));
 
     connect(ui.pageNet->BtnSpecifyServer, SIGNAL(clicked()), this, SLOT(NetConnect()));
     connect(ui.pageNet->BtnNetSvrStart, SIGNAL(clicked()), pageSwitchMapper, SLOT(map()));
     pageSwitchMapper->setMapping(ui.pageNet->BtnNetSvrStart, ID_PAGE_NETSERVER);
 
-    connect(ui.pageNet, SIGNAL(connectClicked(const QString &, quint16)), this, SLOT(NetConnectServer(const QString &, quint16)));
+    connect(ui.pageNet, SIGNAL(connectClicked(const QString &, quint16, bool)), this, SLOT(NetConnectServer(const QString &, quint16, bool)));
 
     connect(ui.pageNetServer->BtnStart, SIGNAL(clicked()), this, SLOT(NetStartServer()));
 
@@ -330,6 +340,9 @@
     connect(ui.pageCampaign->CBTeam, SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateCampaignPageTeam(int)));
     connect(ui.pageCampaign->CBCampaign, SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateCampaignPage(int)));
     connect(ui.pageCampaign->CBMission, SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateCampaignPageMission(int)));
+    connect(ui.pageTraining->CBTeam, SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateTrainingPageTeam(int)));
+    connect(ui.pageCampaign->CBTeam, SIGNAL(currentIndexChanged(int)), ui.pageTraining->CBTeam, SLOT(setCurrentIndex(int)));
+    connect(ui.pageTraining->CBTeam, SIGNAL(currentIndexChanged(int)), ui.pageCampaign->CBTeam, SLOT(setCurrentIndex(int)));
 
     connect(ui.pageSelectWeapon->pWeapons, SIGNAL(weaponsDeleted(QString)),
              this, SLOT(DeleteWeapons(QString)));
@@ -402,6 +415,11 @@
         wBackground->stopAnimation();
 }
 
+void HWForm::onFrontendSoundsToggled(bool value)
+{
+    ui.pageEditTeam->frontendSoundsToggled(value);
+}
+
 /*
 void HWForm::keyReleaseEvent(QKeyEvent *event)
 {
@@ -516,7 +534,7 @@
 
     if(teamslist.empty())
     {
-        QString currentNickName = config->value("net/nick",tr("Guest")+QString("%1").arg(rand())).toString();
+        QString currentNickName = config->value("net/nick", config->getRandomNick()).toString();
         QString teamName;
         int firstHumanTeam = 1;
         int lastHumanTeam = 2;
@@ -539,6 +557,7 @@
         // TODO: Remove DLC filtering when it isn't neccessary anymore
         HWNamegen::teamRandomGrave(defaultTeam, false);
         HWNamegen::teamRandomFort(defaultTeam, false);
+        HWNamegen::teamLocalizedDefaultVoice(defaultTeam);
         defaultTeam.saveToFile();
         teamslist.push_back(teamName);
 
@@ -552,6 +571,7 @@
             HWTeam numberTeam(teamName);
             HWNamegen::teamRandomGrave(numberTeam, false);
             HWNamegen::teamRandomFort(numberTeam, false);
+            HWNamegen::teamLocalizedDefaultVoice(numberTeam);
             numberTeam.saveToFile();
             teamslist.push_back(teamName);
         }
@@ -563,6 +583,7 @@
             HWTeam numberTeam(teamName);
             HWNamegen::teamRandomGrave(numberTeam, false);
             HWNamegen::teamRandomFort(numberTeam, false);
+            HWNamegen::teamLocalizedDefaultVoice(numberTeam);
             numberTeam.setDifficulty(6-i);
             numberTeam.saveToFile();
             teamslist.push_back(teamName);
@@ -572,7 +593,9 @@
     ui.pageOptions->CBTeamName->clear();
     ui.pageOptions->CBTeamName->addItems(teamslist);
     ui.pageCampaign->CBTeam->clear();
-    /* Only show human teams in campaign page */
+    ui.pageTraining->CBTeam->clear();
+    /* Only show human teams in campaign/training page */
+    bool playable = false;
     for(int i=0; i<teamslist.length(); i++)
     {
         HWTeam testTeam = HWTeam(teamslist[i]);
@@ -580,8 +603,15 @@
         if(testTeam.difficulty() == 0)
         {
             ui.pageCampaign->CBTeam->addItem(teamslist[i]);
+            ui.pageTraining->CBTeam->addItem(teamslist[i]);
+            playable = true;
         }
     }
+    ui.pageCampaign->BtnStartCampaign->setEnabled(playable);
+    ui.pageCampaign->btnPreview->setEnabled(playable);
+    ui.pageTraining->btnStart->setEnabled(playable);
+    ui.pageTraining->btnPreview->setEnabled(playable);
+    UpdateTrainingPageTeam(0);
 }
 
 void HWForm::GoToNewWeapons()
@@ -786,12 +816,15 @@
         case gtQLocal:
         case gtTraining:
         case gtCampaign:
+        case gtDemo:
+        case gtSave:
             ui.pageGameStats->restartBtnVisible(true);
             break;
         default:
             ui.pageGameStats->restartBtnVisible(false);
             break;
         }
+        ui.pageGameStats->saveDemoBtnEnabled(demoIsPresent);
     }
 
     if (id == ID_PAGE_MAIN)
@@ -921,6 +954,11 @@
             GoBack();
         }
 
+    if (curid == ID_PAGE_CAMPAIGN)
+        config->setValue("frontend/lastSingleplayerTeam", ui.pageCampaign->CBTeam->currentText());
+    if (curid == ID_PAGE_TRAINING)
+        config->setValue("frontend/lastSingleplayerTeam", ui.pageTraining->CBTeam->currentText());
+
     if (curid == ID_PAGE_ROOMSLIST || curid == ID_PAGE_CONNECTING) NetDisconnect();
     if (curid == ID_PAGE_NETGAME && hwnet && hwnet->isInRoom()) hwnet->partRoom();
     // need to work on this, can cause invalid state for admin quit trying to prevent bad state message on kick
@@ -1133,18 +1171,18 @@
 void HWForm::NetConnectQuick(const QString & host, quint16 port)
 {
     GoToPage(ID_PAGE_MAIN);
-    NetConnectServer(host, port);
+    NetConnectServer(host, port, false);
 }
 
-void HWForm::NetConnectServer(const QString & host, quint16 port)
+void HWForm::NetConnectServer(const QString & host, quint16 port, bool useTls)
 {
     qDebug("connecting to %s:%d", qPrintable(host), port);
-    _NetConnect(host, port, ui.pageOptions->editNetNick->text().trimmed());
+    _NetConnect(host, port, useTls, ui.pageOptions->editNetNick->text().trimmed());
 }
 
 void HWForm::NetConnectOfficialServer()
 {
-    NetConnectServer(NETGAME_DEFAULT_SERVER, NETGAME_DEFAULT_PORT);
+    NetConnectServer(NETGAME_DEFAULT_SERVER, NETGAME_DEFAULT_PORT, false);
 }
 
 void HWForm::NetPassword(const QString & nick)
@@ -1239,7 +1277,7 @@
         if (retry && hwnet) {
             if (hwnet->m_private_game) {
                 QStringList list = hwnet->getHost().split(":");
-                NetConnectServer(list.at(0), list.at(1).toShort());
+                NetConnectServer(list.at(0), list.at(1).toShort(), false);
             } else
                 NetConnectOfficialServer();
         }
@@ -1328,7 +1366,7 @@
         ui.pageRoomsList->displayWarning(wrnmsg);
 }
 
-void HWForm::_NetConnect(const QString & hostName, quint16 port, QString nick)
+void HWForm::_NetConnect(const QString & hostName, quint16 port, bool useTls, QString nick)
 {
     Q_UNUSED(nick);
 
@@ -1344,6 +1382,8 @@
     GoToPage(ID_PAGE_CONNECTING);
 
     connect(hwnet, SIGNAL(AskForRunGame()), this, SLOT(CreateNetGame()), Qt::QueuedConnection);
+    connect(hwnet, SIGNAL(AskForOfficialServerDemo()), this, SLOT(PlayOfficialServerDemo()), Qt::QueuedConnection);
+    connect(hwnet, SIGNAL(redirected(quint16)), this, SLOT(NetRedirected(quint16)), Qt::QueuedConnection);
     connect(hwnet, SIGNAL(connected()), this, SLOT(NetConnected()), Qt::QueuedConnection);
     connect(hwnet, SIGNAL(Error(const QString&)), this, SLOT(NetError(const QString&)), Qt::QueuedConnection);
     connect(hwnet, SIGNAL(Warning(const QString&)), this, SLOT(NetWarning(const QString&)), Qt::QueuedConnection);
@@ -1504,11 +1544,11 @@
     if (hwnet->m_private_game == false && AskForNickAndPwd() != 0)
         return;
 
-    QString nickname = config->value("net/nick",tr("Guest")+QString("%1").arg(rand())).toString();
+    QString nickname = config->value("net/nick", config->getRandomNick()).toString();
     ui.pageRoomsList->setUser(nickname);
     ui.pageNetGame->setUser(nickname);
 
-    hwnet->Connect(hostName, port, nickname);
+    hwnet->Connect(hostName, port, useTls, nickname);
 }
 
 int HWForm::AskForNickAndPwd(void)
@@ -1523,7 +1563,7 @@
     QString password;
 
     do {
-        nickname = config->value("net/nick",tr("Guest")+QString("%1").arg(rand())).toString();
+        nickname = config->value("net/nick", config->getRandomNick()).toString();
         hash = config->passwordHash();
         temphash = config->tempHash();
 
@@ -1562,7 +1602,7 @@
                 if (retry) {
                     if (hwnet->m_private_game) {
                         QStringList list = hwnet->getHost().split(":");
-                        NetConnectServer(list.at(0), list.at(1).toShort());
+                        NetConnectServer(list.at(0), list.at(1).toShort(), false);
                     } else
                         NetConnectOfficialServer();
                 }
@@ -1608,7 +1648,7 @@
         delete netHost;
         netHost = new QString(hpd->leHost->text());
         netPort = hpd->sbPort->value();
-        NetConnectServer(*netHost, netPort);
+        NetConnectServer(*netHost, netPort, false);
     }
     delete hpd;
 }
@@ -1636,7 +1676,7 @@
 
 void HWForm::AsyncNetServerStart()
 {
-    NetConnectServer("localhost", pnetserver->getRunningPort());
+    NetConnectServer("localhost", pnetserver->getRunningPort(), false);
 }
 
 void HWForm::NetDisconnect()
@@ -1665,7 +1705,7 @@
         if (retry) {
             if (hwnet->m_private_game) {
                 QStringList list = hwnet->getHost().split(":");
-                NetConnectServer(list.at(0), list.at(1).toUInt());
+                NetConnectServer(list.at(0), list.at(1).toUInt(), false);
             } else
                 NetConnectOfficialServer();
         }
@@ -1693,6 +1733,28 @@
     }
 }
 
+void HWForm::NetRedirected(quint16 port)
+{
+    QMessageBox questionMsg(this);
+    questionMsg.setIcon(QMessageBox::Question);
+    questionMsg.setWindowTitle(QMessageBox::tr("Server redirection"));
+    questionMsg.setText(QMessageBox::tr("This server supports secure connections on port %1.\nWould you like to reconnect securely?").arg(port));
+    questionMsg.setTextFormat(Qt::PlainText);
+    questionMsg.setWindowModality(Qt::WindowModal);
+    questionMsg.addButton(QMessageBox::Yes);
+    questionMsg.addButton(QMessageBox::No);
+
+    if (questionMsg.exec() == QMessageBox::Yes)
+    {        
+        QString host = hwnet->getHost().split(":").at(0);
+        NetConnectServer(host, port, true);
+    }
+    else if (hwnet)
+    {
+        hwnet->ContinueConnection();
+    }
+}
+
 void HWForm::NetConnected()
 {
     GoToPage(ID_PAGE_ROOMSLIST);
@@ -1733,6 +1795,7 @@
     {
         case gsStarted:
         {
+            demoIsPresent = true;
             Music(false);
             if (wBackground) wBackground->stopAnimation();
             if (!hwnet || (!hwnet->isRoomChief() || !hwnet->isInRoom())) GoToPage(ID_PAGE_INGAME);
@@ -1786,11 +1849,18 @@
     }
 }
 
+void HWForm::DemoPresenceChanged(bool hasDemo)
+{
+    demoIsPresent = hasDemo;
+}
+
 void HWForm::CreateGame(GameCFGWidget * gamecfg, TeamSelWidget* pTeamSelWidget, QString ammo)
 {
     game = new HWGame(config, gamecfg, ammo, pTeamSelWidget);
     connect(game, SIGNAL(CampStateChanged(int)), this, SLOT(UpdateCampaignPageProgress(int)));
+    connect(game, SIGNAL(TrainingStateChanged(int)), this, SLOT(UpdateTrainingPageTeam(int)));
     connect(game, SIGNAL(GameStateChanged(GameState)), this, SLOT(GameStateChanged(GameState)));
+    connect(game, SIGNAL(DemoPresenceChanged(bool)), this, SLOT(DemoPresenceChanged(bool)));
     connect(game, SIGNAL(GameStats(char, const QString &)), ui.pageGameStats, SLOT(GameStats(char, const QString &)));
     connect(game, SIGNAL(ErrorMessage(const QString &)), this, SLOT(ShowFatalErrorMessage(const QString &)), Qt::QueuedConnection);
     connect(game, SIGNAL(HaveRecord(RecordType, const QByteArray &)), this, SLOT(GetRecord(RecordType, const QByteArray &)));
@@ -1842,7 +1912,8 @@
 {
     CreateGame(0, 0, 0);
 
-    game->StartTraining(scriptName, subFolder);
+    QString trainTeam = ui.pageTraining->CBTeam->currentText();
+    game->StartTraining(scriptName, subFolder, trainTeam);
 }
 
 void HWForm::StartCampaign()
@@ -1879,6 +1950,23 @@
     game->StartNet();
 }
 
+void HWForm::PlayOfficialServerDemo()
+{
+    // go back in pages to prevent user from being stuck on certain pages
+    if(ui.Pages->currentIndex() == ID_PAGE_GAMESTATS ||
+       ui.Pages->currentIndex() == ID_PAGE_INGAME)
+        GoBack();
+
+    QString ammo;
+    ammo = ui.pageNetGame->pGameCFG->WeaponsName->itemData(
+               ui.pageNetGame->pGameCFG->WeaponsName->currentIndex()
+           ).toString();
+
+    CreateGame(ui.pageNetGame->pGameCFG, ui.pageNetGame->pNetTeamsWidget, ammo);
+
+    game->PlayOfficialServerDemo();
+}
+
 void HWForm::closeEvent(QCloseEvent *event)
 {
     config->SaveOptions();
@@ -1913,6 +2001,7 @@
     ui.pageNetGame->pGameCFG->GameSchemes->setModel(gameSchemeModel);
     ui.pageNetGame->pGameCFG->setMaster(true);
     ui.pageNetGame->pNetTeamsWidget->setInteractivity(true);
+    ui.pageNetGame->pGameCFG->resetSchemeStates();
 
     if (hwnet)
     {
@@ -1997,6 +2086,36 @@
     }
 }
 
+void HWForm::UpdateTrainingPageTeam(int index)
+{
+    Q_UNUSED(index);
+    HWTeam team(ui.pageTraining->CBTeam->currentText());
+    QString tName = team.name();
+
+    QListWidget* listWidget;
+    for(int w = 0; w < 3; w++)
+    {
+        switch(w) {
+            case 0: listWidget = ui.pageTraining->lstTrainings; break;
+            case 1: listWidget = ui.pageTraining->lstChallenges; break;
+            case 2: listWidget = ui.pageTraining->lstScenarios; break;
+            default: listWidget = ui.pageTraining->lstTrainings; break;
+        }
+        unsigned int n = listWidget->count();
+
+        for(unsigned int i = 0; i < n; i++)
+        {
+            QListWidgetItem* item = listWidget->item(i);
+            QString missionName = QString(item->data(Qt::UserRole).toString()).replace(QString(" "),QString("_"));
+            if(isMissionWon(missionName, tName))
+                item->setIcon(finishedIcon);
+            else
+                item->setIcon(notFinishedIcon);
+        }
+    }
+    ui.pageTraining->updateInfo();
+}
+
 void HWForm::InitCampaignPage()
 {
     ui.pageCampaign->CBCampaign->clear();
@@ -2016,26 +2135,62 @@
         QString tName = team.name();
         ui.pageCampaign->CBCampaign->addItem(getRealCampName(campaignName), campaignName);
     }
+
+}
+
+void HWForm::RestoreSingleplayerTeamSelection()
+{
+    QString lastTeam = config->value("frontend/lastSingleplayerTeam", QString()).toString();
+    if (!lastTeam.isNull() && !lastTeam.isEmpty())
+    {
+        int index = ui.pageCampaign->CBTeam->findData(lastTeam, Qt::DisplayRole);
+        if(index != -1)
+        {
+            ui.pageCampaign->CBTeam->setCurrentIndex(index);
+            UpdateCampaignPageTeam(index);
+        }
+        index = ui.pageTraining->CBTeam->findData(lastTeam, Qt::DisplayRole);
+        if(index != -1)
+        {
+            ui.pageTraining->CBTeam->setCurrentIndex(index);
+            UpdateTrainingPageTeam(index);
+        }
+    }
 }
 
 void HWForm::UpdateCampaignPage(int index)
 {
     Q_UNUSED(index);
     HWTeam team(ui.pageCampaign->CBTeam->currentText());
-    QString campaignName = ui.pageCampaign->CBCampaign->itemData(ui.pageCampaign->CBCampaign->currentIndex()).toString();
+    QString campaignName = ui.pageCampaign->CBCampaign->currentData().toString();
     QString tName = team.name();
 
     campaignMissionInfo = getCampMissionList(campaignName,tName);
     ui.pageCampaign->CBMission->clear();
 
+    // Populate mission list
     for(int i=0;i<campaignMissionInfo.size();i++)
     {
         ui.pageCampaign->CBMission->addItem(QString(campaignMissionInfo[i].realName), QString(campaignMissionInfo[i].name));
-        if(isMissionWon(campaignName, i, tName))
+        if(isCampMissionWon(campaignName, i, tName))
             ui.pageCampaign->CBMission->setItemIcon(i, finishedIcon);
         else
             ui.pageCampaign->CBMission->setItemIcon(i, notFinishedIcon);
     }
+
+    // Select first open mission
+    int missionIndex = ui.pageCampaign->CBMission->currentIndex();
+    if(isCampMissionWon(campaignName, missionIndex, tName))
+    {
+        for(int m = 0; m < ui.pageCampaign->CBMission->count(); m++)
+        {
+            if(!isCampMissionWon(campaignName, m, tName))
+            {
+                ui.pageCampaign->CBMission->setCurrentIndex(m);
+                break;
+            }
+        }
+    }
 }
 
 void HWForm::UpdateCampaignPageTeam(int index)
@@ -2052,6 +2207,7 @@
 
     unsigned int n = entries.count();
 
+    // Update campaign status
     for(unsigned int i = 0; i < n; i++)
     {
         QString campaignName = QString(entries[i]).replace(QString(" "),QString("_"));
@@ -2065,7 +2221,7 @@
 void HWForm::UpdateCampaignPageMission(int index)
 {
     // update thumbnail and description
-    QString campaignName = ui.pageCampaign->CBCampaign->itemData(ui.pageCampaign->CBCampaign->currentIndex()).toString();
+    QString campaignName = ui.pageCampaign->CBCampaign->currentData().toString();
     // when campaign changes the UpdateCampaignPageMission is triggered with wrong values
     // this will cause segfault. This check prevents illegal memory reads
     if(index > -1 && index < campaignMissionInfo.count()) {
@@ -2077,29 +2233,76 @@
 
 void HWForm::UpdateCampaignPageProgress(int index)
 {
-    Q_UNUSED(index);
-
-    QString missionTitle = ui.pageCampaign->CBMission->currentText();
+    QString missionTitle = ui.pageCampaign->CBMission->currentData().toString();
     UpdateCampaignPage(0);
+    int missionIndex = 0;
+    // Restore selected mission (because UpdateCampaignPage repopulated the list)
     for(int i=0;i<ui.pageCampaign->CBMission->count();i++)
     {
-        if (ui.pageCampaign->CBMission->itemData(i)==missionTitle)
+        if (ui.pageCampaign->CBMission->itemData(i).toString() == missionTitle)
         {
-            ui.pageCampaign->CBMission->setCurrentIndex(i);
+            missionIndex = i;
             break;
         }
     }
-    int i = ui.pageCampaign->CBCampaign->currentIndex();
-    QString campaignName = ui.pageCampaign->CBCampaign->itemData(i).toString();
+
+    // Get metadata
+    int c = ui.pageCampaign->CBCampaign->currentIndex();
+    QString campaignName = ui.pageCampaign->CBCampaign->itemData(c).toString();
     HWTeam team(ui.pageCampaign->CBTeam->currentText());
     QString tName = team.name();
+
+    if(index == gsFinished)
+    {
+        // Select new mission when current mission went from
+        // unfinished to finished.
+        if(ui.pageCampaign->currentMissionWon == false &&
+           isCampMissionWon(campaignName, missionIndex, tName))
+        {
+            // Traverse all missions and pick first mission that
+            // has not been won.
+            bool selected = false;
+            // start from mission that comes after the selected one
+            for(int m = missionIndex-1; m >= 0;m--)
+            {
+                if(!isCampMissionWon(campaignName, m, tName))
+                {
+                    missionIndex = m;
+                    selected = true;
+                    break;
+                }
+            }
+            // No mission selected? Let's try again from the end of the list
+            if(!selected)
+            {
+                for(int m = ui.pageCampaign->CBMission->count()-1; m > missionIndex-1; m--)
+                {
+                    if(!isCampMissionWon(campaignName, m, tName))
+                    {
+                        missionIndex = m;
+                        break;
+                    }
+                }
+            }
+            // If no mission was selected, the old selection remains unchanged.
+        }
+    }
+    else if(index == gsStarted)
+    {
+        // Remember the "won" state of current mission before we start it.
+        // We'll need it when the game has finished.
+        ui.pageCampaign->currentMissionWon = isCampMissionWon(campaignName, missionIndex, tName);
+    }
+
+    ui.pageCampaign->CBMission->setCurrentIndex(missionIndex);
+
+    // Update campaign victory status
     if(isCampWon(campaignName, tName))
-        ui.pageCampaign->CBCampaign->setItemIcon(i, finishedIcon);
+        ui.pageCampaign->CBCampaign->setItemIcon(c, finishedIcon);
     else
-        ui.pageCampaign->CBCampaign->setItemIcon(i, notFinishedIcon);
+        ui.pageCampaign->CBCampaign->setItemIcon(c, notFinishedIcon);
 }
 
-// used for --set-everything [screen width] [screen height] [color dept] [volume] [enable music] [enable sounds] [language file] [full screen] [show FPS] [alternate damage] [timer value] [reduced quality]
 QString HWForm::getDemoArguments()
 {
 
@@ -2117,6 +2320,8 @@
                    + " --fullscreen-height " + QString::number(resolutions.first.height())
                    + " --width " + QString::number(resolutions.second.width())
                    + " --height " + QString::number(resolutions.second.height())
+                   + (config->vid_Maximized() ? " --maximized" : "")
+                   + (config->zoom() == 100 ? "" : " --zoom " + QString::number(config->zoom()))
                    + " --volume " + QString::number(config->volume())
                    + (config->isMusicEnabled() ? "" : " --nomusic")
                    + (config->isSoundEnabled() ? "" : " --nosound")
@@ -2130,7 +2335,8 @@
                    + (!config->Form->ui.pageOptions->CBTeamTag->isChecked() ? " --no-teamtag" : "")
                    + (!config->Form->ui.pageOptions->CBHogTag->isChecked() ? " --no-hogtag" : "")
                    + (!config->Form->ui.pageOptions->CBHealthTag->isChecked() ? " --no-healthtag" : "")
-                   + (config->Form->ui.pageOptions->CBTagOpacity->isChecked() ? " --translucent-tags" : "");
+                   + (config->Form->ui.pageOptions->CBTagOpacity->isChecked() ? " --translucent-tags" : "")
+                   + (!config->isHolidaySillinessEnabled() ? " --no-holiday-silliness" : "");
 }
 
 void HWForm::AssociateFiles()
@@ -2185,6 +2391,7 @@
         infoMsg.setIcon(QMessageBox::Information);
         infoMsg.setWindowTitle(QMessageBox::tr("Hedgewars - Success"));
         infoMsg.setText(QMessageBox::tr("All file associations have been set"));
+        infoMsg.setTextFormat(Qt::PlainText);
         infoMsg.setWindowModality(Qt::WindowModal);
         infoMsg.exec();
     }
@@ -2235,7 +2442,7 @@
 
     switch(lastGameType) {
     case gtTraining:
-        game->StartTraining(lastGameStartArgs.at(0).toString(), lastTrainingSubFolder);
+        game->StartTraining(lastGameStartArgs.at(0).toString(), lastGameStartArgs.at(1).toString(), lastGameStartArgs.at(2).toString());
         break;
     case gtQLocal:
         game->StartQuick();
@@ -2246,6 +2453,10 @@
     case gtLocal:
         game->StartLocal();
         break;
+    case gtDemo:
+    case gtSave:
+        PlayDemo();
+        break;
     default:
         break;
     }
@@ -2298,6 +2509,7 @@
     questionMsg.setIcon(QMessageBox::Question);
     questionMsg.setWindowTitle(QMessageBox::tr("Not all players are ready"));
     questionMsg.setText(QMessageBox::tr("Are you sure you want to start this game?\nNot all players are ready."));
+    questionMsg.setTextFormat(Qt::PlainText);
     questionMsg.setWindowModality(Qt::WindowModal);
     questionMsg.addButton(QMessageBox::Yes);
     questionMsg.addButton(QMessageBox::Cancel);
--- a/QTfrontend/hwform.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/hwform.h	Fri Aug 16 10:59:50 2019 -0600
@@ -52,6 +52,7 @@
 class QSignalMapper;
 
 extern bool frontendEffects;
+extern bool demoIsPresent;
 extern QString playerHash;
 
 class HWForm : public QMainWindow
@@ -100,9 +101,10 @@
         void startTraining(const QString&, const QString&);
         void StartCampaign();
         void NetConnect();
-        void NetConnectServer(const QString & host, quint16 port);
+        void NetConnectServer(const QString & host, quint16 port, bool useTls);
         void NetConnectOfficialServer();
         void NetStartServer();
+        void NetRedirected(quint16 port);
         void NetDisconnect();
         void NetConnected();
         void NetError(const QString & errmsg);
@@ -120,22 +122,27 @@
         void RemoveNetTeam(const HWTeam& team);
         void StartMPGame();
         void GameStateChanged(GameState gameState);
+        void DemoPresenceChanged(bool hasDemo);
         void ForcedDisconnect(const QString & reason);
         void ShowFatalErrorMessage(const QString &);
         void GetRecord(RecordType type, const QByteArray & record);
         void CreateNetGame();
+        void PlayOfficialServerDemo();
         void UpdateWeapons();
         void DeleteWeapons(QString weaponsName);
         void AddWeapons(QString weaponsName, QString ammo);
         void EditWeapons(QString oldWeaponsName, QString newWeaponsName, QString ammo);
         void onFrontendFullscreen(bool value);
         void onFrontendEffects(bool value);
+        void onFrontendSoundsToggled(bool value);
         void Music(bool checked);
         void UpdateCampaignPage(int index);
         void UpdateCampaignPageTeam(int index);
         void UpdateCampaignPageProgress(int index);
         void UpdateCampaignPageMission(int index);
+        void UpdateTrainingPageTeam(int index);
         void InitCampaignPage();
+        void RestoreSingleplayerTeamSelection();
         void showFeedbackDialog();
         void showFeedbackDialogNetChecked();
 
@@ -156,7 +163,7 @@
         void FromNetProxySlot(const QByteArray &);
 
     private:
-        void _NetConnect(const QString & hostName, quint16 port, QString nick);
+        void _NetConnect(const QString & hostName, quint16 port, bool useTls, QString nick);
         int  AskForNickAndPwd(void);
         void UpdateTeamsLists();
         void CreateGame(GameCFGWidget * gamecfg, TeamSelWidget* pTeamSelWidget, QString ammo);
--- a/QTfrontend/main.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/main.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -291,27 +291,14 @@
         // end of parameter parsing
 
         // Select Qt style
-        /* Qt5 Base removed Motif, Plastique. These are now in the Qt style plugins
-        (Ubuntu: qt5-style-plugins, which was NOT backported by Debian/Ubuntu to stable/LTS).
-        Windows appears to render best of the remaining options but still isn't quite right. */
-
-        // Try setting Plastique if available
         QStyle* coreStyle;
-        coreStyle = QStyleFactory::create("Plastique");
+        coreStyle = QStyleFactory::create("Windows");
         if(coreStyle != 0) {
             QApplication::setStyle(coreStyle);
-            qDebug("Qt style set: Plastique");
+            qDebug("Qt style set: Windows");
         } else {
-            // Use Windows as fallback.
-            // FIXME: Under Windows style, some widgets like scrollbars don't render as nicely
-            coreStyle = QStyleFactory::create("Windows");
-            if(coreStyle != 0) {
-                QApplication::setStyle(coreStyle);
-                qDebug("Qt style set: Windows");
-            } else {
-                // Windows style should not be missing in Qt5 Base. If it does, something went terribly wrong!
-                qWarning("No Qt style could be set! Using the default one.");
-            }
+            // Windows style should not be missing in Qt5 Base. If it does, something went terribly wrong!
+            qWarning("No Qt style could be set! Using the default one.");
         }
     }
 
@@ -341,10 +328,10 @@
         checkForDir(cfgdir->absolutePath() + "/Library/Application Support/Hedgewars");
         cfgdir->cd("Library/Application Support/Hedgewars");
 #elif defined _WIN32
-        char path[1024];
-        if(!SHGetFolderPathA(0, CSIDL_PERSONAL, NULL, 0, path))
+        wchar_t path[MAX_PATH];
+        if(SHGetFolderPathW(0, CSIDL_PERSONAL, NULL, 0, path) == S_OK)
         {
-            cfgdir->cd(path);
+            cfgdir->cd(QString::fromWCharArray(path));
             checkForDir(cfgdir->absolutePath() + "/Hedgewars");
             cfgdir->cd("Hedgewars");
         }
@@ -373,6 +360,7 @@
         checkForDir(cfgdir->absolutePath() + "/Logs");
         checkForDir(cfgdir->absolutePath() + "/Videos");
         checkForDir(cfgdir->absolutePath() + "/VideoTemp");
+        checkForDir(cfgdir->absolutePath() + "/VideoThumbnails");
     }
 
     datadir->cd(bindir->absolutePath());
@@ -395,10 +383,9 @@
 
     QTranslator TranslatorHedgewars;
     QTranslator TranslatorQt;
+    QSettings settings(DataManager::instance().settingsFileName(), QSettings::IniFormat);
+    settings.setIniCodec("UTF-8");
     {
-        QSettings settings(DataManager::instance().settingsFileName(), QSettings::IniFormat);
-        settings.setIniCodec("UTF-8");
-
         QString cc = settings.value("misc/locale", QString()).toString();
         if (cc.isEmpty())
         {
@@ -494,11 +481,16 @@
     QString style = "";
     QString fname;
 
-    checkSeason();
-    //For each season, there is an extra stylesheet
-    //Todo: change background for easter and birthday
-    //(simply replace res/BackgroundBirthday.png and res/BackgroundEaster.png
-    //with an appropriate background
+    bool holidaySilliness = settings.value("misc/holidaySilliness", true).toBool();
+    if(holidaySilliness)
+        checkSeason();
+    else
+        season = SEASON_NONE;
+
+    // For each season, there is an extra stylesheet.
+    // TODO: change background for easter
+    // (simply replace res/BackgroundEaster.png
+    // with an appropriate background).
     switch (season)
     {
         case SEASON_CHRISTMAS :
@@ -544,6 +536,7 @@
         questionTutorialMsg.setIcon(QMessageBox::Question);
         questionTutorialMsg.setWindowTitle(QMessageBox::tr("Welcome to Hedgewars"));
         questionTutorialMsg.setText(QMessageBox::tr("Welcome to Hedgewars!\n\nYou seem to be new around here. Would you like to play some training missions first to learn the basics of Hedgewars?"));
+        questionTutorialMsg.setTextFormat(Qt::PlainText);
         questionTutorialMsg.setWindowModality(Qt::WindowModal);
         questionTutorialMsg.addButton(QMessageBox::Yes);
         questionTutorialMsg.addButton(QMessageBox::No);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/mission.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,79 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2004-2018 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program 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; version 2 of the License
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include "mission.h"
+#include "hwconsts.h"
+#include "DataManager.h"
+#include <QSettings>
+#include <QObject>
+#include <QLocale>
+
+QSettings* getMissionTeamFile(QString & missionName, QString & teamName)
+{
+    QSettings* teamfile = new QSettings(cfgdir->absolutePath() + "/Teams/" + teamName + ".hwt", QSettings::IniFormat, 0);
+    teamfile->setIniCodec("UTF-8");
+    if (!teamfile->childGroups().contains("Mission " + missionName) &&
+            teamfile->childGroups().contains("Mission " + missionName)){
+        teamfile->beginGroup("Mission " + missionName);
+        QStringList keys = teamfile->childKeys();
+        teamfile->endGroup();
+        for (int i=0;i<keys.size();i++) {
+            QVariant value = teamfile->value("Mission " + missionName + "/" + keys[i]);
+            teamfile->setValue("Mission " + missionName + "/" + keys[i], value);
+        }
+        teamfile->remove("Mission " + missionName);
+    }
+
+    return teamfile;
+}
+
+/**
+    Returns true if the specified mission has been completed
+    missionName: Name of the mission in question
+    teamName: Name of the playing team
+*/
+bool isMissionWon(QString & missionName, QString & teamName)
+{
+    QSettings* teamfile = getMissionTeamFile(missionName, teamName);
+    bool won = teamfile->value("Mission " + missionName + "/Won", false).toBool();
+    return won;
+}
+
+/**
+    Returns true if the mission value adressed with the provided
+    missionName: Name of the mission in question
+    teamName: Name of the playing team
+    key: name of key to check
+*/
+bool missionValueExists(QString & missionName, QString & teamName, QString key)
+{
+    QSettings* teamfile = getMissionTeamFile(missionName, teamName);
+    return teamfile->contains("Mission " + missionName + "/" + key);
+}
+/**
+    Returns a mission value.
+    NOTE: Check whether the mission value exists first, using missionValueExists.
+    missionName: Name of the mission in question
+    teamName: Name of the playing team
+    key: name of key to read its value from
+*/
+QVariant getMissionValue(QString & missionName, QString & teamName, QString key)
+{
+    QSettings* teamfile = getMissionTeamFile(missionName, teamName);
+    return teamfile->value("Mission " + missionName + "/" + key);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/mission.h	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,30 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2004-2018 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program 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; version 2 of the License
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#ifndef MISSION_H
+#define MISSION_H
+
+#include <QString>
+#include <QSettings>
+
+QSettings* getMissionTeamFile(QString & missionName, QString & teamName);
+bool isMissionWon(QString & missionName, QString & teamName);
+bool missionValueExists(QString & missionName, QString & teamName, QString key);
+QVariant getMissionValue(QString & missionName, QString & teamName, QString key);
+
+#endif
--- a/QTfrontend/model/ThemeFilterProxyModel.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/model/ThemeFilterProxyModel.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -29,6 +29,7 @@
 {
     isFilteringDLC = false;
     isFilteringHidden = false;
+    isFilteringBackground = false;
 }
 
 bool ThemeFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex & sourceParent) const
@@ -43,13 +44,15 @@
         searchOkay = in != -1;
     }
 
-    if(isFilteringDLC || isFilteringHidden)
+    if(isFilteringDLC || isFilteringHidden || isFilteringBackground)
     {
         bool isDLC = index.data(ThemeModel::IsDlcRole).toBool();
         bool isHidden = index.data(ThemeModel::IsHiddenRole).toBool();
+        bool isBackground = index.data(ThemeModel::IsBackgroundThemeRole).toBool();
 
         return ( ((isFilteringDLC && !isDLC) || !isFilteringDLC) &&
-                 ((isFilteringHidden && !isHidden) || !isFilteringHidden) ) &&
+                 ((isFilteringHidden && !isHidden) || !isFilteringHidden) &&
+                 ((isFilteringBackground && !isBackground) || !isFilteringBackground) ) &&
                searchOkay;
     }
     else
@@ -69,3 +72,9 @@
     isFilteringHidden = enable;
     invalidateFilter();
 }
+
+void ThemeFilterProxyModel::setFilterBackground(bool enable)
+{
+    isFilteringBackground = enable;
+    invalidateFilter();
+};
--- a/QTfrontend/model/ThemeFilterProxyModel.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/model/ThemeFilterProxyModel.h	Fri Aug 16 10:59:50 2019 -0600
@@ -37,6 +37,7 @@
         ThemeFilterProxyModel(QObject *parent = 0);
         void setFilterDLC(bool enabled);
         void setFilterHidden(bool enabled);
+        void setFilterBackground(bool enabled);
 
     protected:
         bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
@@ -44,6 +45,7 @@
     private:
         bool isFilteringDLC;
         bool isFilteringHidden;
+        bool isFilteringBackground;
 };
 
 #endif // HEDGEWARS_THEMEFILTERPROXYMODEL_H
--- a/QTfrontend/model/ThemeModel.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/model/ThemeModel.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -124,38 +124,49 @@
     {
         QMap<int, QVariant> dataset;
 
+        // Ignore directories without theme.cfg
+        QFile themeCfgFile(QString("physfs://Themes/%1/theme.cfg").arg(theme));
+        if (!themeCfgFile.open(QFile::ReadOnly))
+        {
+            continue;
+        }
+
         // themes without icon are supposed to be hidden
         QString iconpath = QString("physfs://Themes/%1/icon.png").arg(theme);
-
         if (!QFile::exists(iconpath))
         {
             dataset.insert(IsHiddenRole, true);
         }
         else
         {
-            // themes with the key “hidden” in theme.cfg are hidden, too
-            QFile themeCfgFile(QString("physfs://Themes/%1/theme.cfg").arg(theme));
-            if (themeCfgFile.open(QFile::ReadOnly))
+            QTextStream stream(&themeCfgFile);
+            QString line = stream.readLine();
+            QString key;
+            while (!line.isNull())
             {
-                QTextStream stream(&themeCfgFile);
-                QString line = stream.readLine();
-                QString key;
-                while (!line.isNull())
+                key = QString(line);
+                int equalsPos = line.indexOf('=');
+                key.truncate(equalsPos - 1);
+                key = key.simplified();
+                if (!line.startsWith(';') && key == "hidden")
                 {
-                    key = QString(line);
-                    int equalsPos = line.indexOf('=');
-                    key.truncate(equalsPos - 1);
-                    key = key.simplified();
-                    if (!line.startsWith(';') && key == "hidden")
-                    {
-                        dataset.insert(IsHiddenRole, true);
-                        break;
-                    }
-                    line = stream.readLine();
+                    dataset.insert(IsHiddenRole, true);
+                    break;
                 }
+                line = stream.readLine();
             }
         }
 
+        // Themes without land textures are considered "background themes"
+        // since they cannot be used for generated maps, but they can be used
+        // for image maps.
+        QString landtexpath = QString("physfs://Themes/%1/LandTex.png").arg(theme);
+        QString bordertexpath = QString("physfs://Themes/%1/Border.png").arg(theme);
+        if ((!QFile::exists(landtexpath)) || (!QFile::exists(bordertexpath)))
+        {
+            dataset.insert(IsBackgroundThemeRole, true);
+        }
+
         // detect if theme is dlc
         QString themeDir = PHYSFS_getRealDir(QString("Themes/%1").arg(theme).toLocal8Bit().data());
         bool isDLC = !themeDir.startsWith(datadir->absolutePath());
@@ -179,5 +190,6 @@
         }
 
         m_data.append(dataset);
+        themeCfgFile.close();
     }
 }
--- a/QTfrontend/model/ThemeModel.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/model/ThemeModel.h	Fri Aug 16 10:59:50 2019 -0600
@@ -41,7 +41,7 @@
         Q_OBJECT
 
     public:
-        enum Roles { ActualNameRole = Qt::UserRole, IsDlcRole, IconPathRole, IsHiddenRole };
+        enum Roles { ActualNameRole = Qt::UserRole, IsDlcRole, IconPathRole, IsHiddenRole, IsBackgroundThemeRole };
         explicit ThemeModel(QObject *parent = 0);
 
         int rowCount(const QModelIndex &parent = QModelIndex()) const;
--- a/QTfrontend/model/gameSchemeModel.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/model/gameSchemeModel.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -89,6 +89,7 @@
                          << "King Mode"
                          << "Mutant"
                          << "Construction Mode"
+                         << "The Specialists"
                          << "Space Invasion"
                          << "HedgeEditor"
                          ;
@@ -671,9 +672,58 @@
             << QVariant("initialenergy=550, energyperround=50, maxenergy=1000, cratesperround=5") // scriptparam    43
             ;
 
+    QList<QVariant> specialists;
+    specialists
+            << predefSchemesNames[12]  // name           0
+            << QVariant(true)          // switchhog      1
+            << QVariant(false)         // team divide    2
+            << QVariant(false)         // solid land     3
+            << QVariant(false)         // border         4
+            << QVariant(false)         // low gravity    5
+            << QVariant(false)         // laser sight    6
+            << QVariant(false)         // invulnerable   7
+            << QVariant(false)         // reset health   8
+            << QVariant(false)         // vampiric       9
+            << QVariant(false)         // karma          10
+            << QVariant(false)         // artillery      11
+            << QVariant(false)         // random order   12
+            << QVariant(false)         // king           13
+            << QVariant(true)          // place hog      14
+            << QVariant(false)         // shared ammo    15
+            << QVariant(false)         // disable girders 16
+            << QVariant(false)         // disable land objects 17
+            << QVariant(false)         // AI survival    18
+            << QVariant(true)          // inf. attack    19
+            << QVariant(true)          // reset weps     20
+            << QVariant(true)          // per hog ammo   21
+            << QVariant(false)         // no wind        22
+            << QVariant(false)         // more wind      23
+            << QVariant(false)         // tag team       24
+            << QVariant(false)         // bottom border  25
+            << QVariant(100)           // damage modfier 26
+            << QVariant(45)            // turn time      27
+            << QVariant(100)           // init health    28
+            << QVariant(15)            // sudden death   29
+            << QVariant(5)             // case prob      30
+            << QVariant(3)             // mines time     31
+            << QVariant(0)             // mines number   32
+            << QVariant(0)             // mine dud pct   33
+            << QVariant(0)             // explosives     34
+            << QVariant(0)             // air mines      35
+            << QVariant(100)           // health case pct 36
+            << QVariant(25)            // health case amt 37
+            << QVariant(47)            // water rise amt 38
+            << QVariant(5)             // health dec amt 39
+            << QVariant(100)           // rope modfier   40
+            << QVariant(100)           // get away time  41
+            << QVariant(0)             // world edge     42
+            // NOTE: If you change this, also change the defaults in the The Specialists script
+            << QVariant("t=SENDXHPL")  // scriptparam    43
+            ;
+
     QList<QVariant> spaceinvasion;
     spaceinvasion
-            << predefSchemesNames[12]  // name           0
+            << predefSchemesNames[13]  // name           0
             << QVariant(false)         // switchhog      1
             << QVariant(false)         // team divide    2
             << QVariant(false)         // solid land     3
@@ -722,7 +772,7 @@
 
     QList<QVariant> hedgeeditor;
     hedgeeditor
-            << predefSchemesNames[13]  // name           0
+            << predefSchemesNames[14]  // name           0
             << QVariant(false)         // switchhog      1
             << QVariant(false)         // team divide    2
             << QVariant(false)         // solid land     3
@@ -782,6 +832,7 @@
     schemes.append(kingmode);
     schemes.append(mutant);
     schemes.append(construction);
+    schemes.append(specialists);
     schemes.append(spaceinvasion);
     schemes.append(hedgeeditor);
 
--- a/QTfrontend/net/hwmap.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/net/hwmap.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -25,7 +25,7 @@
 #include "hwmap.h"
 
 HWMap::HWMap(QObject * parent) :
-    TCPBase(false, parent)
+    TCPBase(false, false, parent)
 {
     templateFilter = 0;
     m_mapgen = MAPGEN_REGULAR;
--- a/QTfrontend/net/hwmapoptimizer.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/net/hwmapoptimizer.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -2,7 +2,7 @@
 #include "hwconsts.h"
 
 HWMapOptimizer::HWMapOptimizer(QObject *parent) :
-    TCPBase(parent)
+    TCPBase(false, false, parent)
 {
 }
 
--- a/QTfrontend/net/newnetclient.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/net/newnetclient.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -41,6 +41,7 @@
 {
     m_private_game = false;
     m_nick_registered = false;
+    m_demo_data_pending = false;
 
     m_roomsListModel = new RoomsListModel(this);
 
@@ -80,12 +81,23 @@
     NetSocket.flush();
 }
 
-void HWNewNet::Connect(const QString & hostName, quint16 port, const QString & nick)
+void HWNewNet::Connect(const QString & hostName, quint16 port, bool useTls, const QString & nick)
 {
     netClientState = Connecting;
     mynick = nick;
     myhost = hostName + QString(":%1").arg(port);
-    NetSocket.connectToHost(hostName, port);
+    if (useTls)
+    {
+        NetSocket.connectToHostEncrypted(hostName, port);
+        if (!NetSocket.waitForEncrypted())
+        {
+            qWarning("Handshake failed");
+        }
+    }
+    else 
+    {
+        NetSocket.connectToHost(hostName, port);
+    }
 }
 
 void HWNewNet::Disconnect()
@@ -257,6 +269,17 @@
     maybeSendPassword();
 }
 
+void HWNewNet::ContinueConnection()
+{
+    if (netClientState == Connected)    
+    {
+        RawSendNet(QString("NICK%1%2").arg(delimiter).arg(mynick));
+        RawSendNet(QString("PROTO%1%2").arg(delimiter).arg(*cProtoVer));    
+        m_game_connected = true;
+        emit adminAccess(false);
+    }
+}
+
 void HWNewNet::ParseCmd(const QStringList & lst)
 {
     qDebug() << "Server: " << lst;
@@ -296,6 +319,27 @@
         return;
     }
 
+    if (lst[0] == "REDIRECT")
+    {        
+        if (lst.size() < 2 || lst[1].toInt() == 0)
+        {
+            qWarning("Net: Malformed REDIRECT message");
+            return;            
+        }
+
+        quint16 port = lst[1].toInt();
+        if (port == 0) 
+        {
+            qWarning() << "Invalid redirection port";            
+        }
+        else 
+        {
+            netClientState = Redirected;
+            emit redirected(port);
+        }
+        return;
+    }
+
     if (lst[0] == "CONNECTED")
     {
         if(lst.size() < 3 || lst[2].toInt() < cMinServerVersion)
@@ -308,11 +352,12 @@
             return;
         }
 
-        RawSendNet(QString("NICK%1%2").arg(delimiter).arg(mynick));
-        RawSendNet(QString("PROTO%1%2").arg(delimiter).arg(*cProtoVer));
-        netClientState = Connected;
-        m_game_connected = true;
-        emit adminAccess(false);
+        ClientState lastState = netClientState;
+        netClientState = Connected;      
+        if (lastState != Redirected)
+        {
+            ContinueConnection();
+        }
         return;
     }
 
@@ -754,13 +799,23 @@
         return;
     }
 
-    if(netClientState == InRoom || netClientState == InGame)
+    if(netClientState == InLobby && lst[0] == "REPLAY_START")
+    {
+        netClientState = InRoom;
+        m_demo_data_pending = true;
+        emit EnteredGame();
+        emit roomMaster(false);
+        return;
+    }
+
+    if(netClientState == InRoom || netClientState == InGame || netClientState == InDemo)
     {
         if (lst[0] == "EM")
         {
             if(lst.size() < 2)
             {
                 qWarning("Net: Bad EM message");
+                m_demo_data_pending = false;
                 return;
             }
             for(int i = 1; i < lst.size(); ++i)
@@ -768,9 +823,13 @@
                 QByteArray em = QByteArray::fromBase64(lst[i].toLatin1());
                 emit FromNet(em);
             }
+            m_demo_data_pending = false;
             return;
         }
+    }
 
+    if(netClientState == InRoom || netClientState == InGame)
+    {
         if (lst[0] == "ROUND_FINISHED")
         {
             emit FromNet(QByteArray("\x01o"));
@@ -812,8 +871,16 @@
 
         if (lst[0] == "RUN_GAME")
         {
-            netClientState = InGame;
-            emit AskForRunGame();
+            if(m_demo_data_pending)
+            {
+                netClientState = InDemo;
+                emit AskForOfficialServerDemo();
+            }
+            else
+            {
+                netClientState = InGame;
+                emit AskForRunGame();
+            }
             return;
         }
 
@@ -1021,6 +1088,13 @@
         netClientState = InRoom;
         RawSendNet(QString("ROUNDFINISHED%1%2").arg(delimiter).arg(correctly ? "1" : "0"));
     }
+    else if (netClientState == InDemo)
+    {
+        netClientState = InLobby;
+        askRoomsList();
+        emit LeftRoom(QString());
+        m_playersModel->resetRoomFlags();
+    }
 }
 
 void HWNewNet::banPlayer(const QString & nick)
--- a/QTfrontend/net/newnetclient.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/net/newnetclient.h	Fri Aug 16 10:59:50 2019 -0600
@@ -22,7 +22,7 @@
 
 #include <QObject>
 #include <QString>
-#include <QTcpSocket>
+#include <QSslSocket>
 #include <QMap>
 
 #include "team.h"
@@ -43,11 +43,12 @@
         Q_OBJECT
 
     public:
-        enum ClientState { Disconnected, Connecting, Connected, InLobby, InRoom, InGame };
+        enum ClientState { Disconnected, Connecting, Redirected, Connected, InLobby, InRoom, InGame, InDemo };
 
         HWNewNet();
         ~HWNewNet();
-        void Connect(const QString & hostName, quint16 port, const QString & nick);
+        void Connect(const QString & hostName, quint16 port, bool useTls, const QString & nick);
+        void ContinueConnection();
         void Disconnect();
         void SendPasswordHash(const QString & hash);
         void NewNick(const QString & nick);
@@ -68,10 +69,11 @@
         QString mynick;
         QString myroom;
         QString myhost;
-        QTcpSocket NetSocket;
+        QSslSocket NetSocket;
         QString seed;
         bool m_game_connected;
         bool m_nick_registered;
+        bool m_demo_data_pending;
         RoomsListModel * m_roomsListModel;
         PlayersListModel * m_playersModel;
         QSortFilterProxyModel * m_lobbyPlayersModel;
@@ -87,7 +89,7 @@
         int  ByteLength(const QString & str);
         void RawSendNet(const QString & buf);
         void RawSendNet(const QByteArray & buf);
-        void ParseCmd(const QStringList & lst);
+        void ParseCmd(const QStringList & lst);        
         void handleNotice(int n);
 
         void maybeSendPassword();
@@ -96,8 +98,10 @@
 
     signals:
         void AskForRunGame();
+        void AskForOfficialServerDemo();
         void connected();
         void disconnected(const QString & reason);
+        void redirected(quint16 port);
         void Error(const QString & errmsg);
         void Warning(const QString & wrnmsg);
         void NickRegistered(const QString & nick);
--- a/QTfrontend/net/recorder.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/net/recorder.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -23,6 +23,7 @@
 #include "gameuiconfig.h"
 #include "hwconsts.h"
 #include "game.h"
+#include "util/MessageDialog.h"
 #include "LibavInteraction.h"
 
 // Encoding is memory expensive process, so we need to limit maximum number
@@ -33,7 +34,7 @@
 static QList<HWRecorder*> queue;
 
 HWRecorder::HWRecorder(GameUIConfig * config, const QString &prefix) :
-    TCPBase(false)
+    TCPBase(false, !config->language().isEmpty())
 {
     this->config = config;
     this->prefix = prefix;
@@ -76,6 +77,16 @@
         case 'v':
             finished = true;
             break;
+        case 'E':
+            int size = msg.size();
+            emit ErrorMessage(
+                tr("A fatal ERROR occured while processing the video recording! "
+                "The video could not be saved.\n\n"
+                "As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.\n\n"
+                "To report this error, please click the 'Feedback' button in the main menu!\n\n"
+                "Last engine message:\n%1")
+                .arg(QString::fromUtf8(msg.mid(2).left(size - 4))));
+            return;
         }
     }
 }
--- a/QTfrontend/net/recorder.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/net/recorder.h	Fri Aug 16 10:59:50 2019 -0600
@@ -51,6 +51,7 @@
     signals:
         void onProgress(float progress); // 0 < progress < 1
         void encodingFinished(bool success);
+        void ErrorMessage(const QString &);
 
     private:
         bool finished;
--- a/QTfrontend/net/tcpBase.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/net/tcpBase.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -21,10 +21,12 @@
 #include <QImage>
 #include <QThread>
 #include <QApplication>
+#include <QProcessEnvironment>
 
 #include "tcpBase.h"
 #include "hwconsts.h"
 #include "MessageDialog.h"
+#include "gameuiconfig.h"
 
 #ifdef HWLIBRARY
 extern "C" {
@@ -104,11 +106,12 @@
 
 }
 
-TCPBase::TCPBase(bool demoMode, QObject *parent) :
+TCPBase::TCPBase(bool demoMode, bool usesCustomLanguage, QObject *parent) :
     QObject(parent),
     m_hasStarted(false),
     m_isDemoMode(demoMode),
     m_connected(false),
+    m_usesCustomLanguage(usesCustomLanguage),
     IPCSocket(0)
 {
     process = 0;
@@ -183,6 +186,18 @@
     process->setProcessChannelMode(QProcess::ForwardedChannels);
 #endif
 
+    // If game config uses non-system locale, we set the environment
+    // of the engine first
+    if(m_usesCustomLanguage)
+    {
+        QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
+        QString hwengineLang = QLocale().name() + ".UTF8";
+        qDebug("Setting hwengine environment: LANG=%s", qPrintable(hwengineLang));
+        // TODO: Check if this is correct and works on all systems
+        env.insert("LANG", QLocale().name() + ".UTF8");
+        process->setProcessEnvironment(env);
+    }
+    qDebug("Starting hwengine ...");
     process->start(bindir->absolutePath() + "/hwengine", arguments);
 #endif
     m_hasStarted = true;
@@ -244,7 +259,7 @@
             "We are very sorry for the inconvenience :(\n\n"
             "If this keeps happening, please click the '%2' button in the main menu!")
             .arg(exitCode)
-            .arg("Feedback"));
+            .arg(QCoreApplication::translate("PageMain", "Feedback")));
 
     }
 }
--- a/QTfrontend/net/tcpBase.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/net/tcpBase.h	Fri Aug 16 10:59:50 2019 -0600
@@ -41,7 +41,7 @@
         Q_OBJECT
 
     public:
-        TCPBase(bool demoMode, QObject * parent = 0);
+        TCPBase(bool demoMode, bool usesCustomLanguage, QObject * parent = 0);
         virtual ~TCPBase();
 
         virtual bool couldBeRemoved();
@@ -80,6 +80,7 @@
 #endif
         bool m_isDemoMode;
         bool m_connected;
+        bool m_usesCustomLanguage;
         void RealStart();
         QPointer<QTcpSocket> IPCSocket;
 
Binary file QTfrontend/res/AboutIcon.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/res/AboutIcon.svg	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   height="32"
+   width="32"
+   version="1.1"
+   id="svg2">
+  <metadata
+     id="metadata8">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs6" />
+  <g
+     transform="matrix(-0.87631421,0.03741655,-0.03741655,-0.87631421,30.49124,29.594247)"
+     id="g3029">
+    <path
+       transform="rotate(3.2786745,123.04143,146.57831)"
+       id="path3005"
+       style="font-weight:bold;-inkscape-font-specification:'Blue Highway Bold';fill:#ffd200;fill-opacity:1;stroke:none;marker:none"
+       d="m 11.303256,19.777238 c -0.03334,0.33335 -0.221629,1.313768 -0.2,2.95 l 0.04383,3.315682 c 0.02469,1.867793 -5.2572313,1.747817 -5.2827504,-0.185783 l -0.042458,-3.217073 c -0.016299,-1.235012 -0.1724587,-2.214142 -0.2,-2.95 L 5.2166164,8.8621882 C 5.1452969,6.9566491 10.688148,6.9046651 10.797715,9.1976297 L 11.303252,19.777238 M 10.475624,36.052449 C 9.9512694,36.590344 9.1763118,36.97929 8.4251706,36.98741 7.571138,36.996642 6.668651,36.585565 6.0714109,35.975023 c -0.5908326,-0.603991 -0.9531814,-1.505086 -0.95,-2.35 0.00312,-0.829485 0.3773402,-1.699903 0.95,-2.3 0.5338724,-0.559451 1.3271485,-0.982489 2.1004527,-0.984961 0.8456366,-0.0027 1.7124043,0.457898 2.3037604,1.062387 0.584611,0.597594 0.996737,1.464011 1,2.3 0.0033,0.8513 -0.405757,1.740412 -1,2.35 z" />
+    <path
+       id="path3077-8"
+       d="m 15.124551,30.576638 c 0.772274,0.03998 1.590525,-0.319405 2.154304,-0.848705 0.60474,-0.567755 1.039924,-1.424446 1.088575,-2.252508 0.04956,-0.843466 -0.292495,-1.768789 -0.849279,-2.404305 -0.391658,-0.447041 -0.919699,-0.775772 -1.502223,-0.965299 0.342102,0.61227 0.566629,1.320301 0.535846,1.998773 -0.03759,0.828639 -0.483835,1.684754 -1.088575,2.25251 -0.563779,0.529298 -1.383763,0.914063 -2.154304,0.848704 -0.237104,-0.02013 -0.462709,-0.06785 -0.687858,-0.154669 0.08177,0.120329 0.157133,0.23628 0.25079,0.343174 0.331909,0.378819 0.778394,0.717828 1.252152,0.934624 0.126359,0.05142 0.264219,0.0928 0.375358,0.155388 0.206233,0.06367 0.414086,0.08138 0.625214,0.09231 z"
+       style="font-weight:bold;-inkscape-font-specification:'Blue Highway Bold';fill:#ff9c00;fill-opacity:1;stroke:none;marker:none" />
+    <path
+       id="path3077"
+       d="m 16.118586,21.50724 c 1.185947,-0.105017 2.140919,-0.508736 2.153443,-1.223703 l 0.06586,-9.517778 c 0.0129,-0.736262 -0.09761,-1.7037417 -0.038,-2.9374217 l 0.238359,-5.063061 c 0.03988,-0.8254491 -0.907744,-1.347129 -2.003587,-1.5578984 l -0.238649,4.9380614 c -0.0596,1.233681 0.0509,2.20116 0.038,2.937421 l -0.09214,9.7668847 c -0.02067,1.180155 -1.569508,1.168975 -3.498387,0.709355 -0.06542,1.381819 1.421129,1.94814 3.375093,1.94814 z"
+       style="font-weight:bold;-inkscape-font-specification:'Blue Highway Bold';fill:#ff9c00;fill-opacity:1;stroke:none;marker:none" />
+    <path
+       d="m 11.103256,22.727238 0.04544,3.426332 c 0.02477,1.867791 -5.2571451,1.747815 -5.2827511,-0.185783 L 5.821879,22.640064 C 5.8055242,21.405053 5.88445,20.378434 5.864278,19.642338 L 5.5717401,8.9675172 C 5.5195033,7.0613596 10.549292,7.3739262 10.636267,9.6678589 l 0.341581,9.0091431 c 0.07451,1.531058 0.120498,3.407284 0.125408,4.050236 z M 10.475624,36.052449 C 9.9512694,36.590344 9.1763118,36.97929 8.4251706,36.98741 7.571138,36.996642 6.668651,36.585565 6.0714109,35.975023 c -0.5908326,-0.603991 -0.9531814,-1.505086 -0.95,-2.35 0.00312,-0.829485 0.3773402,-1.699903 0.95,-2.3 0.5338724,-0.559451 1.3271485,-0.982489 2.1004527,-0.984961 0.8456366,-0.0027 1.7124043,0.457898 2.3037604,1.062387 0.584611,0.597594 0.996737,1.464011 1,2.3 0.0033,0.8513 -0.405757,1.740412 -1,2.35 z"
+       style="color:#000000;font-weight:bold;-inkscape-font-specification:'Blue Highway Bold';display:inline;overflow:visible;visibility:visible;fill:none;stroke:#120d02;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+       id="path3007"
+       transform="rotate(3.2786745,123.04143,146.57831)" />
+  </g>
+</svg>
Binary file QTfrontend/res/Challenges.png has changed
Binary file QTfrontend/res/Challenges.xcf has changed
Binary file QTfrontend/res/Scenarios.png has changed
Binary file QTfrontend/res/StatsH.png has changed
Binary file QTfrontend/res/Trainings.png has changed
Binary file QTfrontend/res/Trainings_en.png has changed
Binary file QTfrontend/res/btnSwitchHog.png has changed
Binary file QTfrontend/res/btnSwitchHog@2x.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/res/credits.csv	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,181 @@
+S,"Project founder",,,
+E,,"Andrey Korotaev","unC0Rr@gmail.com","unC0Rr"
+S,"Programming",,,
+U,"Game engine",,,
+E,"Creator","Andrey Korotaev","unC0Rr@gmail.com","unC0Rr"
+E,"Many engine improvements","Derek Pomery","nemo@m8y.org","nemo"
+E,"Many engine improvements","Carlos Vives","mail@carlosvives.es",
+E,"Many engine improvements","Richard Karolyi","sheepluva@ercatec.net","sheepluva"
+E,,,"Wuzzy2@mail.ru","Wuzzy"
+E,,"Henrik Rostedt","henrik.rostedt@gmail.com",
+E,"Gamepad and Lua integration","Mario Liebisch","mario.liebisch@gmail.com",
+E,"Campaign support","Szabolcs Orbàn","szabibibi@gmail.com",
+E,"Theme customization improvements",,,"KoBeWi"
+E,"Some Pas2C and GLES2 work","Meng Xiangyun","xymengxy@gmail.com",
+E,"Video recording","Stepan Podoskin","stepik-777@mail.ru",
+E,"Other improvements","Valentin Kraevskiy",,"alfadur"
+U,"Map generation",,,
+E,"Core map generators","Andrey Korotaev","unC0Rr@gmail.com","unC0Rr"
+E,"Perlin maps and other improvements","Derek Pomery","nemo@m8y.org","nemo"
+E,"Maze maps","Henning Kühn","prg@cooco.de",
+U,"Weapons",,,
+E,"Most core weapons","Andrey Korotaev","unC0Rr@gmail.com","unC0Rr"
+E,"Air mine, rubber, others","Derek Pomery","nemo@m8y.org","nemo"
+E,"Drill rocket, ballgun, RC plane","Martin Boze","afffect@gmail.com",
+E,"Freezer","Julia Struchenko","urbertar@gmail.com",
+E,"Mine number and time game settings","David A. Cuadrado","krawek@gmail.com",
+M,,,,
+U,"Frontend / main menu",,,
+E,"Creator","Andrey Korotaev","unC0Rr@gmail.com","unC0Rr"
+E,"Many frontend improvements","Derek Pomery","nemo@m8y.org","nemo"
+E,"Many frontend improvements","Richard Karolyi","sheepluva@ercatec.net","sheepluva"
+E,"Many frontend improvements","Igor Ulyanov","disinbox@gmail.com",
+E,"Keybinds, feedback, maps and hats interfaces","Drew Gottlieb","gottlieb.drew@gmail.com",
+E,"Login dialogs, other improvements","Ondrej Skopek","skopekondrej@gmail.com",
+E,,,"Wuzzy2@mail.ru","Wuzzy"
+E,,"Martin Minarik","ttsmj@pokec.sk",
+E,,"Kristian Lehmann","email@thexception.net",
+E,,"Henrik Rostedt","henrik.rostedt@gmail.com",
+E,,"Mayur Pawashe","zorgiepoo@gmail.com",
+E,,"Valentin Kraevskiy",,"alfadur"
+U,"Missions and styles",,,
+E,"A Classic Fairytale","Szabolcs Orbàn","szabibibi@gmail.com",
+E,"A Space Adventure",,,"Master_ex"
+E,"Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW",,,"mikade"
+E,"Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance",,"Wuzzy2@mail.ru","Wuzzy"
+E,"Some styles and missions","John Lambert","redgrinner@gmail.com","redgrinner"
+E,"Battalion",,"Anachron14@gmx.de","Anachron"
+E,"Continental supplies",,,"Vatten"
+E,"Teamwork 2",,,"Arkhnen"
+E,"Climb Home","Derek Pomery","nemo@m8y.org","nemo"
+E,"Portal Mind Challenge",,,"sphrix"
+M,,,,
+U,"Game server",,,
+E,"Creator","Andrey Korotaev","unC0Rr@gmail.com","unC0Rr"
+M,,,,
+U,"Ports",,,
+E,"macOS/iPhone port, OpenGL-ES conversion","Vittorio Giovara","vittorio.giovara@gmail.com",
+E,"Android port","Richard Deurwaarder","xeli@xelification.com","xeli"
+E,"Android netplay, portability abstraction","Simeon Maxein","smaxein@googlemail.com",
+E,"WebGL port","Meng Xiangyun","xymengxy@gmail.com",
+E,"iPhone/iPad ports","Anton Malmygin","antonc27@mail.ru","antonc27"
+S,"Graphics",,,
+U,"General",,,
+E,,"John Dum","fizzy@gmail.com",
+E,,"Joshua Frese","joshfrese@gmail.com",
+E,,"Stanko Tadić","stanko@mfhinc.net",
+E,,"Julien Koesten","julienkoesten@aol.com",
+E,,"Joshua O'Sullivan","coheedftw@hotmail.co.uk",
+E,,"Nils Lück","nils.luck.design@gmail.com",
+E,,"Guillaume Englert","genglert@hybird.org",
+E,,,"ppicondo.cvac@gmail.com","CopherNeue"
+E,,"Valentin Kraevskiy",,"alfadur"
+E,,"Carlos Vives","mail@carlosvives.es",
+U,"Themes",,,
+E,"Nature, Snow, City, Castle, Halloween, Island","John Dum","fizzy@gmail.com",
+E,"Bamboo, EarthRise, BambooPlinko","Joshua Frese","joshfrese@gmail.com",
+E,"Golf, Hoggywood, Stage",,,"RoFra"
+E,"Hoggywood",,"Wuzzy2@mail.ru","Wuzzy"
+E,"Cave, Olympics","Guillaume Englert","genglert@hybird.org",
+E,"Fruit, Cake","Randy Broda",,"Randy"
+E,"Art",,,"Zippy"
+E,"Beach",,"ppicondo.cvac@gmail.com","CopherNeue"
+E,"Beach",,,"Miguelac"
+E,"Brick",,,"AlexYeCu"
+E,"Hell","Stanko Tadić","stanko@mfhinc.net",
+E,"Jungle",,,"KoRn666"
+E,"Sheep","Julien Koesten","julienkoesten@aol.com",
+M,,,,
+U,"Maps",,,
+E,"Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree","John Dum","fizzy@gmail.com",
+E,"SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle","Chucklefish, Ltd",,
+E,"Bamboo, Blox, Cake, Cogs, EarthRise, Freeway","Joshua Frese","joshfrese@gmail.com",
+E,"Castle, PirateFlag","Stanko Tadić","stanko@mfhinc.net",
+E,"ShoppaKing, TrophyRace",,,"wolfmarc"
+E,"ShoppaKing, TrophyRace",,,"Dragonfly"
+E,"Battlefield",,,"nickstu"
+E,"CTF_Blizzard",,,"Palewolf"
+E,"Cheese",,"ppicondo.cvac@gmail.com","CopherNeue"
+E,"ClimbHome","Derek Pomery","nemo@m8y.org","nemo"
+E,"Lonely_Island","Maciej Mrozinski","mynick2@o2.pl","alzen"
+E,"Octorama",,,"jessor"
+E,"portal",,,"sphrix"
+E,"Ruler","Guillaume Englert","genglert@hybrid.org",
+E,"Sticks",,,"dctPL"
+M,,,,
+U,"Forts",,,
+E,"EvilChicken",,,"Dragonfly"
+E,"Lonely_Island","Maciej Mrozinski","mynick2@o2.pl","alzen"
+E,"Olympic","Guillaume Englert","genglert@hybird.org",
+E,"Olympic",,"Wuzzy2@mail.ru","Wuzzy"
+E,"Tank","Carlos Vives","mail@carlosvives.es",
+E,"Snail","John Dum","fizzy@gmail.com",
+E,"Snail",,"Wuzzy2@mail.ru","Wuzzy"
+E,"SteelTower","Randy Broda",,"Randy"
+M,,,,
+U,"Hats, graves, other",,,
+E,"See CREDITS text file",,,
+S,"Sounds",,,
+E,"Hedgehogs voice","Stephen Alexander","ArmagonNo1@gmail.com","Armagon"
+E,"Default_pl, Russian_pl voices",,"mtg90pl@gmail.com","mtg90pl"
+E,,"John Dum","fizzy@gmail.com",
+E,,"Jonatan Nilsson","jonatanfan@gmail.com",
+E,,"Daniel Martin","elhombresinremedio@gmail.com","HSR"
+E,"Various authors from www.freesound.org (see CREDITS text file)",,
+S,"Music",,,
+E,"City, Rock, others","Daniel Martin","elhombresinremedio@gmail.com","HSR"
+E,"Compost",,,"HG"
+E,"EarthRise, oriental, Pirate, snow","Jonatan Nilsson","jonatanfan@gmail.com",
+E,"Fruit, Jungle","Valentin Kraevskiy",,"alfadur"
+E,"Nature","John Dum","fizzy@gmail.com",
+E,"olympics_sd",,,"yd &lt;http://opengameart.org/users/yd&gt;"
+E,"sdmusic (Hitman [sheepluva edit])","Kevin MacLeod",,
+M,,,,
+S,"Translations",,,
+E,"Brazilian Portuguese","Romulo Fernandes Machado","abra185@gmail.com",
+E,"Bulgarian","Svetoslav Stefanov",,
+E,"Czech","Petr Řezáček","rezacek@gmail.com",
+E,"Chinese","Jie Luo","lililjlj@gmail.com",
+E,"Chinese",,"yuenfu.chiu@gmail.com","yuenfu"
+E,"Finnish","Nina Kuisma","ninnnu@gmail.com",
+E,"Finnish","Janne Uusitupa",,
+E,"French","Antoine Turmel","geekshadow@gmail.com",
+E,"French","Clement Woitrain","sphrixclement@gmail.com",
+E,"French",,,"Matisumi"
+E,"French",,,"Case_Of"
+E,"German","Peter Hüwe","PeterHuewe@gmx.de",
+E,"German","Mario Liebisch","mario.liebisch@gmail.com",
+E,"German","Richard Karolyi","sheepluva@ercatec.net","sheepluva"
+E,"German",,"Wuzzy2@mail.ru","Wuzzy"
+E,"Greek",,"talos_kriti@yahoo.gr",
+E,"Italian","Luca Bonora","bonora.luca@gmail.com",
+E,"Italian","Marco Bresciani","m.bresciani@email.it",
+E,"Italian","Gianfranco Costamagna","costamagnagianfranco@yahoo.it",
+E,"Italian",,"enricobe@hotmail.com","Enrico"
+E,"Japanese","ADAM Etienne","etienne.adam@gmail.com",
+E,"Japanese","Marco Bresciani","m.bresciani@email.it",
+E,"Korean","Anthony Bellew","anthonyreflected@gmail.com",
+E,"Lithuanian","Lukas Urbonas","lukasu08@gmail.com",
+E,"Polish","Maciej Mroziński","mynick2@o2.pl","alzen"
+E,"Polish","Wojciech Latkowski","magik17l@gmail.com",
+E,"Polish","Piotr Mitana",,
+E,"Polish","Maciej Górny",,
+E,"Polish",,,"KoBeWi"
+E,"Portuguese","Fábio Canário","inufabie@gmail.com",
+E,"Russian","Andrey Korotaev","unC0Rr@gmail.com","unC0Rr"
+E,"Russian","Vitaly Novichkov","admin@wohlnet.ru",
+E,"Russian","Anton Malmygin","antonc27@mail.ru","antonc27"
+E,"Russian","Grigory Ustinov","grenka@altlinux.org","grenka"
+E,"Scottish Gaelic",,,"GunChleoc"
+E,"Slovak","Jose Riha",,
+E,"Spanish","Carlos Vives","mail@carlosvives.es",
+E,"Swedish","Niklas Grahn","raewolusjoon@yaoo.com",
+E,"Swedish","Henrik Rostedt","henrik.rostedt@gmail.com",
+E,"Ukrainian","Eugene V. Lyubimkin","jackyf.devel@gmail.com",
+E,"Ukrainian","Igor Paliychuk","mansonigor@gmail.com",
+E,"Ukrainian","Eugene Sakara","eresid@gmail.com",
+S,"Special thanks",,,
+E,,"Aleksey Andreev","blaknayabr@gmail.com",,
+E,,"Aleksander Rudalev","alexv@pomorsu.ru",,
+E,,"Natasha Korotaeva","layout@pisem.net",,
+E,,"Adam Higerd",,"ahigerd"
--- a/QTfrontend/res/css/april1.css	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/res/css/april1.css	Fri Aug 16 10:59:50 2019 -0600
@@ -111,10 +111,6 @@
 background-color: #150A61;
 }
 
-QToolButton:pressed {
-background-color: #100744;
-}
-
 QLineEdit, QListWidget, QListView, QTableView, QTableWidget, QTextBrowser,
 QSpinBox, QToolBox, QPlainTextEdit, QToolButton, #mapPreview, #labelLikeLineEdit {
 border-radius: 10px;
@@ -180,6 +176,11 @@
 
 QPushButton:pressed, QToolButton:pressed {
 border-color: white;
+background-color: #344b1e;
+color: white;
+}
+TeamShowWidget QPushButton:pressed {
+background-color: #362c7a;
 }
 
 QPushButton:focus {
@@ -202,11 +203,12 @@
 border-bottom-width: 0px;
 border-color: #001d10;
 border-style: solid;
-background-color: #00351d;
+background-color: #005F35;
 padding: 4px;
 }
 QHeaderView::section:pressed {
-background-color: #00250d;
+background-color: #005A33;
+border-color: #FFFFFF;
 }
 QHeaderView::up-arrow {
 image: url(":/res/sort_up.png");
@@ -236,6 +238,7 @@
 background: transparent;
 width: 16px;
 height: 10px;
+padding-top: 1px;
 }
 
 QSpinBox::up-arrow {
@@ -256,8 +259,13 @@
 background: transparent;
 width: 16px;
 height: 10px;
+padding-top: 1px;
 }
 
+QSpinBox, QLineEdit {
+padding: 3px;
+min-height: 18px;
+}
 QComboBox {
 border-radius: 10px;
 padding: 3px;
@@ -410,10 +418,80 @@
 border-color: #F6CB1C;
 }
 
-#hatList QScrollBar, #themeList QScrollBar {
-background-color: #130F2A;
-border-top-right-radius: 10px;
-border-bottom-right-radius: 10px;
+QScrollBar:vertical {
+border: none;
+color: #FFD902;
+background: #00321c;
+width: 15px;
+margin: 17px 0 17px 0;
+}
+QScrollBar:horizontal {
+border: none;
+color: #FFD902;
+background: #00321c;
+height: 15px;
+margin: 0 17px 0 17px;
+}
+QScrollBar::handle:vertical {
+background: #00321c;
+border: 1px solid #005F35;
+border-radius: 2px;
+min-height: 20px;
+}
+QScrollBar::handle:horizontal {
+background: #00321c;
+border: 1px solid #005F35;
+border-radius: 2px;
+min-width: 20px;
+}
+QScrollBar::handle:pressed {
+background: #005a33;
+border-color: #FFFFFF;
+}
+QScrollBar::add-line, QScrollBar::sub-line {
+border: 1px solid #005F35;
+border-radius: 2px;
+background: #00321c;
+subcontrol-origin: margin;
+}
+QScrollBar::add-line:vertical {
+height: 15px;
+subcontrol-position: bottom;
+}
+QScrollBar::sub-line:vertical {
+height: 15px;
+subcontrol-position: top;
+}
+QScrollBar::add-line:horizontal {
+width: 15px;
+subcontrol-position: right;
+}
+QScrollBar::sub-line:horizontal {
+width: 15px;
+subcontrol-position: left;
+}
+QScrollBar::add-line:pressed, QScrollBar::sub-line:pressed {
+background: #005a33;
+border-color: #FFFFFF;
+}
+
+QScrollBar::up-arrow {
+background-image: url(":/res/scroll_up.png");
+}
+QScrollBar::down-arrow {
+background-image: url(":/res/scroll_down.png");
+}
+QScrollBar::left-arrow {
+background-image: url(":/res/scroll_left.png");
+}
+QScrollBar::right-arrow {
+background-image: url(":/res/scroll_right.png");
+}
+QScrollBar::add-page, QScrollBar::sub-page {
+background: #00190F;
+}
+QScrollBar::add-page:pressed, QScrollBar::sub-page:pressed {
+background: #008751;
 }
 
 #hatList, #themeList {
@@ -442,7 +520,7 @@
 background-color: #150A61;
 }
 
-QDialogButtonBox QPushButton {
+.QPushButton, .QPushButtonWithSound {
 padding: 3px 5px;
 }
 
@@ -458,3 +536,36 @@
 PageMultiplayer TeamSelWidget {
 min-height: 500px;
 }
+
+QProgressBar {
+border: 3px solid #FFCC00;
+background-color: #150A61;
+border-radius: 5px;
+text-align: center;
+color: #FFFFFF;
+}
+QProgressBar::chunk {
+background-color: #FF9B00;
+margin: 2px;
+}
+#keyBinderScrollArea {
+background: #130F2A;
+}
+#chatContainer {
+border-width: 0px;
+background-color: #ffcc00;
+border-radius: 10px;
+}
+#chatText {
+background-color: rgb(23, 11, 54);
+border-width: 0px;
+}
+#trainingList {
+border-style: none;
+padding-top: 6px;
+}
+#trainingList::item
+{
+padding-top: 2px;
+padding-bottom: 2px;
+}
--- a/QTfrontend/res/css/birthday.css	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/res/css/birthday.css	Fri Aug 16 10:59:50 2019 -0600
@@ -115,10 +115,6 @@
 background-color: #150A61;
 }
 
-QToolButton:pressed {
-background-color: #100744;
-}
-
 QLineEdit, QListWidget, QListView, QTableView, QTableWidget, QTextBrowser,
 QSpinBox, QToolBox, QPlainTextEdit, QToolButton, #mapPreview, #labelLikeLineEdit {
 border-radius: 10px;
@@ -184,6 +180,11 @@
 
 QPushButton:pressed, QToolButton:pressed {
 border-color: white;
+background-color: rgba(40, 40, 40, 100%); /* CUSTOM */
+color: white;
+}
+TeamShowWidget QPushButton:pressed {
+background-color: #202020; /* CUSTOM */
 }
 
 QPushButton:focus {
@@ -191,7 +192,7 @@
 }
 
 QHeaderView {
-background-color: #00351d;
+background-color: #000000;
 border: solid;
 border-bottom-width: 3px;
 border-top-width: 0px;
@@ -204,13 +205,14 @@
 border-right-width: 1px;
 border-top-width: 0;
 border-bottom-width: 0px;
-border-color: #001d10;
+border-color: #5A5A5A;
 border-style: solid;
-background-color: #00351d;
+background-color: #000000;
 padding: 4px;
 }
 QHeaderView::section:pressed {
-background-color: #00250d;
+background-color: #333333;
+border-color: #FFFFFF;
 }
 QHeaderView::up-arrow {
 image: url(":/res/sort_up.png");
@@ -240,6 +242,7 @@
 background: transparent;
 width: 16px;
 height: 10px;
+padding-top: 1px;
 }
 
 QSpinBox::up-arrow {
@@ -260,8 +263,13 @@
 background: transparent;
 width: 16px;
 height: 10px;
+padding-top: 1px;
 }
 
+QSpinBox, QLineEdit {
+padding: 3px;
+min-height: 18px;
+}
 QComboBox {
 border-radius: 10px;
 padding: 3px;
@@ -414,10 +422,80 @@
 border-color: #F6CB1C;
 }
 
-#hatList QScrollBar, #themeList QScrollBar {
-background-color: #130F2A;
-border-top-right-radius: 10px;
-border-bottom-right-radius: 10px;
+QScrollBar:vertical {
+border: none;
+color: #FFD902;
+background: black; /*CUSTOM */
+width: 15px;
+margin: 17px 0 17px 0;
+}
+QScrollBar:horizontal {
+border: none;
+color: #FFD902;
+background: black; /* CUSTOM */
+height: 15px;
+margin: 0 17px 0 17px;
+}
+QScrollBar::handle:vertical {
+background: #3d1b3f; /* CUSTOM */
+border: 1px solid #b465b8; /* CUSTOM */
+border-radius: 2px;
+min-height: 20px;
+}
+QScrollBar::handle:horizontal {
+background: #3d1b3f; /* CUSTOM */
+border: 1px solid #b465b8; /* CUSTOM */
+border-radius: 2px;
+min-width: 20px;
+}
+QScrollBar::handle:pressed {
+background: #622b66; /* CUSTOM */
+border-color: #FFFFFF;
+}
+QScrollBar::add-line, QScrollBar::sub-line {
+border: 1px solid #b465b8; /* CUSTOM */
+border-radius: 2px;
+background: #3d1b3f; /* CUSTOM */
+subcontrol-origin: margin;
+}
+QScrollBar::add-line:vertical {
+height: 15px;
+subcontrol-position: bottom;
+}
+QScrollBar::sub-line:vertical {
+height: 15px;
+subcontrol-position: top;
+}
+QScrollBar::add-line:horizontal {
+width: 15px;
+subcontrol-position: right;
+}
+QScrollBar::sub-line:horizontal {
+width: 15px;
+subcontrol-position: left;
+}
+QScrollBar::add-line:pressed, QScrollBar::sub-line:pressed {
+background: #622b66; /* CUSTOM */
+border-color: #FFFFFF;
+}
+
+QScrollBar::up-arrow {
+background-image: url(":/res/scroll_up.png");
+}
+QScrollBar::down-arrow {
+background-image: url(":/res/scroll_down.png");
+}
+QScrollBar::left-arrow {
+background-image: url(":/res/scroll_left.png");
+}
+QScrollBar::right-arrow {
+background-image: url(":/res/scroll_right.png");
+}
+QScrollBar::add-page, QScrollBar::sub-page {
+background: black; /* CUSTOM */
+}
+QScrollBar::add-page:pressed, QScrollBar::sub-page:pressed {
+background: #808080; /* CUSTOM */
 }
 
 #hatList, #themeList {
@@ -446,7 +524,7 @@
 background-color: #150A61;
 }
 
-QDialogButtonBox QPushButton {
+.QPushButton, .QPushButtonWithSound {
 padding: 3px 5px;
 }
 
@@ -462,3 +540,36 @@
 PageMultiplayer TeamSelWidget {
 min-height: 500px;
 }
+
+QProgressBar {
+border: 3px solid #FFCC00;
+background-color: black; /* CUSTOM */
+border-radius: 5px;
+text-align: center;
+color: #FFFFFF;
+}
+QProgressBar::chunk {
+background-color: #FF9B00;
+margin: 2px;
+}
+#keyBinderScrollArea {
+background: #100308; /* CUSTOM */
+}
+#chatContainer {
+border-width: 0px;
+background-color: #ffcc00;
+border-radius: 10px;
+}
+#chatText {
+background-color: rgb(23, 11, 54);
+border-width: 0px;
+}
+#trainingList {
+border-style: none;
+padding-top: 6px;
+}
+#trainingList::item
+{
+padding-top: 2px;
+padding-bottom: 2px;
+}
--- a/QTfrontend/res/css/christmas.css	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/res/css/christmas.css	Fri Aug 16 10:59:50 2019 -0600
@@ -110,10 +110,6 @@
 background-color: #150A61;
 }
 
-QToolButton:pressed {
-background-color: #100744;
-}
-
 QLineEdit, QListWidget, QListView, QTableView, QTableWidget, QTextBrowser,
 QSpinBox, QToolBox, QPlainTextEdit, QToolButton, #mapPreview, #labelLikeLineEdit {
 border-radius: 10px;
@@ -179,6 +175,11 @@
 
 QPushButton:pressed, QToolButton:pressed {
 border-color: white;
+background-color: #344b1e;
+color: white;
+}
+TeamShowWidget QPushButton:pressed {
+background-color: #362c7a;
 }
 
 QPushButton:focus {
@@ -201,11 +202,12 @@
 border-bottom-width: 0px;
 border-color: #001d10;
 border-style: solid;
-background-color: #00351d;
+background-color: #005F35;
 padding: 4px;
 }
 QHeaderView::section:pressed {
-background-color: #00250d;
+background-color: #005A33;
+border-color: #FFFFFF;
 }
 QHeaderView::up-arrow {
 image: url(":/res/sort_up.png");
@@ -235,6 +237,7 @@
 background: transparent;
 width: 16px;
 height: 10px;
+padding-top: 1px;
 }
 
 QSpinBox::up-arrow {
@@ -255,8 +258,13 @@
 background: transparent;
 width: 16px;
 height: 10px;
+padding-top: 1px;
 }
 
+QSpinBox, QLineEdit {
+padding: 3px;
+min-height: 18px;
+}
 QComboBox {
 border-radius: 10px;
 padding: 3px;
@@ -409,10 +417,80 @@
 border-color: #F6CB1C;
 }
 
-#hatList QScrollBar, #themeList QScrollBar {
-background-color: #130F2A;
-border-top-right-radius: 10px;
-border-bottom-right-radius: 10px;
+QScrollBar:vertical {
+border: none;
+color: #FFD902;
+background: #00321c;
+width: 15px;
+margin: 17px 0 17px 0;
+}
+QScrollBar:horizontal {
+border: none;
+color: #FFD902;
+background: #00321c;
+height: 15px;
+margin: 0 17px 0 17px;
+}
+QScrollBar::handle:vertical {
+background: #00321c;
+border: 1px solid #005F35;
+border-radius: 2px;
+min-height: 20px;
+}
+QScrollBar::handle:horizontal {
+background: #00321c;
+border: 1px solid #005F35;
+border-radius: 2px;
+min-width: 20px;
+}
+QScrollBar::handle:pressed {
+background: #005a33;
+border-color: #FFFFFF;
+}
+QScrollBar::add-line, QScrollBar::sub-line {
+border: 1px solid #005F35;
+border-radius: 2px;
+background: #00321c;
+subcontrol-origin: margin;
+}
+QScrollBar::add-line:vertical {
+height: 15px;
+subcontrol-position: bottom;
+}
+QScrollBar::sub-line:vertical {
+height: 15px;
+subcontrol-position: top;
+}
+QScrollBar::add-line:horizontal {
+width: 15px;
+subcontrol-position: right;
+}
+QScrollBar::sub-line:horizontal {
+width: 15px;
+subcontrol-position: left;
+}
+QScrollBar::add-line:pressed, QScrollBar::sub-line:pressed {
+background: #005a33;
+border-color: #FFFFFF;
+}
+
+QScrollBar::up-arrow {
+background-image: url(":/res/scroll_up.png");
+}
+QScrollBar::down-arrow {
+background-image: url(":/res/scroll_down.png");
+}
+QScrollBar::left-arrow {
+background-image: url(":/res/scroll_left.png");
+}
+QScrollBar::right-arrow {
+background-image: url(":/res/scroll_right.png");
+}
+QScrollBar::add-page, QScrollBar::sub-page {
+background: #00190F;
+}
+QScrollBar::add-page:pressed, QScrollBar::sub-page:pressed {
+background: #008751;
 }
 
 #hatList, #themeList {
@@ -441,7 +519,7 @@
 background-color: #150A61;
 }
 
-QDialogButtonBox QPushButton {
+.QPushButton, .QPushButtonWithSound {
 padding: 3px 5px;
 }
 
@@ -457,3 +535,36 @@
 PageMultiplayer TeamSelWidget {
 min-height: 500px;
 }
+
+QProgressBar {
+border: 3px solid #FFCC00;
+background-color: #150A61;
+border-radius: 5px;
+text-align: center;
+color: #FFFFFF;
+}
+QProgressBar::chunk {
+background-color: #FF9B00;
+margin: 2px;
+}
+#keyBinderScrollArea {
+background: #130F2A;
+}
+#chatContainer {
+border-width: 0px;
+background-color: #ffcc00;
+border-radius: 10px;
+}
+#chatText {
+background-color: rgb(23, 11, 54);
+border-width: 0px;
+}
+#trainingList {
+border-style: none;
+padding-top: 6px;
+}
+#trainingList::item
+{
+padding-top: 2px;
+padding-bottom: 2px;
+}
--- a/QTfrontend/res/css/easter.css	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/res/css/easter.css	Fri Aug 16 10:59:50 2019 -0600
@@ -107,10 +107,6 @@
 background-color: #150A61;
 }
 
-QToolButton:pressed {
-background-color: #100744;
-}
-
 QLineEdit, QListWidget, QListView, QTableView, QTableWidget, QTextBrowser,
 QSpinBox, QToolBox, QPlainTextEdit, QToolButton, #mapPreview, #labelLikeLineEdit {
 border-radius: 10px;
@@ -176,6 +172,11 @@
 
 QPushButton:pressed, QToolButton:pressed {
 border-color: white;
+background-color: #344b1e;
+color: white;
+}
+TeamShowWidget QPushButton:pressed {
+background-color: #362c7a;
 }
 
 QPushButton:focus {
@@ -198,11 +199,12 @@
 border-bottom-width: 0px;
 border-color: #001d10;
 border-style: solid;
-background-color: #00351d;
+background-color: #005F35;
 padding: 4px;
 }
 QHeaderView::section:pressed {
-background-color: #00250d;
+background-color: #005A33;
+border-color: #FFFFFF;
 }
 QHeaderView::up-arrow {
 image: url(":/res/sort_up.png");
@@ -232,6 +234,7 @@
 background: transparent;
 width: 16px;
 height: 10px;
+padding-top: 1px;
 }
 
 QSpinBox::up-arrow {
@@ -252,8 +255,13 @@
 background: transparent;
 width: 16px;
 height: 10px;
+padding-top: 1px;
 }
 
+QSpinBox, QLineEdit {
+padding: 3px;
+min-height: 18px;
+}
 QComboBox {
 border-radius: 10px;
 padding: 3px;
@@ -406,12 +414,81 @@
 border-color: #F6CB1C;
 }
 
-#hatList QScrollBar, #themeList QScrollBar {
-background-color: #130F2A;
-border-top-right-radius: 10px;
-border-bottom-right-radius: 10px;
+QScrollBar:vertical {
+border: none;
+color: #FFD902;
+background: #00321c;
+width: 15px;
+margin: 17px 0 17px 0;
+}
+QScrollBar:horizontal {
+border: none;
+color: #FFD902;
+background: #00321c;
+height: 15px;
+margin: 0 17px 0 17px;
+}
+QScrollBar::handle:vertical {
+background: #00321c;
+border: 1px solid #005F35;
+border-radius: 2px;
+min-height: 20px;
+}
+QScrollBar::handle:horizontal {
+background: #00321c;
+border: 1px solid #005F35;
+border-radius: 2px;
+min-width: 20px;
+}
+QScrollBar::handle:pressed {
+background: #005a33;
+border-color: #FFFFFF;
+}
+QScrollBar::add-line, QScrollBar::sub-line {
+border: 1px solid #005F35;
+border-radius: 2px;
+background: #00321c;
+subcontrol-origin: margin;
+}
+QScrollBar::add-line:vertical {
+height: 15px;
+subcontrol-position: bottom;
+}
+QScrollBar::sub-line:vertical {
+height: 15px;
+subcontrol-position: top;
+}
+QScrollBar::add-line:horizontal {
+width: 15px;
+subcontrol-position: right;
+}
+QScrollBar::sub-line:horizontal {
+width: 15px;
+subcontrol-position: left;
+}
+QScrollBar::add-line:pressed, QScrollBar::sub-line:pressed {
+background: #005a33;
+border-color: #FFFFFF;
 }
 
+QScrollBar::up-arrow {
+background-image: url(":/res/scroll_up.png");
+}
+QScrollBar::down-arrow {
+background-image: url(":/res/scroll_down.png");
+}
+QScrollBar::left-arrow {
+background-image: url(":/res/scroll_left.png");
+}
+QScrollBar::right-arrow {
+background-image: url(":/res/scroll_right.png");
+}
+QScrollBar::add-page, QScrollBar::sub-page {
+background: #00190F;
+}
+QScrollBar::add-page:pressed, QScrollBar::sub-page:pressed {
+background: #008751;
+}
 #hatList, #themeList {
 border-color: #F6CB1C;
 border-width: 3px;
@@ -438,7 +515,7 @@
 background-color: #150A61;
 }
 
-QDialogButtonBox QPushButton {
+.QPushButton, .QPushButtonWithSound {
 padding: 3px 5px;
 }
 
@@ -454,3 +531,36 @@
 PageMultiplayer TeamSelWidget {
 min-height: 500px;
 }
+
+QProgressBar {
+border: 3px solid #FFCC00;
+background-color: #150A61;
+border-radius: 5px;
+text-align: center;
+color: #FFFFFF;
+}
+QProgressBar::chunk {
+background-color: #FF9B00;
+margin: 2px;
+}
+#keyBinderScrollArea {
+background: #130F2A;
+}
+#chatContainer {
+border-width: 0px;
+background-color: #ffcc00;
+border-radius: 10px;
+}
+#chatText {
+background-color: rgb(23, 11, 54);
+border-width: 0px;
+}
+#trainingList {
+border-style: none;
+padding-top: 6px;
+}
+#trainingList::item
+{
+padding-top: 2px;
+padding-bottom: 2px;
+}
--- a/QTfrontend/res/css/qt.css	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/res/css/qt.css	Fri Aug 16 10:59:50 2019 -0600
@@ -93,6 +93,9 @@
 TeamShowWidget QPushButton:disabled {
 color: #a0a0a0;
 }
+TeamShowWidget QPushButton:pressed {
+background-color: #362c7a;
+}
 
 QToolButton {
 background-color: #11084A;
@@ -102,10 +105,6 @@
 background-color: #150A61;
 }
 
-QToolButton:pressed {
-background-color: #100744;
-}
-
 QLineEdit, QListWidget, QListView, QTableView, QTableWidget, QTextBrowser,
 QSpinBox, QToolBox, QPlainTextEdit, QToolButton, #mapPreview, #labelLikeLineEdit {
 border-radius: 10px;
@@ -171,6 +170,8 @@
 
 QPushButton:pressed, QToolButton:pressed {
 border-color: white;
+background-color: #344b1e;
+color: white;
 }
 
 QPushButton:focus {
@@ -191,13 +192,14 @@
 border-right-width: 1px;
 border-top-width: 0;
 border-bottom-width: 0px;
-border-color: #001d10;
+border-color: #005F35;
 border-style: solid;
 background-color: #00351d;
 padding: 4px;
 }
 QHeaderView::section:pressed {
-background-color: #00250d;
+background-color: #005A33;
+border-color: #FFFFFF;
 }
 QHeaderView::up-arrow {
 image: url(":/res/sort_up.png");
@@ -227,6 +229,7 @@
 background: transparent;
 width: 16px;
 height: 10px;
+padding-top: 1px;
 }
 
 QSpinBox::up-arrow {
@@ -247,8 +250,13 @@
 background: transparent;
 width: 16px;
 height: 10px;
+padding-bottom: 1px;
 }
 
+QSpinBox, QLineEdit {
+padding: 3px;
+min-height: 18px;
+}
 QComboBox {
 border-radius: 10px;
 padding: 3px;
@@ -401,10 +409,80 @@
 border-color: #F6CB1C;
 }
 
-#hatList QScrollBar, #themeList QScrollBar {
-background-color: #130F2A;
-border-top-right-radius: 10px;
-border-bottom-right-radius: 10px;
+QScrollBar:vertical {
+border: none;
+color: #FFD902;
+background: #00321c;
+width: 15px;
+margin: 17px 0 17px 0;
+}
+QScrollBar:horizontal {
+border: none;
+color: #FFD902;
+background: #00321c;
+height: 15px;
+margin: 0 17px 0 17px;
+}
+QScrollBar::handle:vertical {
+background: #00321c;
+border: 1px solid #005F35;
+border-radius: 2px;
+min-height: 20px;
+}
+QScrollBar::handle:horizontal {
+background: #00321c;
+border: 1px solid #005F35;
+border-radius: 2px;
+min-width: 20px;
+}
+QScrollBar::handle:pressed {
+background: #005a33;
+border-color: #FFFFFF;
+}
+QScrollBar::add-line, QScrollBar::sub-line {
+border: 1px solid #005F35;
+border-radius: 2px;
+background: #00321c;
+subcontrol-origin: margin;
+}
+QScrollBar::add-line:vertical {
+height: 15px;
+subcontrol-position: bottom;
+}
+QScrollBar::sub-line:vertical {
+height: 15px;
+subcontrol-position: top;
+}
+QScrollBar::add-line:horizontal {
+width: 15px;
+subcontrol-position: right;
+}
+QScrollBar::sub-line:horizontal {
+width: 15px;
+subcontrol-position: left;
+}
+QScrollBar::add-line:pressed, QScrollBar::sub-line:pressed {
+background: #005a33;
+border-color: #FFFFFF;
+}
+
+QScrollBar::up-arrow {
+background-image: url(":/res/scroll_up.png");
+}
+QScrollBar::down-arrow {
+background-image: url(":/res/scroll_down.png");
+}
+QScrollBar::left-arrow {
+background-image: url(":/res/scroll_left.png");
+}
+QScrollBar::right-arrow {
+background-image: url(":/res/scroll_right.png");
+}
+QScrollBar::add-page, QScrollBar::sub-page {
+background: #00190F;
+}
+QScrollBar::add-page:pressed, QScrollBar::sub-page:pressed {
+background: #008751;
 }
 
 #hatList, #themeList {
@@ -433,7 +511,7 @@
 background-color: #150A61;
 }
 
-QDialogButtonBox QPushButton {
+.QPushButton, .QPushButtonWithSound {
 padding: 3px 5px;
 }
 
@@ -449,3 +527,36 @@
 PageMultiplayer TeamSelWidget {
 min-height: 500px;
 }
+
+QProgressBar {
+border: 3px solid #FFCC00;
+background-color: #150A61;
+border-radius: 5px;
+text-align: center;
+color: #FFFFFF;
+}
+QProgressBar::chunk {
+background-color: #FF9B00;
+margin: 2px;
+}
+#keyBinderScrollArea {
+background: #130F2A;
+}
+#chatContainer {
+border-width: 0px;
+background-color: #ffcc00;
+border-radius: 10px;
+}
+#chatText {
+background-color: rgb(23, 11, 54);
+border-width: 0px;
+}
+#trainingList {
+border-style: none;
+padding-top: 6px;
+}
+#trainingList::item
+{
+padding-top: 2px;
+padding-bottom: 2px;
+}
--- a/QTfrontend/res/html/about.html	Mon Jan 14 15:11:15 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,107 +0,0 @@
-<!DOCTYPE HTML>
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
-<head>
-<title>Hedgewars - Authors</title>
-<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
-<style type="text/css">
-     body { color: orange; }
-     a { color: #ffe270; }
-     a:hover { color: yellow; }
-</style>
-</head>
-<body>
-    <h2>Developers:</h2>
-    <p>
-        Engine, frontend, net server: Andrey Korotaev &lt;<a href="mailto:unC0Rr@gmail.com">unC0Rr@gmail.com</a>&gt;<br />
-        Many frontend improvements: Igor Ulyanov &lt;<a href="mailto:disinbox@gmail.com">disinbox@gmail.com</a>&gt;<br />
-        Many engine and frontend improvements: Derek Pomery &lt;<a href="mailto:nemo@m8y.org">nemo@m8y.org</a>&gt;<br />
-        Drill rocket, Ballgun, RC Plane weapons: Martin Boze &lt;<a href="mailto:afffect@gmail.com">afffect@gmail.com</a>&gt;<br />
-        Mine number and time game settings: David A. Cuadrado &lt;<a href="mailto:krawek@gmail.com">krawek@gmail.com</a>&gt;<br />
-        Frontend improvements: Martin Minarik &lt;<a href="mailto:ttsmj@pokec.sk">ttsmj@pokec.sk</a>&gt;<br />
-        Frontend improvements: Kristian Lehmann &lt;<a href="mailto:email@thexception.net">email@thexception.net</a>&gt;<br />
-        Mac OS X/iPhone port, OpenGL-ES conversion: Vittorio Giovara &lt;<a href="mailto:vittorio.giovara@gmail.com">vittorio.giovara@gmail.com</a>&gt;<br />
-        Many engine and frontend improvements (and bugs): Richard Karolyi &lt;<a href="mailto:sheepluva@ercatec.net">sheepluva@ercatec.net</a>&gt;<br />
-        Gamepad and Lua integration: Mario Liebisch &lt;<a href="mailto:mario.liebisch@gmail.com">mario.liebisch@gmail.com</a>&gt;<br />
-        Many engine improvements and graphics: Carlos Vives &lt;<a href="mailto:mail@carlosvives.es">mail@carlosvives.es</a>&gt;<br />
-        Maze maps: Henning K&uuml;hn &lt;<a href="mailto:prg@cooco.de">prg@cooco.de</a>&gt;<br />
-        Engine and frontend improvements: Henrik Rostedt &lt;<a href="mailto:henrik.rostedt@gmail.com">henrik.rostedt@gmail.com</a>&gt;<br />
-        Lua game modes and missions: John Lambert &lt;<a href="mailto:redgrinner@gmail.com">redgrinner@gmail.com</a>&gt;<br />
-        Frontend improvements: Mayur Pawashe &lt;<a href="mailto:zorgiepoo@gmail.com">zorgiepoo@gmail.com</a>&gt;<br />
-        Android port: Richard Deurwaarder &lt;<a href="mailto:xeli@xelification.com">xeli@xelification.com</a>&gt;<br />
-        Android netplay, portability abstraction: Simeon Maxein &lt;<a href="mailto:smaxein@googlemail.com">smaxein@googlemail.com</a>&gt;<br />
-        WebGL port, some pas2c and GLES2 work: Meng Xiangyun &lt;<a href="mailto:xymengxy@gmail.com">xymengxy@gmail.com</a>&gt;<br />
-        Video recording: Stepan Podoskin &lt;<a href="mailto:stepik-777@mail.ru">stepik-777@mail.ru</a>&gt;<br />
-        Campaign support, first campaign: Szabolcs Orb&agrave;n &lt;<a href="mailto:szabibibi@gmail.com">szabibibi@gmail.com</a>&gt;<br />
-        Keybinds, feedback, maps and hats interfaces: Drew Gottlieb &lt;<a href="mailto:gottlieb.drew@gmail.com">gottlieb.drew@gmail.com</a>&gt;<br />
-        Login dialogs, frontend improvements: Ondrej Skopek &lt;<a href="mailto:skopekondrej@gmail.com">skopekondrej@gmail.com</a>&gt;<br />
-        Icegun weapon: Julia Struchenko &lt;<a href="mailto:urbertar@gmail.com">urbertar@gmail.com</a>&gt;<br />
-        iPhone/iPad ports: Anton Malmygin &lt;<a href="mailto:antonc27@mail.ru">antonc27@mail.ru</a>&gt;<br />
-        Battalion style: Anachron &lt;<a href="mailto:Anachron14@gmx.de">Anachron14@gmx.de</a>&gt;<br />
-        Scripting, engine, frontend improvements, some missions: Wuzzy &lt;<a href="mailto:Wuzzy2@mail.ru">Wuzzy2@mail.ru</a>&gt;<br />
-        Theme customization improvements: KoBeWi<br />
-        Theme music, engine and frontend improvements, graphics: Valentin Kraevskiy <!--&lt;<a href="mailto:foo@bar.com">foo@bar.com</a>&gt;--><br />
-        </p>
-
-        <h2>Art:</h2>
-            <p>John Dum &lt;<a href="mailto:fizzy@gmail.com">fizzy@gmail.com</a>&gt;
-            <br />
-            Joshua Frese &lt;<a href="mailto:joshfrese@gmail.com">joshfrese@gmail.com</a>&gt;
-            <br />
-            Stanko Tadić &lt;<a href="mailto:stanko@mfhinc.net">stanko@mfhinc.net</a>&gt;
-            <br />
-            Julien Koesten &lt;<a href="mailto:julienkoesten@aol.com">julienkoesten@aol.com</a>&gt;
-            <br />
-            Joshua O'Sullivan &lt;<a href="mailto:coheedftw@hotmail.co.uk">coheedftw@hotmail.co.uk</a>&gt;
-            <br />
-            Nils Lück &lt;<a href="mailto:nils.luck.design@gmail.com">nils.luck.design@gmail.com</a>&gt;
-            <br />
-            Guillaume Englert &lt;<a href="mailto:genglert@hybird.org">genglert@hybird.org</a>&gt;
-            <br />
-            <p>CopherNeue &lt;<a href="mailto:ppicondo.cvac@gmail.com">ppicondo.cvac@gmail.com</a>&gt;
-            <br />
-            Hats: Trey Perry &lt;<a href="mailto:tx.perry.j@gmail.com">tx.perry.j@gmail.com</a>&gt;
-            </p>
-
-        <h2>Sounds:</h2>
-        <p>
-        Hedgehogs voice: Stephen Alexander &lt;<a href="mailto:ArmagonNo1@gmail.com">ArmagonNo1@gmail.com</a>&gt;
-        <br />
-        John Dum &lt;<a href="mailto:fizzy@gmail.com">fizzy@gmail.com</a>&gt;
-        <br />
-        Jonatan Nilsson &lt;<a href="mailto:jonatanfan@gmail.com">jonatanfan@gmail.com</a>&gt;
-        <br />
-        Daniel Martin &lt;<a href="mailto:elhombresinremedio@gmail.com">elhombresinremedio@gmail.com</a>&gt;
-        </p>
-
-        <h2>Translations:</h2><p>
-            Brazilian Portuguese: Romulo Fernandes Machado &lt;<a href="mailto:abra185@gmail.com">abra185@gmail.com</a>&gt;<br />
-            Bulgarian: Svetoslav Stefanov<br />
-            Czech: Petr Řezáček &lt;<a href="mailto:rezacek@gmail.com">rezacek@gmail.com</a>&gt;<br />
-            Chinese: Jie Luo &lt;<a href="mailto:lililjlj@gmail.com">lililjlj@gmail.com</a>&gt;<br />
-            English: Andrey Korotaev &lt;<a href="mailto:unC0Rr@gmail.com">unC0Rr@gmail.com</a>&gt;<br />
-            Finnish: Nina Kuisma &lt;<a href="mailto:ninnnu@gmail.com">ninnnu@gmail.com</a>&gt;, Janne Uusitupa<br />
-            French: Antoine Turmel &lt;<a href="mailto:geekshadow@gmail.com">geekshadow@gmail.com</a>&gt;, Clement Woitrain &lt;<a href="mailto:sphrixclement@gmail.com">sphrixclement@gmail.com</a>&gt;, Matisumi, Case_Of<br />
-            German: Peter Hüwe &lt;<a href="mailto:PeterHuewe@gmx.de">PeterHuewe@gmx.de</a>&gt;, Mario Liebisch &lt;<a href="mailto:mario.liebisch@gmail.com">mario.liebisch@gmail.com</a>&gt;, Richard Karolyi &lt;<a href="mailto:sheepluva@ercatec.net">sheepluva@ercatec.net</a>&gt;, Wuzzy &lt;<a href="mailto:Wuzzy2@mail.ru">Wuzzy2@mail.ru</a>&gt;<br />
-            Greek: &lt;<a href="mailto:talos_kriti@yahoo.gr">talos_kriti@yahoo.gr</a>&gt;<br />
-            Italian: Luca Bonora &lt;<a href="mailto:bonora.luca@gmail.com">bonora.luca@gmail.com</a>&gt;, Marco Bresciani &lt;<a href="mailto:m.bresciani@email.it">m.bresciani@email.it</a>&gt;, Gianfranco Costamagna &lt;<a href="mailto:costamagnagianfranco@yahoo.it">costamagnagianfranco@yahoo.it</a>&gt;, Enrico &lt;<a href="mailto:enricobe@hotmail.com">enricobe@hotmail.com</a>&gt;<br />
-            Japanese: ADAM Etienne &lt;<a href="mailto:etienne.adam@gmail.com">etienne.adam@gmail.com</a>&gt;, Marco Bresciani &lt;<a href="mailto:m.bresciani@email.it">m.bresciani@email.it</a>&gt;<br />
-            Korean: Anthony Bellew &lt;<a href="mailto:anthonyreflected@gmail.com">anthonyreflected@gmail.com</a>&gt;<br />
-            Lithuanian: Lukas Urbonas &lt;<a href="mailto:lukasu08@gmail.com">lukasu08@gmail.com</a>&gt;<br />
-            Polish: Maciej Mroziński &lt;<a href="mailto:mynick2@o2.pl">mynick2@o2.pl</a>&gt;, Wojciech Latkowski &lt;<a href="mailto:magik17l@gmail.com">magik17l@gmail.com</a>&gt;, Piotr Mitana, Maciej Górny, KoBeWi<br />
-            Portuguese: Fábio Canário &lt;<a href="mailto:inufabie@gmail.com">inufabie@gmail.com</a>&gt;<br />
-            Russian: Andrey Korotaev &lt;<a href="mailto:unC0Rr@gmail.com">unC0Rr@gmail.com</a>&gt;, Vitaly Novichkov &lt;<a href="mailto:admin@wohlnet.ru">admin@wohlnet.ru</a>&gt;, Anton Malmygin &lt;<a href="mailto:antonc27@mail.ru">antonc27@mail.ru</a>&gt;, greno4ka, Grigory Ustinov &lt;<a href="mailto:grenka@altlinux.org">grenka@altlinux.org</a>&gt;<br />
-            Scottish Gaelic: GunChleoc<br />
-            Slovak: Jose Riha<br />
-            Spanish: Carlos Vives &lt;<a href="mailto:mail@carlosvives.es">mail@carlosvives.es</a>&gt;<br />
-            Swedish: Niklas Grahn &lt;<a href="mailto:raewolusjoon@yaoo.com">raewolusjoon@yaoo.com</a>&gt;, Henrik Rostedt &lt;<a href="mailto:henrik.rostedt@gmail.com">henrik.rostedt@gmail.com</a>&gt;<br />
-            Ukrainian: Eugene V. Lyubimkin &lt;<a href="mailto:jackyf.devel@gmail.com">jackyf.devel@gmail.com</a>&gt;, Igor Paliychuk &lt;<a href="mailto:mansonigor@gmail.com">mansonigor@gmail.com</a>&gt;, Eugene Sakara &lt;<a href="mailto:eresid@gmail.com">eresid@gmail.com</a>&gt;
-            </p>
-
-        <h2>Special thanks:</h2><p>
-        Aleksey Andreev &lt;<a href="mailto:blaknayabr@gmail.com">blaknayabr@gmail.com</a>&gt;<br />
-        Aleksander Rudalev &lt;<a href="mailto:alexv@pomorsu.ru">alexv@pomorsu.ru</a>&gt;<br />
-        Natasha Korotaeva &lt;<a href="mailto:layout@pisem.net">layout@pisem.net</a>&gt;<br />
-        Adam Higerd (aka ahigerd at FreeNode)
-        </p>
-</body>
-</html>
Binary file QTfrontend/res/keyconflict.png has changed
Binary file QTfrontend/res/keyconflict_selected.png has changed
Binary file QTfrontend/res/scroll_down.png has changed
Binary file QTfrontend/res/scroll_left.png has changed
Binary file QTfrontend/res/scroll_right.png has changed
Binary file QTfrontend/res/scroll_up.png has changed
--- a/QTfrontend/sdlkeys.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/sdlkeys.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -22,11 +22,16 @@
 
 char sdlkeys[1024][2][128] =
 {
+    // Mouse
     {"mousel", QT_TRANSLATE_NOOP("binds (keys)", "Mouse: Left button")},
     {"mousem", QT_TRANSLATE_NOOP("binds (keys)", "Mouse: Middle button")},
     {"mouser", QT_TRANSLATE_NOOP("binds (keys)", "Mouse: Right button")},
+    {"mousex1", QT_TRANSLATE_NOOP("binds (keys)", "Mouse: X1 button ")},
+    {"mousex2", QT_TRANSLATE_NOOP("binds (keys)", "Mouse: X2 button")},
     {"wheelup", QT_TRANSLATE_NOOP("binds (keys)", "Mouse: Wheel up")},
     {"wheeldown", QT_TRANSLATE_NOOP("binds (keys)", "Mouse: Wheel down")},
+
+    // Keyboard
     {"backspace", QT_TRANSLATE_NOOP("binds (keys)", "Backspace")},
     {"tab", QT_TRANSLATE_NOOP("binds (keys)", "Tab")},
     {"clear", QT_TRANSLATE_NOOP("binds (keys)", "Clear")},
@@ -34,16 +39,7 @@
     {"pause", QT_TRANSLATE_NOOP("binds (keys)", "Pause")},
     {"escape", QT_TRANSLATE_NOOP("binds (keys)", "Escape")},
     {"space", QT_TRANSLATE_NOOP("binds (keys)", "Space")},
-    {"!", "!"},
-    {"\"", "\""},
-    {"#", "#"},
-    {"$", "$"},
-    {"&", "&"},
     {"'", "'"},
-    {"(", "("},
-    {")", ")"},
-    {"*", "*"},
-    {"+", "+"},
     {",", ","},
     {"-", "-"},
     {".", "."},
@@ -58,18 +54,10 @@
     {"7", "7"},
     {"8", "8"},
     {"9", "9"},
-    {":", ":"},
     {";", ";"},
-    {"<", "<"},
-    {"=", "="},
-    {">", ">"},
-    {"?", "?"},
-    {"@", "@"},
     {"[", "["},
     {"\\", "\\"},
     {"]", "]"},
-    {"^", "^"},
-    {"_", "_"},
     {"`", "`"},
     {"a", "A"},
     {"b", "B"},
@@ -97,33 +85,32 @@
     {"x", "X"},
     {"y", "Y"},
     {"z", "Z"},
-    {"delete", QT_TRANSLATE_NOOP("binds (keys)", "Delete")},
-    {"keypad_0", QT_TRANSLATE_NOOP("binds (keys)", "Numpad 0")},
-    {"keypad_1", QT_TRANSLATE_NOOP("binds (keys)", "Numpad 1")},
-    {"keypad_2", QT_TRANSLATE_NOOP("binds (keys)", "Numpad 2")},
-    {"keypad_3", QT_TRANSLATE_NOOP("binds (keys)", "Numpad 3")},
-    {"keypad_4", QT_TRANSLATE_NOOP("binds (keys)", "Numpad 4")},
-    {"keypad_5", QT_TRANSLATE_NOOP("binds (keys)", "Numpad 5")},
-    {"keypad_6", QT_TRANSLATE_NOOP("binds (keys)", "Numpad 6")},
-    {"keypad_7", QT_TRANSLATE_NOOP("binds (keys)", "Numpad 7")},
-    {"keypad_8", QT_TRANSLATE_NOOP("binds (keys)", "Numpad 8")},
-    {"keypad_9", QT_TRANSLATE_NOOP("binds (keys)", "Numpad 9")},
-    {"keypad_.", QT_TRANSLATE_NOOP("binds (keys)", "Numpad .")},
-    {"keypad_/", QT_TRANSLATE_NOOP("binds (keys)", "Numpad /")},
-    {"keypad_*", QT_TRANSLATE_NOOP("binds (keys)", "Numpad *")},
-    {"keypad_-", QT_TRANSLATE_NOOP("binds (keys)", "Numpad -")},
-    {"keypad_+", QT_TRANSLATE_NOOP("binds (keys)", "Numpad +")},
-    {"enter", QT_TRANSLATE_NOOP("binds (keys)", "Enter")},
-    {"equals", QT_TRANSLATE_NOOP("binds (keys)", "Equals")},
+    {"keypad_0", QT_TRANSLATE_NOOP("binds (keys)", "Keypad 0")},
+    {"keypad_1", QT_TRANSLATE_NOOP("binds (keys)", "Keypad 1")},
+    {"keypad_2", QT_TRANSLATE_NOOP("binds (keys)", "Keypad 2")},
+    {"keypad_3", QT_TRANSLATE_NOOP("binds (keys)", "Keypad 3")},
+    {"keypad_4", QT_TRANSLATE_NOOP("binds (keys)", "Keypad 4")},
+    {"keypad_5", QT_TRANSLATE_NOOP("binds (keys)", "Keypad 5")},
+    {"keypad_6", QT_TRANSLATE_NOOP("binds (keys)", "Keypad 6")},
+    {"keypad_7", QT_TRANSLATE_NOOP("binds (keys)", "Keypad 7")},
+    {"keypad_8", QT_TRANSLATE_NOOP("binds (keys)", "Keypad 8")},
+    {"keypad_9", QT_TRANSLATE_NOOP("binds (keys)", "Keypad 9")},
+    {"keypad_.", QT_TRANSLATE_NOOP("binds (keys)", "Keypad .")},
+    {"keypad_/", QT_TRANSLATE_NOOP("binds (keys)", "Keypad /")},
+    {"keypad_*", QT_TRANSLATE_NOOP("binds (keys)", "Keypad *")},
+    {"keypad_-", QT_TRANSLATE_NOOP("binds (keys)", "Keypad -")},
+    {"keypad_+", QT_TRANSLATE_NOOP("binds (keys)", "Keypad +")},
+    {"keypad_enter", QT_TRANSLATE_NOOP("binds (keys)", "Keypad Enter")},
     {"up", QT_TRANSLATE_NOOP("binds (keys)", "Up")},
     {"down", QT_TRANSLATE_NOOP("binds (keys)", "Down")},
     {"right", QT_TRANSLATE_NOOP("binds (keys)", "Right")},
     {"left", QT_TRANSLATE_NOOP("binds (keys)", "Left")},
     {"insert", QT_TRANSLATE_NOOP("binds (keys)", "Insert")},
+    {"delete", QT_TRANSLATE_NOOP("binds (keys)", "Delete")},
     {"home", QT_TRANSLATE_NOOP("binds (keys)", "Home")},
     {"end", QT_TRANSLATE_NOOP("binds (keys)", "End")},
-    {"page_up", QT_TRANSLATE_NOOP("binds (keys)", "Page up")},
-    {"page_down", QT_TRANSLATE_NOOP("binds (keys)", "Page down")},
+    {"pageup", QT_TRANSLATE_NOOP("binds (keys)", "PageUp")},
+    {"pagedown", QT_TRANSLATE_NOOP("binds (keys)", "PageDown")},
     {"f1", "F1"},
     {"f2", "F2"},
     {"f3", "F3"},
@@ -139,19 +126,25 @@
     {"f13", "F13"},
     {"f14", "F14"},
     {"f15", "F15"},
-    {"numlock", QT_TRANSLATE_NOOP("binds (keys)", "Num lock")},
-    {"caps_lock", QT_TRANSLATE_NOOP("binds (keys)", "Caps lock")},
-    {"scroll_lock", QT_TRANSLATE_NOOP("binds (keys)", "Scroll lock")},
-    {"right_shift", QT_TRANSLATE_NOOP("binds (keys)", "Right shift")},
-    {"left_shift", QT_TRANSLATE_NOOP("binds (keys)", "Left shift")},
-    {"right_ctrl", QT_TRANSLATE_NOOP("binds (keys)", "Right ctrl")},
-    {"left_ctrl", QT_TRANSLATE_NOOP("binds (keys)", "Left ctrl")},
-    {"right_alt", QT_TRANSLATE_NOOP("binds (keys)", "Right alt")},
-    {"left_alt", QT_TRANSLATE_NOOP("binds (keys)", "Left alt")},
-    {"right_meta", QT_TRANSLATE_NOOP("binds (keys)", "Right meta")},
-    {"left_meta", QT_TRANSLATE_NOOP("binds (keys)", "Left meta")}
+    {"numlock", QT_TRANSLATE_NOOP("binds (keys)", "Numlock")},
+    {"capslock", QT_TRANSLATE_NOOP("binds (keys)", "CapsLock")},
+    {"scrolllock", QT_TRANSLATE_NOOP("binds (keys)", "ScrollLock")},
+    {"menu", QT_TRANSLATE_NOOP("binds (keys)", "Menu")},
+    {"right_shift", QT_TRANSLATE_NOOP("binds (keys)", "Right Shift")},
+    {"left_shift", QT_TRANSLATE_NOOP("binds (keys)", "Left Shift")},
+    {"right_ctrl", QT_TRANSLATE_NOOP("binds (keys)", "Right Ctrl")},
+    {"left_ctrl", QT_TRANSLATE_NOOP("binds (keys)", "Left Ctrl")},
+    {"right_alt", QT_TRANSLATE_NOOP("binds (keys)", "Right Alt")},
+    {"left_alt", QT_TRANSLATE_NOOP("binds (keys)", "Left Alt")},
+    //: Windows key / Command key / Meta key /Super key (right)
+    {"right_gui", QT_TRANSLATE_NOOP("binds (keys)", "Right GUI")},
+    //: Windows key / Command key / Meta key /Super key (left)
+    {"left_gui", QT_TRANSLATE_NOOP("binds (keys)", "Left GUI")}
 };
 
+// helper list for sdlkeys. true for keyboard keys, false for other
+bool sdlkeys_iskeyboard[1024];
+
 // button name definitions for Microsoft's XBox360 controller
 // don't modify button order!
 char xb360buttons[10][128] =
@@ -197,3 +190,6 @@
 char controllerleft[128] = QT_TRANSLATE_NOOP("binds (keys)", "Left");
 char controllerright[128] = QT_TRANSLATE_NOOP("binds (keys)", "Right");
 
+//: Special entry in key selection when an action has no control assigned
+char unboundcontrol[128] = QT_TRANSLATE_NOOP("binds (keys)", "(Don't use)");
+
--- a/QTfrontend/sdlkeys.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/sdlkeys.h	Fri Aug 16 10:59:50 2019 -0600
@@ -20,6 +20,7 @@
 #define SDLKEYS_H
 
 extern char sdlkeys[1024][2][128];
+extern bool sdlkeys_iskeyboard[1024];
 extern char xb360buttons[10][128];
 extern char xbox360axes[10][128];
 extern char xb360dpad[128];
@@ -30,5 +31,6 @@
 extern char controllerdown[128];
 extern char controllerleft[128];
 extern char controllerright[128];
+extern char unboundcontrol[128];
 
 #endif
--- a/QTfrontend/team.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/team.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -35,6 +35,7 @@
     , m_difficulty(0)
     , m_numHedgehogs(4)
     , m_isNetTeam(false)
+    , m_isMissionTeam(false)
 {
     m_name = teamname;
     OldTeamName = m_name;
@@ -61,6 +62,7 @@
     QObject(0)
     , m_numHedgehogs(4)
     , m_isNetTeam(true)
+    , m_isMissionTeam(false)
 {
     // net teams are configured from QStringList
     if(strLst.size() != 23) throw HWTeamConstructException();
@@ -88,6 +90,7 @@
     , m_difficulty(0)
     , m_numHedgehogs(4)
     , m_isNetTeam(false)
+    , m_isMissionTeam(false)
 {
     m_name = QString("Team");
     for (int i = 0; i < HEDGEHOGS_PER_TEAM; i++)
@@ -125,6 +128,7 @@
     , m_numHedgehogs(other.m_numHedgehogs)
     , m_color(other.m_color)
     , m_isNetTeam(other.m_isNetTeam)
+    , m_isMissionTeam(other.m_isMissionTeam)
     , m_owner(other.m_owner)
 //      , AchievementProgress(other.AchievementProgress)
 {
@@ -149,6 +153,7 @@
         m_isNetTeam = other.m_isNetTeam;
         m_owner = other.m_owner;
         m_color = other.m_color;
+        m_isMissionTeam = other.m_isMissionTeam;
     }
 
     return *this;
@@ -230,7 +235,10 @@
         teamfile.setValue(hh + "Hat", m_hedgehogs[i].Hat);
     }
     for(int i = 0; i < BINDS_NUMBER; i++)
-        teamfile.setValue(QString("Binds/%1").arg(m_binds[i].action), m_binds[i].strbind);
+    {
+        if(QString(m_binds[i].action) != QString("!MULTI"))
+            teamfile.setValue(QString("Binds/%1").arg(m_binds[i].action), m_binds[i].strbind);
+    }
     for(int i = 0; i < MAX_ACHIEVEMENTS; i++)
         if(achievements[i][0][0])
             teamfile.setValue(QString("Achievements/%1").arg(achievements[i][0]), AchievementProgress[i]);
@@ -243,12 +251,25 @@
 QStringList HWTeam::teamGameConfig(quint32 InitHealth) const
 {
     QStringList sl;
+    QString cmdAddHog = "eaddhh";
+
     if (m_isNetTeam)
     {
         sl.push_back(QString("eaddteam %3 %1 %2").arg(qcolor().rgb() & 0xffffff).arg(m_name).arg(QString(QCryptographicHash::hash(m_owner.toUtf8(), QCryptographicHash::Md5).toHex())));
         sl.push_back("erdriven");
     }
-    else sl.push_back(QString("eaddteam %3 %1 %2").arg(qcolor().rgb() & 0xffffff).arg(m_name).arg(playerHash));
+    else
+    {
+        if (m_isMissionTeam)
+        {
+            sl.push_back(QString("esetmissteam %3 %1 %2").arg(qcolor().rgb() & 0xffffff).arg(m_name).arg(playerHash));
+            cmdAddHog = "eaddmisshh";
+        }
+        else
+        {
+            sl.push_back(QString("eaddteam %3 %1 %2").arg(qcolor().rgb() & 0xffffff).arg(m_name).arg(playerHash));
+        }
+    }
 
     sl.push_back(QString("egrave " + m_grave));
     sl.push_back(QString("efort " + m_fort));
@@ -260,7 +281,7 @@
 
     for (int t = 0; t < m_numHedgehogs; t++)
     {
-        sl.push_back(QString("eaddhh %1 %2 %3")
+        sl.push_back(QString(cmdAddHog + " %1 %2 %3")
                      .arg(QString::number(m_difficulty),
                           QString::number(InitHealth),
                           m_hedgehogs[t].Name));
@@ -281,6 +302,15 @@
     return m_isNetTeam;
 }
 
+void HWTeam::setMissionTeam(bool isMissionTeam)
+{
+    m_isMissionTeam = isMissionTeam;
+}
+
+bool HWTeam::isMissionTeam() const
+{
+    return m_isMissionTeam;
+}
 
 bool HWTeam::operator==(const HWTeam& t1) const
 {
@@ -322,6 +352,10 @@
     return m_owner;
 }
 
+void HWTeam::setOwner(const QString & owner)
+{
+    m_owner = owner;
+}
 
 
 // difficulty
--- a/QTfrontend/team.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/team.h	Fri Aug 16 10:59:50 2019 -0600
@@ -72,10 +72,12 @@
         QString grave() const;
         const HWHog & hedgehog(unsigned int idx) const;
         bool isNetTeam() const;
+        bool isMissionTeam() const;
         QString keyBind(unsigned int idx) const;
         QString name() const;
         unsigned char numHedgehogs() const;
         QString owner() const;
+        void setOwner(const QString & owner);
         QString voicepack() const;
 
         // attribute setters
@@ -89,6 +91,7 @@
         void setNumHedgehogs(unsigned char num);
         void setVoicepack(const QString & voicepack);
         void setNetTeam(bool isNetTeam);
+        void setMissionTeam(bool isMissionTeam);
 
         // convert team info into strings for further computation
         QStringList teamGameConfig(quint32 InitHealth) const;
@@ -119,6 +122,7 @@
         quint8 m_numHedgehogs;
         int m_color;
         bool m_isNetTeam;
+        bool m_isMissionTeam;
         QString m_owner;
 
         // class members that contain statistics, etc.
--- a/QTfrontend/ui/page/pageadmin.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/page/pageadmin.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -101,6 +101,8 @@
                               << tr("Reason")
                     );
         twBans->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);
+        twBans->horizontalHeader()->setSectionsClickable(false);
+        twBans->verticalHeader()->hide();
         twBans->setEditTriggers(QAbstractItemView::NoEditTriggers);
         twBans->setSelectionBehavior(QAbstractItemView::SelectRows);
         twBans->setSelectionMode(QAbstractItemView::SingleSelection);
--- a/QTfrontend/ui/page/pagecampaign.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/page/pagecampaign.h	Fri Aug 16 10:59:50 2019 -0600
@@ -35,6 +35,7 @@
         QComboBox   *CBMission;
         QComboBox   *CBCampaign;
         QComboBox   *CBTeam;
+        bool currentMissionWon = false;
 
     protected:
         QLayout * bodyLayoutDefinition();
--- a/QTfrontend/ui/page/pageeditteam.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/page/pageeditteam.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -28,9 +28,12 @@
 #include <QMessageBox>
 #include <QStandardItemModel>
 #include <QDebug>
+#include <QRegExp>
+#include <QRegExpValidator>
 #include "SquareLabel.h"
 #include "HWApplication.h"
 #include "keybinder.h"
+#include "hwconsts.h"
 
 #include "physfs.h"
 #include "DataManager.h"
@@ -129,6 +132,9 @@
     TeamNameEdit->setMaxLength(64);
     TeamNameEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
     TeamNameEdit->setStyleSheet("QLineEdit { padding: 6px; }");
+    QRegExp rx(*cSafeFileNameRegExp);
+    QRegExpValidator * val = new QRegExpValidator(rx, TeamNameEdit);
+    TeamNameEdit->setValidator(val);
     GBTLayout->addWidget(TeamNameEdit, 0, 1, 1, 2);
     vbox2->addWidget(GBoxTeam);
 
@@ -163,12 +169,13 @@
     // CPU level flag. Static image, only displayed when computer player is selected
     QImage imgBotlevels = QImage("physfs://Graphics/botlevels.png");
 
-    int botlevelOffsets[5]= { 19, 14, 10, 6, 0 };   
+    int botlevelOffsetsX[5]= { 17, 13, 9, 5, 0 };
+    int botlevelOffsetsY[5]= { 11, 9, 4, 2, 0 };
 
     for(int i=0; i<5; i++) {
         QImage imgCPU = QImage("physfs://Graphics/Flags/cpu.png");
         QPainter painter(&imgCPU);
-        painter.drawImage(botlevelOffsets[i], 0, imgBotlevels, botlevelOffsets[i]);
+        painter.drawImage(botlevelOffsetsX[i], botlevelOffsetsY[i], imgBotlevels, botlevelOffsetsX[i], botlevelOffsetsY[i]);
 
         pixCPU[i] = QPixmap::fromImage(imgCPU);
     }
@@ -434,6 +441,11 @@
     hboxCPUWidget->setHidden(index == 0);
 }
 
+void PageEditTeam::frontendSoundsToggled(bool value)
+{
+    btnTestSound->setEnabled(value);
+}
+
 void PageEditTeam::testSound()
 {
     DataManager & dataMgr = DataManager::instance();
@@ -462,12 +474,13 @@
     lazyLoad();
     OldTeamName = name;
 
-    // Mostly create a default team, with 2 important exceptions:
+    // Mostly create a default team, with some important exceptions:
     HWTeam newTeam(name);
     // Randomize grave to make it less likely that default teams have equal graves (important for resurrector)
     HWNamegen::teamRandomGrave(newTeam, false);
     // Randomize fort for greater variety in fort mode with default teams
     HWNamegen::teamRandomFort(newTeam, false);
+    HWNamegen::teamLocalizedDefaultVoice(newTeam);
     // DLC forts and graves intentionally filtered out to prevent desyncs and missing grave error
     // TODO: Remove DLC filter as soon it is not needed anymore
     loadTeam(newTeam);
@@ -490,6 +503,7 @@
     reallyDeleteMsg.setIcon(QMessageBox::Question);
     reallyDeleteMsg.setWindowTitle(QMessageBox::tr("Teams - Are you sure?"));
     reallyDeleteMsg.setText(QMessageBox::tr("Do you really want to delete the team '%1'?").arg(name));
+    reallyDeleteMsg.setTextFormat(Qt::PlainText);
     reallyDeleteMsg.setWindowModality(Qt::WindowModal);
     reallyDeleteMsg.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
 
@@ -598,6 +612,7 @@
         else
             qDebug() << "Binds: cannot find" << team.keyBind(i);
     }
+    binder->checkConflicts();
 }
 
 HWTeam PageEditTeam::data()
@@ -657,6 +672,7 @@
         teamNameFixedMsg.setIcon(QMessageBox::Warning);
         teamNameFixedMsg.setWindowTitle(QMessageBox::tr("Teams - Name already taken"));
         teamNameFixedMsg.setText(QMessageBox::tr("The team name '%1' is already taken, so your team has been renamed to '%2'.").arg(origName).arg(team.name()));
+        teamNameFixedMsg.setTextFormat(Qt::PlainText);
         teamNameFixedMsg.setWindowModality(Qt::WindowModal);
         teamNameFixedMsg.setStandardButtons(QMessageBox::Ok);
         teamNameFixedMsg.exec();
@@ -670,4 +686,5 @@
 {
     for (int i = 0; i < BINDS_NUMBER; i++)
         binder->setBindIndex(i, 0);
+    binder->checkConflicts();
 }
--- a/QTfrontend/ui/page/pageeditteam.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/page/pageeditteam.h	Fri Aug 16 10:59:50 2019 -0600
@@ -45,6 +45,7 @@
     public slots:
         void CBTeamLvl_activated(const int index);
         void CBFort_activated(const int index);
+        void frontendSoundsToggled(bool value);
 
     private:
         QTabWidget * tbw;
--- a/QTfrontend/ui/page/pagegamestats.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/page/pagegamestats.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -42,38 +42,36 @@
 {
     kindOfPoints = QString("");
     defaultGraphTitle = true;
-    QGridLayout * pageLayout = new QGridLayout();
-    pageLayout->setSpacing(20);
-    pageLayout->setColumnStretch(0, 1);
-    pageLayout->setColumnStretch(1, 1);
+    pageLayout = new QGridLayout();
     pageLayout->setRowStretch(0, 1);
     pageLayout->setRowStretch(1, 20);
-    //pageLayout->setRowStretch(1, -1); this should work but there is unnecessary empty space betwin lines if used
+    pageLayout->setVerticalSpacing(20);
     pageLayout->setContentsMargins(7, 7, 7, 0);
 
-    QGroupBox * gb = new QGroupBox(this);
+    gbDetails = new QGroupBox(this);
+    gbDetails->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
     QVBoxLayout * gbl = new QVBoxLayout;
 
     // details
     labelGameStats = new QLabel(this);
-    QLabel * l = new QLabel(this);
-    l->setTextFormat(Qt::RichText);
-    l->setText("<h1><img src=\":/res/StatsD.png\"> " + PageGameStats::tr("Details") + "</h1>");
-    l->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+    labelDetails = new QLabel(this);
+    labelDetails->setTextFormat(Qt::RichText);
+    labelDetails->setText("<h1><img src=\":/res/StatsD.png\"> " + PageGameStats::tr("Details").toHtmlEscaped() + "</h1>");
+    labelDetails->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
     labelGameStats->setTextFormat(Qt::RichText);
     labelGameStats->setAlignment(Qt::AlignTop);
     labelGameStats->setWordWrap(true);
-    gbl->addWidget(l);
+    gbl->addWidget(labelDetails);
     gbl->addWidget(labelGameStats);
-    gb->setLayout(gbl);
-    pageLayout->addWidget(gb, 1, 1);
+    gbDetails->setLayout(gbl);
+    pageLayout->addWidget(gbDetails, 1, 1);
 
     // graph
-    graphic = new FitGraphicsView(gb);
+    graphic = new FitGraphicsView(gbDetails);
     graphic->setObjectName("gameStatsView");
     labelGraphTitle = new QLabel(this);
     labelGraphTitle->setTextFormat(Qt::RichText);
-    labelGraphTitle->setText("<br><h1><img src=\":/res/StatsH.png\"> " + PageGameStats::tr("Health graph") + "</h1>");
+    labelGraphTitle->setText("<h1><img src=\":/res/StatsH.png\"> " + PageGameStats::tr("Health graph").toHtmlEscaped() + "</h1>");
     labelGraphTitle->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
     gbl->addWidget(labelGraphTitle);
     gbl->addWidget(graphic);
@@ -86,20 +84,21 @@
     pageLayout->addWidget(labelGameWin, 0, 0, 1, 2);
 
     // ranking box
-    gb = new QGroupBox(this);
+    gbRanks = new QGroupBox(this);
+    gbRanks->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
     gbl = new QVBoxLayout;
-    labelGameRank = new QLabel(gb);
-    l = new QLabel(this);
+    labelGameRank = new QLabel(gbRanks);
+    QLabel* l = new QLabel(this);
     l->setTextFormat(Qt::RichText);
-    l->setText("<h1><img src=\":/res/StatsR.png\"> " + PageGameStats::tr("Ranking") + "</h1>");
+    l->setText("<h1><img src=\":/res/StatsR.png\"> " + PageGameStats::tr("Ranking").toHtmlEscaped() + "</h1>");
     l->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
     gbl->addWidget(l);
     gbl->addWidget(labelGameRank);
-    gb->setLayout(gbl);
+    gbRanks->setLayout(gbl);
 
     labelGameRank->setTextFormat(Qt::RichText);
     labelGameRank->setAlignment(Qt::AlignTop);
-    pageLayout->addWidget(gb, 1, 0);
+    pageLayout->addWidget(gbRanks, 1, 0);
 
     return pageLayout;
 }
@@ -143,6 +142,9 @@
 void PageGameStats::AddStatText(const QString & msg)
 {
     labelGameStats->setText(labelGameStats->text() + msg);
+    labelDetails->show();
+    labelGameStats->show();
+    gbDetails->show();
 }
 
 void PageGameStats::clear()
@@ -154,6 +156,14 @@
     playerPosition = 0;
     scriptPlayerPosition = 0;
     lastColor = 0;
+    graphic->hide();
+    labelDetails->hide();
+    labelGameStats->hide();
+    gbDetails->hide();
+    gbRanks->hide();
+    pageLayout->setColumnStretch(0, 0);
+    pageLayout->setColumnStretch(1, 0);
+    pageLayout->setHorizontalSpacing(0);
 }
 
 void PageGameStats::restartBtnVisible(bool visible)
@@ -161,10 +171,15 @@
     btnRestart->setVisible(visible);
 }
 
+void PageGameStats::saveDemoBtnEnabled(bool enabled)
+{
+    btnSave->setEnabled(enabled);
+}
+
 void PageGameStats::renderStats()
 {
     if(defaultGraphTitle) {
-        labelGraphTitle->setText("<br><h1><img src=\":/res/StatsH.png\"> " + PageGameStats::tr("Health graph") + "</h1>");
+        labelGraphTitle->setText("<h1><img src=\":/res/StatsH.png\"> " + PageGameStats::tr("Health graph").toHtmlEscaped() + "</h1>");
     } else {
         defaultGraphTitle = true;
     }
@@ -174,6 +189,7 @@
         graphic->hide();
     } else {
         graphic->setScene(Q_NULLPTR);
+        gbDetails->show();
         m_scene.reset(new QGraphicsScene(this));
 
         // min and max value across the entire chart
@@ -193,6 +209,7 @@
         if(maxDataPoints < 2) {
             labelGraphTitle->hide();
             graphic->hide();
+            applySpacing();
             return;
         }
 
@@ -222,11 +239,25 @@
                 minValue = qMin(minValue, hps[t]);
             }
 
-            QPen pen(c);
+            // Draw clan health/score graph lines
+            QColor col = QColor(c);
+
+            // Special pen for very dark clan colors
+            if (!(col.red() >= cInvertTextColorAt || col.green() >= cInvertTextColorAt || col.blue() >= cInvertTextColorAt))
+            {
+                QPen pen_marker(QColor(255, 255, 255));
+                pen_marker.setWidth(3);
+                pen_marker.setStyle(Qt::DotLine);
+                pen_marker.setCosmetic(true);
+                m_scene->addPath(path, pen_marker);
+            }
+
+            // Regular pen
+            QPen pen(col);
             pen.setWidth(2);
             pen.setCosmetic(true);
+            m_scene->addPath(path, pen);
 
-            m_scene->addPath(path, pen);
             ++i;
         }
 
@@ -248,6 +279,22 @@
 
         graphic->show();
         labelGraphTitle->show();
+        gbDetails->show();
+    }
+    applySpacing();
+}
+
+void PageGameStats::applySpacing()
+{
+    if (!labelGameStats->isHidden())
+    {
+        labelGraphTitle->setText("<br>" + labelGraphTitle->text());
+    }
+    if ((!gbDetails->isHidden()) && (!gbRanks->isHidden()))
+    {
+        pageLayout->setColumnStretch(0, 1);
+        pageLayout->setColumnStretch(1, 1);
+        pageLayout->setHorizontalSpacing(20);
     }
 }
 
@@ -257,14 +304,14 @@
     {
         case 'r' :
         {
-            labelGameWin->setText(QString("<h1 align=\"center\">%1</h1>").arg(info));
+            labelGameWin->setText(QString("<h1 align=\"center\">%1</h1>").arg(info.toHtmlEscaped()));
             break;
         }
         case 'D' :
         {
             int i = info.indexOf(' ');
             int num = info.left(i).toInt();
-            QString message = "<p><img src=\":/res/StatsBestShot.png\"> " + PageGameStats::tr("The best shot award was won by <b>%1</b> with <b>%2</b> pts.", "", num).arg(info.mid(i + 1), info.left(i)) + "</p>";
+            QString message = "<p><img src=\":/res/StatsBestShot.png\"> " + PageGameStats::tr("The best shot award was won by <b>%1</b> with <b>%2</b> pts.", "", num).arg(info.mid(i + 1).toHtmlEscaped(), info.left(i)) + "</p>";
             AddStatText(message);
             break;
         }
@@ -272,7 +319,7 @@
         {
             int i = info.indexOf(' ');
             int num = info.left(i).toInt();
-            QString message = "<p><img src=\":/res/StatsBestKiller.png\"> " + PageGameStats::tr("The best killer is <b>%1</b> with <b>%2</b> kills in a turn.", "", num).arg(info.mid(i + 1), info.left(i)) + "</p>";
+            QString message = "<p><img src=\":/res/StatsBestKiller.png\"> " + PageGameStats::tr("The best killer is <b>%1</b> with <b>%2</b> kills in a turn.", "", num).arg(info.mid(i + 1).toHtmlEscaped(), info.left(i)) + "</p>";
             AddStatText(message);
             break;
         }
@@ -295,7 +342,7 @@
         {
             // TODO: change default picture or add change pic capability
             defaultGraphTitle = false;
-            labelGraphTitle->setText("<br><h1><img src=\":/res/StatsR.png\"> " + info + "</h1>");
+            labelGraphTitle->setText("<h1><img src=\":/res/StatsR.png\"> " + info.toHtmlEscaped() + "</h1>");
             break;
         }
         case 'T':   // local team stats
@@ -320,7 +367,8 @@
 
             i = playerinfo.indexOf(' ');
 
-            int kills = playerinfo.left(i).toInt();
+            QString killsString = playerinfo.left(i);
+            int kills = killsString.toInt();
             QString playername = playerinfo.mid(i + 1);
             QString image;
 
@@ -351,26 +399,43 @@
 
             QString message;
             QString killstring;
-            if(kindOfPoints.compare("") == 0) {
+            if(kindOfPoints.isEmpty()) {
                 //: Number of kills in stats screen, written after the team name
                 killstring = PageGameStats::tr("(%1 kill)", "", kills).arg(kills);
+            } else if (kindOfPoints == "!POINTS") {
+                //: Number of points in stats screen, written after the team name
+                killstring = PageGameStats::tr("(%1 point(s))", "", kills).arg(kills);
+            } else if (kindOfPoints == "!TIME") {
+                //: Time in seconds
+                killstring = PageGameStats::tr("(%L1 second(s))", "", kills).arg((double) kills/1000, 0, 'f', 3);
+            } else if (kindOfPoints.startsWith("!TIME") && kindOfPoints.length() == 6) {
+                int len = kindOfPoints.at(6).digitValue();
+                if(len != -1)
+                    killstring = PageGameStats::tr("(%L1 second(s))", "", kills).arg((double) kills/1000, 0, 'f', len);
+                else
+                    qWarning("SendStat: siPointType received with !TIME and invalid number length!");
+            } else if (kindOfPoints == "!CRATES") {
+                killstring = PageGameStats::tr("(%1 crate(s))", "", kills).arg(kills);
+            } else if (kindOfPoints == "!EMPTY") {
+                killstring = QString("");
             } else {
                 //: For custom number of points in the stats screen, written after the team name. %1 is the number, %2 is the word. Example: “4 points”
                 killstring = PageGameStats::tr("(%1 %2)", "", kills).arg(kills).arg(kindOfPoints);
-                kindOfPoints = QString("");
             }
+            kindOfPoints = QString("");
 
-            message = QString("<p><h2>%1 %2. <font color=\"%4\">%3</font> ").arg(image, QString::number(realPlayerPosition), playername, clanColor.name()) + killstring + "</h2></p>";
+            message = QString("<p><h2>%1 %2. <font color=\"%4\">%3</font> ").arg(image, QString::number(realPlayerPosition), playername.toHtmlEscaped(), clanColor.name().toHtmlEscaped()) + killstring.toHtmlEscaped() + "</h2></p>";
 
             labelGameRank->setText(labelGameRank->text() + message);
             scriptPlayerPosition = 0;
+            gbRanks->show();
             break;
         }
         case 's' :
         {
             int i = info.indexOf(' ');
             int num = info.left(i).toInt();
-            QString message = "<p><img src=\":/res/StatsMostSelfDamage.png\"> " + PageGameStats::tr("<b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts.", "", num).arg(info.mid(i + 1)).arg(num) + "</p>";
+            QString message = "<p><img src=\":/res/StatsMostSelfDamage.png\"> " + PageGameStats::tr("<b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts.", "", num).arg(info.mid(i + 1).toHtmlEscaped()).arg(num) + "</p>";
             AddStatText(message);
             break;
         }
@@ -378,7 +443,7 @@
         {
             int i = info.indexOf(' ');
             int num = info.left(i).toInt();
-            QString message = "<p><img src=\":/res/StatsSelfKilled.png\"> " + PageGameStats::tr("<b>%1</b> killed <b>%2</b> of their own hedgehogs.", "", num).arg(info.mid(i + 1)).arg(num) + "</p>";
+            QString message = "<p><img src=\":/res/StatsSelfKilled.png\"> " + PageGameStats::tr("<b>%1</b> killed <b>%2</b> of their own hedgehogs.", "", num).arg(info.mid(i + 1).toHtmlEscaped()).arg(num) + "</p>";
             AddStatText(message);
             break;
         }
@@ -386,13 +451,13 @@
         {
             int i = info.indexOf(' ');
             int num = info.left(i).toInt();
-            QString message = "<p><img src=\":/res/StatsSkipped.png\"> " + PageGameStats::tr("<b>%1</b> was scared and skipped turn <b>%2</b> times.", "", num).arg(info.mid(i + 1)).arg(num) + "</p>";
+            QString message = "<p><img src=\":/res/StatsSkipped.png\"> " + PageGameStats::tr("<b>%1</b> was scared and skipped turn <b>%2</b> times.", "", num).arg(info.mid(i + 1).toHtmlEscaped()).arg(num) + "</p>";
             AddStatText(message);
             break;
         }
         case 'c' :
         {
-            QString message = "<p><img src=\":/res/StatsCustomAchievement.png\"> "+info+" </p>";
+            QString message = "<p><img src=\":/res/StatsCustomAchievement.png\"> "+info.toHtmlEscaped()+" </p>";
             AddStatText(message);
             break;
         }
@@ -403,7 +468,7 @@
         }
         case 'h' :
         {
-            QString message = "<p><img src=\":/res/StatsEverAfter.png\"> " + PageGameStats::tr("With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.") + "</p>";
+            QString message = "<p><img src=\":/res/StatsEverAfter.png\"> " + PageGameStats::tr("With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.").toHtmlEscaped() + "</p>";
             AddStatText(message);
             break;
         }
--- a/QTfrontend/ui/page/pagegamestats.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/page/pagegamestats.h	Fri Aug 16 10:59:50 2019 -0600
@@ -58,6 +58,7 @@
         void clear();
         void renderStats();
         void restartBtnVisible(bool visible);
+        void saveDemoBtnEnabled(bool enabled);
 
     signals:
         void saveDemoRequested();
@@ -65,6 +66,7 @@
 
     private:
         void AddStatText(const QString & msg);
+        void applySpacing();
 
         QMap<qint32, QVector<qint32> > healthPoints;
         unsigned int playerPosition;
@@ -73,6 +75,11 @@
         bool defaultGraphTitle;
         QScopedPointer<QGraphicsScene> m_scene;
 
+        QLabel* labelDetails;
+        QGroupBox* gbDetails;
+        QGroupBox* gbRanks;
+        QGridLayout* pageLayout;
+
     protected:
         QLayout * bodyLayoutDefinition();
         QLayout * footerLayoutDefinition();
--- a/QTfrontend/ui/page/pagemain.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/page/pagemain.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -74,10 +74,14 @@
     BtnNetOfficial->setVisible(false);
 
     // button order matters for overlapping (what's on top and what isn't)
-    BtnInfo = addButton(":/res/HedgewarsTitle.png", pageLayout, 0, 0, 1, 4, true);
-	BtnInfo->setObjectName("infoButton");
+    BtnTitle = addButton(":/res/HedgewarsTitle.png", pageLayout, 0, 0, 1, 4, true);
+    BtnTitle ->setObjectName("infoButton");
+    BtnTitle->setWhatsThis(tr("Read about who is behind the Hedgewars Project"));
+    pageLayout->setAlignment(BtnTitle, Qt::AlignHCenter);
+
+    BtnInfo = addButton(":/res/AboutIcon.png", pageLayout, 0, 0, 1, 1, true);
     BtnInfo->setWhatsThis(tr("Read about who is behind the Hedgewars Project"));
-    pageLayout->setAlignment(BtnInfo, Qt::AlignHCenter);
+    pageLayout->setAlignment(BtnInfo, Qt::AlignLeft | Qt::AlignTop);
 
     BtnFeedback = addButton(tr("Feedback"), pageLayout, 4, 0, 1, 4, false);
     BtnFeedback->setStyleSheet("padding: 5px 10px");
--- a/QTfrontend/ui/page/pagemain.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/page/pagemain.h	Fri Aug 16 10:59:50 2019 -0600
@@ -37,6 +37,7 @@
         QPushButton * BtnNetOfficial;
         QPushButton * BtnSetup;
         QPushButton * BtnFeedback;
+        QPushButton * BtnTitle;
         QPushButton * BtnInfo;
         QPushButton * BtnDataDownload;
         QPushButton * BtnVideos;
--- a/QTfrontend/ui/page/pagenet.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/page/pagenet.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -47,20 +47,28 @@
     BtnNetConnect = new QPushButton(ConnGroupBox);
     BtnNetConnect->setFont(*font14);
     BtnNetConnect->setText(QPushButton::tr("Connect"));
+    BtnNetConnect->setWhatsThis(tr("Connect to the selected server"));
     GBClayout->addWidget(BtnNetConnect, 2, 2);
 
     tvServersList = new QTableView(ConnGroupBox);
     tvServersList->setSelectionBehavior(QAbstractItemView::SelectRows);
+    tvServersList->setSelectionMode(QAbstractItemView::SingleSelection);
+    tvServersList->setShowGrid(false);
+    tvServersList->setAlternatingRowColors(true);
+    tvServersList->verticalHeader()->setVisible(false);
+
     GBClayout->addWidget(tvServersList, 1, 0, 1, 3);
 
     BtnUpdateSList = new QPushButton(ConnGroupBox);
     BtnUpdateSList->setFont(*font14);
     BtnUpdateSList->setText(QPushButton::tr("Update"));
+    BtnUpdateSList->setWhatsThis(tr("Update the list of servers"));
     GBClayout->addWidget(BtnUpdateSList, 2, 0);
 
     BtnSpecifyServer = new QPushButton(ConnGroupBox);
     BtnSpecifyServer->setFont(*font14);
-    BtnSpecifyServer->setText(QPushButton::tr("Specify"));
+    BtnSpecifyServer->setText(QPushButton::tr("Specify address"));
+    BtnSpecifyServer->setWhatsThis(tr("Specify the address and port number of a known server and connect to it directly"));
     GBClayout->addWidget(BtnSpecifyServer, 2, 1);
 
     return pageLayout;
@@ -71,6 +79,7 @@
     QHBoxLayout * footerLayout = new QHBoxLayout();
 
     BtnNetSvrStart = formattedButton(QPushButton::tr("Start server"));
+    BtnNetSvrStart->setWhatsThis(tr("Start private server"));
     BtnNetSvrStart->setMinimumSize(180, 50);
     QString serverPath = bindir->absolutePath() + "/hedgewars-server";
 #ifdef Q_OS_WIN
@@ -100,6 +109,7 @@
     tvServersList->setModel(new HWNetUdpModel(tvServersList));
 
     tvServersList->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
+    tvServersList->horizontalHeader()->setSectionsClickable(false);
 
     static_cast<HWNetServersModel *>(tvServersList->model())->updateList();
 
@@ -124,5 +134,5 @@
     QString host = model->index(mi.row(), 1).data().toString();
     quint16 port = model->index(mi.row(), 2).data().toUInt();
 
-    emit connectClicked(host, port);
+    emit connectClicked(host, port, false);
 }
--- a/QTfrontend/ui/page/pagenet.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/page/pagenet.h	Fri Aug 16 10:59:50 2019 -0600
@@ -38,7 +38,7 @@
         void updateServersList();
 
     signals:
-        void connectClicked(const QString & host, quint16 port);
+        void connectClicked(const QString & host, quint16 port, bool useTls);
 
     private:
         QLayout * bodyLayoutDefinition();
--- a/QTfrontend/ui/page/pageoptions.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/page/pageoptions.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -142,6 +142,7 @@
             BtnNewTeam->setIconSize(pmNew.size());
             BtnNewTeam->setIcon(pmNew);
             BtnNewTeam->setMaximumWidth(pmNew.width() + 6);
+            BtnNewTeam->setStyleSheet("padding: 0px;");
             connect(BtnNewTeam, SIGNAL(clicked()), this, SIGNAL(newTeamRequested()));
             groupTeams->layout()->addWidget(BtnNewTeam, 0, 1);
 
@@ -150,6 +151,7 @@
             BtnEditTeam->setIconSize(pmEdit.size());
             BtnEditTeam->setIcon(pmEdit);
             BtnEditTeam->setMaximumWidth(pmEdit.width() + 6);
+            BtnEditTeam->setStyleSheet("padding: 0px;");
             connect(BtnEditTeam, SIGNAL(clicked()), this, SLOT(requestEditSelectedTeam()));
             groupTeams->layout()->addWidget(BtnEditTeam, 0, 2);
 
@@ -158,6 +160,7 @@
             BtnDeleteTeam->setIconSize(pmDelete.size());
             BtnDeleteTeam->setIcon(pmDelete);
             BtnDeleteTeam->setMaximumWidth(pmDelete.width() + 6);
+            BtnDeleteTeam->setStyleSheet("padding: 0px;");
             connect(BtnDeleteTeam, SIGNAL(clicked()), this, SLOT(requestDeleteSelectedTeam()));
             groupTeams->layout()->addWidget(BtnDeleteTeam, 0, 3);
 
@@ -184,6 +187,7 @@
             SchemeNew->setIconSize(pmNew.size());
             SchemeNew->setIcon(pmNew);
             SchemeNew->setMaximumWidth(pmNew.width() + 6);
+            SchemeNew->setStyleSheet("padding: 0px;");
             groupSchemes->layout()->addWidget(SchemeNew, 0, 1);
 
             SchemeEdit = new QPushButton(groupSchemes);
@@ -191,6 +195,7 @@
             SchemeEdit->setIconSize(pmEdit.size());
             SchemeEdit->setIcon(pmEdit);
             SchemeEdit->setMaximumWidth(pmEdit.width() + 6);
+            SchemeEdit->setStyleSheet("padding: 0px;");
             groupSchemes->layout()->addWidget(SchemeEdit, 0, 2);
 
             SchemeDelete = new QPushButton(groupSchemes);
@@ -198,6 +203,7 @@
             SchemeDelete->setIconSize(pmDelete.size());
             SchemeDelete->setIcon(pmDelete);
             SchemeDelete->setMaximumWidth(pmDelete.width() + 6);
+            SchemeDelete->setStyleSheet("padding: 0px;");
             groupSchemes->layout()->addWidget(SchemeDelete, 0, 3);
         }
 
@@ -217,6 +223,7 @@
             WeaponNew->setIconSize(pmNew.size());
             WeaponNew->setIcon(pmNew);
             WeaponNew->setMaximumWidth(pmNew.width() + 6);
+            WeaponNew->setStyleSheet("padding: 0px;");
             groupWeapons->layout()->addWidget(WeaponNew, 0, 1);
 
             WeaponEdit = new QPushButton(groupWeapons);
@@ -224,6 +231,7 @@
             WeaponEdit->setIconSize(pmEdit.size());
             WeaponEdit->setIcon(pmEdit);
             WeaponEdit->setMaximumWidth(pmEdit.width() + 6);
+            WeaponEdit->setStyleSheet("padding: 0px;");
             groupWeapons->layout()->addWidget(WeaponEdit, 0, 2);
 
             WeaponDelete = new QPushButton(groupWeapons);
@@ -231,6 +239,7 @@
             WeaponDelete->setIconSize(pmDelete.size());
             WeaponDelete->setIcon(pmDelete);
             WeaponDelete->setMaximumWidth(pmDelete.width() + 6);
+            WeaponDelete->setStyleSheet("padding: 0px;");
             groupWeapons->layout()->addWidget(WeaponDelete, 0, 3);
         }
 
@@ -273,12 +282,11 @@
             lblWinScreenRes->setText(QLabel::tr("Windowed Resolution"));
             groupGame->layout()->addWidget(lblWinScreenRes, 2, 0);
 
-            winResContainer = new QWidget();
-            QHBoxLayout * winResLayout = new QHBoxLayout(winResContainer);
+            QHBoxLayout * winResLayout = new QHBoxLayout();
             winResLayout->setSpacing(0);
-            groupGame->layout()->addWidget(winResContainer, 2, 1);
+            groupGame->layout()->addLayout(winResLayout, 2, 1, 1, 3);
 
-            QLabel *winLabelX = new QLabel(groupGame);
+            winLabelX = new QLabel(groupGame);
             //: Multiplication sign, to be used between two numbers. Note the “x” is only a dummy character, we recommend to use “×” if your language permits it
             winLabelX->setText(tr("x"));
             winLabelX->setFixedWidth(40);
@@ -307,16 +315,29 @@
 
             SLQuality = new QSlider(Qt::Horizontal, groupGame);
             SLQuality->setTickPosition(QSlider::TicksBelow);
+            SLQuality->setPageStep(2);
             SLQuality->setMaximum(5);
             SLQuality->setMinimum(0);
             SLQuality->setFixedWidth(150);
             groupGame->layout()->addWidget(SLQuality, 3, 1, Qt::AlignLeft);
 
+            // Zoom
+            QLabel * lblZoom = new QLabel(groupGame);
+            lblZoom->setText(QLabel::tr("Zoom (%)"));
+            lblZoom->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+            groupGame->layout()->addWidget(lblZoom, 4, 0);
+
+            SLZoom = new QSpinBox(groupGame);
+            SLZoom->setSingleStep(5);
+            SLZoom->setMaximum(150);
+            SLZoom->setMinimum(50);
+            groupGame->layout()->addWidget(SLZoom, 4, 1, Qt::AlignLeft);
+
             // Stereo spacing
 
             QLabel * lblStereo = new QLabel(groupGame);
             lblStereo->setText(QLabel::tr("Stereoscopy"));
-            groupGame->layout()->addWidget(lblStereo, 4, 0);
+            groupGame->layout()->addWidget(lblStereo, 5, 0);
 
             CBStereoMode = new QComboBox(groupGame);
             CBStereoMode->setWhatsThis(QComboBox::tr("Stereoscopy creates an illusion of depth when you wear 3D glasses."));
@@ -337,16 +358,16 @@
             CBStereoMode->addItem(QComboBox::tr("Side-by-side"));
             CBStereoMode->addItem(QComboBox::tr("Top-Bottom"));
             CBStereoMode->setFixedWidth(CBResolution->width());
-            groupGame->layout()->addWidget(CBStereoMode, 4, 1);
+            groupGame->layout()->addWidget(CBStereoMode, 5, 1);
 
             // Divider
 
-            groupGame->addDivider(); // row 5
+            groupGame->addDivider(); // row 6
 
             // FPS limit
 
             QHBoxLayout * fpsLayout = new QHBoxLayout();
-            groupGame->layout()->addLayout(fpsLayout, 6, 0, 1, 2);
+            groupGame->layout()->addLayout(fpsLayout, 7, 0, 1, 2);
             QLabel * maxfps = new QLabel(groupGame);
             maxfps->setText(QLabel::tr("FPS limit"));
             fpsLayout->addWidget(maxfps);
@@ -363,30 +384,30 @@
 
             // Divider
 
-            groupGame->addDivider(); // row 7
+            groupGame->addDivider(); // row 8
 
             // Alternative damage show
 
             CBAltDamage = new QCheckBox(groupGame);
             CBAltDamage->setText(QCheckBox::tr("Alternative damage show"));
-            groupGame->layout()->addWidget(CBAltDamage, 8, 0, 1, 2);
+            groupGame->layout()->addWidget(CBAltDamage, 9, 0, 1, 2);
 
             // Show ammo menu tooltips
 
             WeaponTooltip = new QCheckBox(groupGame);
             WeaponTooltip->setText(QCheckBox::tr("Show ammo menu tooltips"));
-            groupGame->layout()->addWidget(WeaponTooltip, 9, 0, 1, 2);
+            groupGame->layout()->addWidget(WeaponTooltip, 10, 0, 1, 2);
 
             groupGame->addDivider();
 
             lblTags = new QLabel(groupGame);
             lblTags->setText(QLabel::tr("Displayed tags above hogs and translucent tags"));
-            groupGame->layout()->addWidget(lblTags, 11, 0, 1, 2);
+            groupGame->layout()->addWidget(lblTags, 12, 0, 1, 2);
 
             tagsContainer = new QWidget();
             QHBoxLayout * tagsLayout = new QHBoxLayout(tagsContainer);
             tagsLayout->setSpacing(0);
-            groupGame->layout()->addWidget(tagsContainer, 12, 0, 1, 2);
+            groupGame->layout()->addWidget(tagsContainer, 13, 0, 1, 2);
 
             CBTeamTag = new QCheckBox(groupGame);
             CBTeamTag->setText(QCheckBox::tr("Team"));
@@ -954,7 +975,9 @@
     lblFullScreenRes->setVisible(state);
     CBResolution->setVisible(state);
     lblWinScreenRes->setVisible(!state);
-    winResContainer->setVisible(!state);
+    windowWidthEdit->setVisible(!state);
+    windowHeightEdit->setVisible(!state);
+    winLabelX->setVisible(!state);
 
     int index = this->CBStereoMode->currentIndex();
     if (index != 7 && index != 8 && index != 9)
@@ -1197,6 +1220,7 @@
             QModelIndexList mdl = binds->match(binds->index(0, 0), Qt::UserRole + 1, value, 1, Qt::MatchExactly);
             if(mdl.size() == 1) binder->setBindIndex(i, mdl[0].row());
         }
+        binder->checkConflicts();
     }
 
     currentTab = index;
@@ -1219,9 +1243,12 @@
 // Returns: The bind model index of the default.
 int PageOptions::resetBindToDefault(int bindID)
 {
+    if (QString(cbinds[bindID].action) == QString("!MULTI"))
+        return -1;
     QStandardItemModel * binds = DataManager::instance().bindsModel();
     QModelIndexList mdl = binds->match(binds->index(0, 0), Qt::UserRole + 1, cbinds[bindID].strbind, 1, Qt::MatchExactly);
-    if(mdl.size() == 1) binder->setBindIndex(bindID, mdl[0].row());
+    if(mdl.size() == 1)
+        binder->setBindIndex(bindID, mdl[0].row());
     return mdl[0].row();
 }
 
@@ -1230,7 +1257,9 @@
 {
     for (int i = 0; i < BINDS_NUMBER; i++)
     {
-        resetBindToDefault(i);
-        bindUpdated(i);
+        int ret = resetBindToDefault(i);
+        if(ret != -1)
+            bindUpdated(i);
     }
+    binder->checkConflicts();
 }
--- a/QTfrontend/ui/page/pageoptions.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/page/pageoptions.h	Fri Aug 16 10:59:50 2019 -0600
@@ -79,6 +79,7 @@
         QComboBox *CBResolution;
         QSpinBox *windowWidthEdit;
         QSpinBox *windowHeightEdit;
+        QLabel *winLabelX;
         QComboBox *CBStereoMode;
         QCheckBox *CBFrontendSound;
         QCheckBox *CBFrontendMusic;
@@ -110,6 +111,7 @@
         QLineEdit *editNetNick;
         QLineEdit *editNetPassword;
         QSlider *SLQuality;
+        QSpinBox *SLZoom;
         QCheckBox *CBFrontendEffects;
         QComboBox * cbProxyType;
         QSpinBox * sbProxyPort;
--- a/QTfrontend/ui/page/pageplayrecord.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/page/pageplayrecord.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -138,6 +138,7 @@
         recordMsg.setIcon(QMessageBox::Warning);
         recordMsg.setWindowTitle(QMessageBox::tr("Error"));
         recordMsg.setText(QMessageBox::tr("Please select a file from the list."));
+        recordMsg.setTextFormat(Qt::PlainText);
         recordMsg.setWindowModality(Qt::WindowModal);
         recordMsg.exec();
         return ;
@@ -165,6 +166,7 @@
             renameMsg.setIcon(QMessageBox::Warning);
             renameMsg.setWindowTitle(QMessageBox::tr("Error"));
             renameMsg.setText(QMessageBox::tr("Cannot rename file to %1.").arg(newfullname));
+            renameMsg.setTextFormat(Qt::PlainText);
             renameMsg.setWindowModality(Qt::WindowModal);
             renameMsg.exec();
         }
@@ -182,6 +184,7 @@
         recordMsg.setIcon(QMessageBox::Warning);
         recordMsg.setWindowTitle(QMessageBox::tr("Error"));
         recordMsg.setText(QMessageBox::tr("Please select a file from the list."));
+        recordMsg.setTextFormat(Qt::PlainText);
         recordMsg.setWindowModality(Qt::WindowModal);
         recordMsg.exec();
         return ;
@@ -197,6 +200,7 @@
         removeMsg.setIcon(QMessageBox::Warning);
         removeMsg.setWindowTitle(QMessageBox::tr("Error"));
         removeMsg.setText(QMessageBox::tr("Cannot delete file %1.").arg(rfile.fileName()));
+        removeMsg.setTextFormat(Qt::PlainText);
         removeMsg.setWindowModality(Qt::WindowModal);
         removeMsg.exec();
     }
--- a/QTfrontend/ui/page/pageroomslist.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/page/pageroomslist.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -504,6 +504,7 @@
         roomNameMsg.setIcon(QMessageBox::Warning);
         roomNameMsg.setWindowTitle(QMessageBox::tr("Room Name - Error"));
         roomNameMsg.setText(QMessageBox::tr("Please select room from the list"));
+        roomNameMsg.setTextFormat(Qt::PlainText);
         roomNameMsg.setWindowModality(Qt::WindowModal);
         roomNameMsg.exec();
         return;
@@ -530,6 +531,7 @@
     reallyJoinMsg.setIcon(QMessageBox::Question);
     reallyJoinMsg.setWindowTitle(QMessageBox::tr("Room Name - Are you sure?"));
     reallyJoinMsg.setText(QMessageBox::tr("The game you are trying to join has started.\nDo you still want to join the room?"));
+    reallyJoinMsg.setTextFormat(Qt::PlainText);
     reallyJoinMsg.setWindowModality(Qt::WindowModal);
     reallyJoinMsg.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
 
--- a/QTfrontend/ui/page/pagescheme.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/page/pagescheme.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -26,7 +26,10 @@
 #include <QMessageBox>
 #include <QDataWidgetMapper>
 #include <QSpinBox>
+#include <QRegExp>
+#include <QRegExpValidator>
 
+#include "hwconsts.h"
 #include "gameSchemeModel.h"
 #include "pagescheme.h"
 #include "FreqSpinBox.h"
@@ -517,6 +520,9 @@
     L_name->setText(QLabel::tr("Scheme Name:"));
 
     LE_name = new QLineEdit(this);
+    QRegExp rx(*cSafeFileNameRegExp);
+    QRegExpValidator * val = new QRegExpValidator(rx, LE_name);
+    LE_name->setValidator(val);
     LE_name->setWhatsThis(tr("Name of this scheme"));
 
     gl->addWidget(LE_name,15,1,1,5);
@@ -533,8 +539,11 @@
 
     bottomLayout->addWidget(selectScheme, 0);
     BtnCopy = addButton(tr("Copy"), bottomLayout, 1);
+    BtnCopy->setStyleSheet("padding: 5px;");
     BtnNew = addButton(tr("New"), bottomLayout, 2);
+    BtnNew->setStyleSheet("padding: 5px;");
     BtnDelete = addButton(tr("Delete"), bottomLayout, 3);
+    BtnDelete->setStyleSheet("padding: 5px;");
 
     bottomLayout->setStretch(1,1);
     bottomLayout->setStretch(2,1);
@@ -644,6 +653,7 @@
         deniedMsg.setIcon(QMessageBox::Warning);
         deniedMsg.setWindowTitle(QMessageBox::tr("Schemes - Warning"));
         deniedMsg.setText(QMessageBox::tr("Cannot delete default scheme '%1'!").arg(selectScheme->currentText()));
+        deniedMsg.setTextFormat(Qt::PlainText);
         deniedMsg.setWindowModality(Qt::WindowModal);
         deniedMsg.exec();
     }
@@ -653,6 +663,7 @@
         reallyDeleteMsg.setIcon(QMessageBox::Question);
         reallyDeleteMsg.setWindowTitle(QMessageBox::tr("Schemes - Are you sure?"));
         reallyDeleteMsg.setText(QMessageBox::tr("Do you really want to delete the game scheme '%1'?").arg(selectScheme->currentText()));
+        reallyDeleteMsg.setTextFormat(Qt::PlainText);
         reallyDeleteMsg.setWindowModality(Qt::WindowModal);
         reallyDeleteMsg.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
 
@@ -713,6 +724,7 @@
         QMessageBox dupeMsg(this);
         dupeMsg.setIcon(QMessageBox::Warning);
         dupeMsg.setWindowTitle(QMessageBox::tr("Schemes - Name already taken"));
+        dupeMsg.setTextFormat(Qt::PlainText);
         dupeMsg.setText(QMessageBox::tr("A scheme with the name '%1' already exists. Your scheme has been renamed to '%2'.").arg(name).arg(newName));
         dupeMsg.setWindowModality(Qt::WindowModal);
         dupeMsg.exec();
--- a/QTfrontend/ui/page/pageselectweapon.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/page/pageselectweapon.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -46,11 +46,15 @@
 
     // first row
     BtnNew = addButton(tr("New"), bottomLayout, 0, 1);
+    BtnNew->setStyleSheet("padding: 3px;");
     BtnDefault = addButton(tr("Default"), bottomLayout, 0, 2);
+    BtnDefault->setStyleSheet("padding: 3px;");
 
     // second row
     BtnCopy = addButton(tr("Copy"), bottomLayout, 1, 1);
+    BtnCopy->setStyleSheet("padding: 3px;");
     BtnDelete = addButton(tr("Delete"), bottomLayout, 1, 2);
+    BtnDelete->setStyleSheet("padding: 3px;");
 
     bottomLayout->setColumnStretch(1,1);
     bottomLayout->setColumnStretch(2,1);
--- a/QTfrontend/ui/page/pagesingleplayer.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/page/pagesingleplayer.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -48,7 +48,7 @@
     BtnCampaignPage->setVisible(true);
 
     BtnTrainPage = addButton(":/res/Trainings.png", middleLine, 1, true);
-    BtnTrainPage->setWhatsThis(tr("Practice your skills in a range of training missions"));
+    BtnTrainPage->setWhatsThis(tr("Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios."));
 
     return vLayout;
 }
--- a/QTfrontend/ui/page/pagetraining.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/page/pagetraining.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -28,6 +28,7 @@
 #include <QLocale>
 #include <QSettings>
 
+#include "mission.h"
 #include "hwconsts.h"
 #include "DataManager.h"
 
@@ -37,29 +38,32 @@
 {
     QGridLayout * pageLayout = new QGridLayout();
 
-// left column
-
     // declare start button, caption and description
     btnPreview = formattedButton(":/res/Trainings.png", true);
 
-    // make both rows equal height
+    // tweak widget spacing
     pageLayout->setRowStretch(0, 1);
     pageLayout->setRowStretch(1, 1);
+    pageLayout->setRowStretch(2, 1);
+    pageLayout->setColumnStretch(0, 5);
+    pageLayout->setColumnStretch(1, 1);
+    pageLayout->setColumnStretch(2, 9);
+    pageLayout->setColumnStretch(3, 5);
 
-    // add start button, caption and description to 3 different rows
-    pageLayout->addWidget(btnPreview, 0, 0);
+    QWidget * infoWidget = new QWidget();
+    QHBoxLayout * infoLayout = new QHBoxLayout();
+    // add preview, caption and description
+    infoWidget->setLayout(infoLayout);
+    infoLayout->addWidget(btnPreview);
 
     // center preview
-    pageLayout->setAlignment(btnPreview, Qt::AlignRight | Qt::AlignVCenter);
-
-
-// right column
+    infoLayout->setAlignment(btnPreview, Qt::AlignRight | Qt::AlignVCenter);
 
     // info area (caption on top, description below)
-    QWidget * infoWidget = new QWidget();
-    QVBoxLayout * infoLayout = new QVBoxLayout();
-    infoWidget->setObjectName("trainingInfo");
-    infoWidget->setLayout(infoLayout);
+    QWidget * infoTextWidget = new QWidget();
+    QVBoxLayout * infoTextLayout = new QVBoxLayout();
+    infoTextWidget->setObjectName("trainingInfo");
+    infoTextWidget->setLayout(infoTextLayout);
 
     lblCaption = new QLabel();
     lblCaption->setMinimumWidth(360);
@@ -69,38 +73,51 @@
     lblDescription->setMinimumWidth(360);
     lblDescription->setAlignment(Qt::AlignHCenter | Qt::AlignTop);
     lblDescription->setWordWrap(true);
+    lblHighscores = new QLabel();
+    lblHighscores->setMinimumWidth(360);
+    lblHighscores->setAlignment(Qt::AlignHCenter | Qt::AlignTop);
 
-    infoLayout->addWidget(lblCaption);
-    infoLayout->addWidget(lblDescription);
+    infoTextLayout->addWidget(lblCaption);
+    infoTextLayout->addWidget(lblDescription);
+    infoTextLayout->addWidget(lblHighscores);
 
-    pageLayout->addWidget(infoWidget, 0, 1);
-    pageLayout->setAlignment(infoWidget, Qt::AlignLeft);
+    infoLayout->addWidget(infoTextWidget);
+
+    pageLayout->addWidget(infoWidget, 0, 1, 1, 2); // span 2 columns
+    pageLayout->setAlignment(infoTextWidget, Qt::AlignLeft);
 
 
     // tab widget containing all lists
     tbw = new QTabWidget(this);
-    pageLayout->addWidget(tbw, 1, 0, 1, 2); // span 2 columns
+    pageLayout->addWidget(tbw, 1, 0, 1, 4); // span 4 columns
     // let's not make the tab widget use more space than needed
     tbw->setFixedWidth(400);
     pageLayout->setAlignment(tbw, Qt::AlignHCenter);
-    
-    tbw->setStyleSheet("QListWidget { border-style: none; padding-top: 6px; }");
 
     // training/challenge/scenario lists
     lstTrainings = new QListWidget(this);
     lstTrainings ->setWhatsThis(tr("Pick the training to play"));
+    lstTrainings ->setObjectName("trainingList");
 
     lstChallenges = new QListWidget(this);
     lstChallenges ->setWhatsThis(tr("Pick the challenge to play"));
+    lstChallenges ->setObjectName("trainingList");
 
     lstScenarios= new QListWidget(this);
     lstScenarios->setWhatsThis(tr("Pick the scenario to play"));
+    lstScenarios->setObjectName("trainingList");
 
     tbw->addTab(lstTrainings, tr("Trainings"));
     tbw->addTab(lstChallenges, tr("Challenges"));
     tbw->addTab(lstScenarios, tr("Scenarios"));
     tbw->setCurrentWidget(lstTrainings);
 
+    QLabel* lblteam = new QLabel(tr("Team"));
+    CBTeam = new QComboBox(this);
+    CBTeam->setMaxVisibleItems(30);
+    pageLayout->addWidget(lblteam, 2, 1);
+    pageLayout->addWidget(CBTeam, 2, 2);
+
     return pageLayout;
 }
 
@@ -200,6 +217,7 @@
         // first, load scripts in order specified in order.cfg (if present)
         QFile orderFile(QString("physfs://Missions/%1/order.cfg").arg(subFolder));
         QStringList orderedMissions;
+
         if (orderFile.open(QFile::ReadOnly))
         {
             QString m_id;
@@ -287,7 +305,7 @@
     list = (QListWidget*) tbw->currentWidget();
     QListWidgetItem * curItem = list->currentItem();
 
-    if (curItem != NULL)
+    if ((curItem != NULL) && (CBTeam->currentIndex() != -1))
         emit startMission(curItem->data(Qt::UserRole).toString(), getSubFolderOfSelected());
 }
 
@@ -302,36 +320,70 @@
         list = (QListWidget*) tbw->currentWidget();
         if (list->currentItem())
         {
+            QString missionName = list->currentItem()->data(Qt::UserRole).toString();
             QString thumbFile =     "physfs://Graphics/Missions/" +
                                     subFolder + "/" +
-                                    list->currentItem()->data(Qt::UserRole).toString() +
+                                    missionName +
                                     "@2x.png";
 
             if (QFile::exists(thumbFile))
                 btnPreview->setIcon(QIcon(thumbFile));
+            else if (tbw->currentWidget() == lstChallenges)
+                btnPreview->setIcon(QIcon(":/res/Challenges.png"));
+            else if (tbw->currentWidget() == lstScenarios)
+                // TODO: Prettier scenario fallback image
+                btnPreview->setIcon(QIcon(":/res/Scenarios.png"));
             else
                 btnPreview->setIcon(QIcon(":/res/Trainings.png"));
 
             btnPreview->setWhatsThis(tr("Start fighting"));
 
-            QString realName = list->currentItem()->data(
-                                    Qt::UserRole).toString();
-
-            QString caption = m_info->value(realName + ".name",
+            QString caption = m_info->value(missionName + ".name",
                                             list->currentItem()->text()).toString();
 
-            QString description = m_info->value(realName + ".desc",
+            QString description = m_info->value(missionName + ".desc",
                                                 tr("No description available")).toString();
 
             lblCaption->setText("<h2>" + caption +"</h2>");
             lblDescription->setText(description);
+
+            // Challenge highscores
+            QString highscoreText = QString("");
+            QString teamName = CBTeam->currentText();
+            if (missionValueExists(missionName, teamName, "Highscore"))
+                highscoreText = highscoreText +
+                    //: Highest score of a team
+                    tr("Team highscore: %1")
+                    .arg(getMissionValue(missionName, teamName, "Highscore").toString()) + "\n";
+            if (missionValueExists(missionName, teamName, "Lowscore"))
+                highscoreText = highscoreText +
+                    //: Lowest score of a team
+                    tr("Team lowscore: %1")
+                    .arg(getMissionValue(missionName, teamName, "Lowscore").toString()) + "\n";
+            if (missionValueExists(missionName, teamName, "AccuracyRecord"))
+                highscoreText = highscoreText +
+                    //: Best accuracy of a team (in a challenge)
+                    tr("Team's top accuracy: %1%")
+                    .arg(getMissionValue(missionName, teamName, "AccuracyRecord").toString()) + "\n";
+            if (missionValueExists(missionName, teamName, "TimeRecord"))
+            {
+                double time = ((double) getMissionValue(missionName, teamName, "TimeRecord").toInt()) / 1000.0;
+                highscoreText = highscoreText + tr("Team's best time: %L1 s").arg(time, 0, 'f', 3) + "\n";
+            }
+            if (missionValueExists(missionName, teamName, "TimeRecordHigh"))
+            {
+                double time = ((double) getMissionValue(missionName, teamName, "TimeRecordHigh").toInt()) / 1000.0;
+                highscoreText = highscoreText + tr("Team's longest time: %L1 s").arg(time, 0, 'f', 3) + "\n";
+            }
+
+            lblHighscores->setText(highscoreText);
         }
         else
         {
             btnPreview->setIcon(QIcon(":/res/Trainings.png"));
             lblCaption->setText(tr("Select a mission!"));
-            // TODO better text and tr()
             lblDescription->setText("");
+            lblHighscores->setText("");
         }
     }
 }
--- a/QTfrontend/ui/page/pagetraining.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/page/pagetraining.h	Fri Aug 16 10:59:50 2019 -0600
@@ -27,7 +27,15 @@
 
     public:
         PageTraining(QWidget* parent = 0);
+        QListWidget * lstTrainings;
+        QListWidget * lstChallenges;
+        QListWidget * lstScenarios;
+        QPushButton * btnPreview;
+        QPushButton * btnStart;
+        QComboBox * CBTeam;
 
+    public slots:
+        void updateInfo();
 
     signals:
         void startMission(const QString & scriptName, const QString & subFolder);
@@ -40,21 +48,16 @@
 
 
     private:
-        QPushButton * btnPreview;
-        QPushButton * btnStart;
         QLabel * lblCaption;
         QLabel * lblDescription;
+        QLabel * lblHighscores;
         QTabWidget * tbw;
-        QListWidget * lstTrainings;
-        QListWidget * lstChallenges;
-        QListWidget * lstScenarios;
         QSettings * m_info;
         QString getSubFolderOfSelected();
 
 
     private slots:
         void startSelected();
-        void updateInfo();
 
 };
 
--- a/QTfrontend/ui/page/pagevideos.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/page/pagevideos.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -48,6 +48,7 @@
 #include "gameuiconfig.h"
 #include "recorder.h"
 #include "ask_quit.h"
+#include "util/MessageDialog.h"
 
 static const QSize ThumbnailSize(350, 350*3/5);
 
@@ -122,14 +123,19 @@
         filesTable->setSelectionBehavior(QAbstractItemView::SelectRows);
         filesTable->setSelectionMode(QAbstractItemView::SingleSelection);
         filesTable->setEditTriggers(QAbstractItemView::SelectedClicked);
+        filesTable->setShowGrid(false);
+        filesTable->setAlternatingRowColors(true);
         filesTable->verticalHeader()->hide();
         filesTable->setMinimumWidth(400);
 
-        QHeaderView * header = filesTable->horizontalHeader();
+        QHeaderView * header = new QHeaderView(Qt::Horizontal, filesTable);
+        filesTable->setHorizontalHeader(header);
+        header = filesTable->horizontalHeader();
+        header->setStretchLastSection(true);
+        header->setSectionsClickable(false);
         header->setSectionResizeMode(vcName, QHeaderView::ResizeToContents);
         header->setSectionResizeMode(vcSize, QHeaderView::Fixed);
         header->resizeSection(vcSize, 100);
-        header->setStretchLastSection(true);
 
         btnOpenDir = new QPushButton(QPushButton::tr("Open videos directory"), pTableGroup);
         btnOpenDir->setWhatsThis(QPushButton::tr("Open the video directory in your system"));
@@ -215,6 +221,8 @@
 {
     nameChangedFromCode = false;
     numRecorders = 0;
+    // Clear VideoTemp at launch in case some garbage remained in here after a crash
+    clearTemp();
     initPage();
 }
 
@@ -287,6 +295,7 @@
         VideoItem * item = nameItem(row);
         item->seen = true;
         item->desc = "";
+        setName(item, item->name);
         updateSize(row);
     }
 
@@ -315,6 +324,7 @@
     progressBar->setValue(0);
     connect(pRecorder, SIGNAL(onProgress(float)), this, SLOT(updateProgress(float)));
     connect(pRecorder, SIGNAL(encodingFinished(bool)), this, SLOT(encodingFinished(bool)));
+    connect(pRecorder, SIGNAL(ErrorMessage(const QString &)), this, SLOT(ShowFatalErrorMessage(const QString &)), Qt::QueuedConnection);
     filesTable->setCellWidget(row, vcProgress, progressBar);
 
     numRecorders++;
@@ -395,15 +405,40 @@
     // user has edited filename, so we should rename the file
     VideoItem * item = nameItem(row);
     QString oldName = item->name;
+    int pointPos = oldName.lastIndexOf('.');
+    QString oldPrefix = item->name;
+    oldPrefix.truncate(pointPos);
     QString newName = item->text();
     if (!newName.contains('.')) // user forgot an extension
     {
         // restore old extension
-        int pt = oldName.lastIndexOf('.');
-        if (pt != -1)
+        pointPos = oldName.lastIndexOf('.');
+        if (pointPos != -1)
+        {
+            newName += oldName.right(oldName.length() - pointPos);
+            setName(item, newName);
+        }
+    }
+    QString newPrefix;
+    if (newName.contains('.'))
+    {
+        pointPos = newName.lastIndexOf('.');
+        if (pointPos != -1)
         {
-            newName += oldName.right(oldName.length() - pt);
-            setName(item, newName);
+            newPrefix = newName;
+            newPrefix.truncate(pointPos);
+        }
+    }
+    else
+        newPrefix = newName;
+    for (int i = 0; i < filesTable->rowCount(); i++)
+    {
+        // don't allow rename if duplicate prefix
+        VideoItem * iterateItem = nameItem(i);
+        if ((i != row) && (newPrefix == iterateItem->prefix))
+        {
+            setName(item, oldName);
+            return;
         }
     }
 #ifdef Q_OS_WIN
@@ -421,7 +456,13 @@
         setName(item, oldName);
         return;
     }
+    if (item->ready())
+    {
+        cfgdir->rename("VideoThumbnails/" + oldPrefix + ".png", "VideoThumbnails/" + newPrefix + ".png");
+        cfgdir->rename("VideoThumbnails/" + oldPrefix + ".bmp", "VideoThumbnails/" + newPrefix + ".bmp");
+    }
     item->name = newName;
+    item->prefix = newPrefix;
     updateDescription();
 }
 
@@ -431,6 +472,15 @@
     item->setText(newName);
     nameChangedFromCode = false;
     item->name = newName;
+    // try to extract prefix
+    if (item->ready())
+        item->prefix = item->name;
+    else
+        item->prefix = item->pRecorder->name;
+    // remove extension
+    int pt = item->prefix.lastIndexOf('.');
+    if (pt != -1)
+        item->prefix.truncate(pt);
 }
 
 int PageVideos::appendRow(const QString & name)
@@ -517,7 +567,7 @@
         desc += item->desc + '\n';
     }
 
-    if (item->prefix.isEmpty())
+    if (item->prefix.isNull() || item->prefix.isEmpty())
     {
         // try to extract prefix from file name instead
         if (item->ready())
@@ -535,7 +585,7 @@
 
     if (!item->prefix.isEmpty())
     {
-        QString thumbName = cfgdir->absoluteFilePath("VideoTemp/" + item->prefix);
+        QString thumbName = cfgdir->absoluteFilePath("VideoThumbnails/" + item->prefix);
         QPixmap pic;
         if (pic.load(thumbName + ".png") || pic.load(thumbName + ".bmp"))
         {
@@ -586,6 +636,7 @@
     reallyDeleteMsg.setIcon(QMessageBox::Question);
     reallyDeleteMsg.setWindowTitle(QMessageBox::tr("Videos - Are you sure?"));
     reallyDeleteMsg.setText(QMessageBox::tr("Do you really want to delete the video '%1'?").arg(item->name));
+    reallyDeleteMsg.setTextFormat(Qt::PlainText);
     reallyDeleteMsg.setWindowModality(Qt::WindowModal);
     reallyDeleteMsg.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
 
@@ -599,8 +650,8 @@
     {
         cfgdir->remove("Videos/" + item->name);
         // we have no idea whether screenshot is going to be bmp or png so let's delete both
-        cfgdir->remove("VideoTemp/" + item->prefix + ".png");
-        cfgdir->remove("VideoTemp/" + item->prefix + ".bmp");
+        cfgdir->remove("VideoThumbnails/" + item->prefix + ".png");
+        cfgdir->remove("VideoThumbnails/" + item->prefix + ".bmp");
     }
 
 // this code is for removing several files when multiple selection is enabled
@@ -659,14 +710,21 @@
     QDesktopServices::openUrl(QUrl("file:///" + path));
 }
 
-// clear VideoTemp directory (except for thumbnails)
+// clear VideoTemp directory
 void PageVideos::clearTemp()
 {
+    qDebug("Clearing VideoTemp directory ...");
     QDir temp(cfgdir->absolutePath() + "/VideoTemp");
     QStringList files = temp.entryList(QDir::Files);
     foreach (const QString& file, files)
     {
-        if (!file.endsWith(".bmp") && !file.endsWith(".png"))
+        // Legacy support: Move thumbnails to correct dir
+        if (file.endsWith(".bmp") || file.endsWith(".png"))
+        {
+            qDebug("Moving video thumbnail '%s' to VideoThumbnails directory", qPrintable(file));
+            cfgdir->rename("VideoTemp/" + file, "VideoThumbnails/" + file);
+        }
+        else
             temp.remove(file);
     }
 }
@@ -742,3 +800,8 @@
     }
 }
 
+void PageVideos::ShowFatalErrorMessage(const QString & msg)
+{
+    MessageDialog::ShowFatalMessage(msg, this);
+}
+
--- a/QTfrontend/ui/page/pagevideos.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/page/pagevideos.h	Fri Aug 16 10:59:50 2019 -0600
@@ -86,6 +86,7 @@
         void deleteSelectedFiles();
         void openVideosDirectory();
         void updateFileList(const QString & path);
+        void ShowFatalErrorMessage(const QString & msg);
 };
 
 #endif // PAGE_VIDEOS_H
--- a/QTfrontend/ui/widget/about.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/widget/about.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -32,6 +32,8 @@
 #include "SDL.h"
 #include "SDL_version.h"
 #include "physfs.h"
+#include "creditsmessages.h"
+#include "HWApplication.h"
 
 #ifdef VIDEOREC
 extern "C"
@@ -53,6 +55,193 @@
 
 #include "about.h"
 
+QString About::getCreditsHtml()
+{
+    // Open the credits file
+
+    /* *** FILE FORMAT OF CREDITS FILE ***
+    The credits file is an RFC-4180-compliant CSV file with 5 columns.
+    The first column (column 1) is always 1 letter long and is the row type.
+    The row type determines the meaning of the other columns.
+
+    The following row types are supported:
+
+    * E: Credits entry
+        * Column 2: Task/contribution
+        * Column 3: Contributor name
+        * Column 4: Contributor e-mail
+        * Column 5: Contributor nickname
+    * M: Alternative credits entry that is a placeholder for other or unknown authors
+        * Columns 2-5: Unused
+    * S: Section
+        * Column 2: Section name
+        * Columns 3-5: Unused
+    * U: Subsection
+        * Column 2: Subsection name
+        * Columns 3-5: Unused
+
+    Columns 2, 3 and 5 MUST be in US-ASCII.
+    */
+    QFile creditsFile(":/res/credits.csv");
+    if (!creditsFile.open(QIODevice::ReadOnly))
+    {
+        qWarning("ERROR: Credits file could not be opened!");
+        return "<p>ERROR: Credits file could not be opened!</p>";
+    }
+    QString creditsString = creditsFile.readAll();
+    QString out = QString("<h1>" + tr("Credits") + "</h1>\n");
+    QStringList cells = QStringList() << QString("") << QString("") << QString("") << QString("") << QString("");
+    bool firstSection = true;
+    unsigned long int column = 0;
+    unsigned long int charInCell = 0;
+    bool isInQuote = false;
+    bool ignoreChar = false;
+    bool lineComplete = false;
+    QChar currChar;
+    QChar prevChar;
+    for(long long int i = 0; i<creditsString.length(); i++)
+    {
+        currChar = creditsString.at(i);
+        QString type, task, name, mail, nick;
+        if(currChar == '"')
+        {
+            if(charInCell == 0)
+            {
+                isInQuote = true;
+                ignoreChar = true;
+            }
+            else if(isInQuote && prevChar != '"')
+            {
+                ignoreChar = true;
+            }
+        }
+        else if(isInQuote && charInCell > 0 && prevChar == '"' && (currChar == '\r' || currChar == ','))
+        {
+            isInQuote = false;
+            ignoreChar = true;
+        }
+
+        charInCell++;
+        if(!isInQuote && currChar == ',')
+        {
+            column++;
+            charInCell = 0;
+        }
+        else if(!isInQuote && currChar == '\n' && prevChar == '\r')
+        {
+            lineComplete = true;
+        }
+        if(!isInQuote && (currChar == '\r' || currChar == '\n' || currChar == ','))
+        {
+            ignoreChar = true;
+        }
+
+
+        if(!ignoreChar)
+        {
+            cells[column].append(currChar);
+        }
+        ignoreChar = false;
+
+        if(lineComplete)
+        {
+            type = cells[0];
+            task = cells[1];
+            name = cells[2];
+            mail = cells[3];
+            nick = cells[4];
+
+            if(type == "S")
+            {
+                // section
+                if (!firstSection)
+                    out = out + "</ul>\n";
+                out = out + "<h2>" + HWApplication::translate("credits", task.toLatin1().constData()) + "</h2>\n<ul>\n";
+                firstSection = false;
+            }
+            else if(type == "U")
+            {
+                // subsection
+                out = out + "</ul>\n";
+                out = out + "<h3>" + HWApplication::translate("credits", task.toLatin1().constData()) + "</h3>\n<ul>\n";
+            }
+            else if(type == "M")
+            {
+                // other people
+                out = out + "<li>" + tr("Other people") + "</li>" + "\n";
+            }
+            else if(type == "E")
+            {
+                QString showName = QString("");
+                if(!name.isEmpty())
+                    name = "<span class=\"name\">"+name+"</span>";
+                if(!nick.isEmpty())
+                    nick= "<span class=\"nick\">"+nick+"</span>";
+                if(!name.isEmpty() && !nick.isEmpty())
+                    showName = tr("%1 (alias %2)").arg(name).arg(nick);
+                else if(name.isEmpty() && !nick.isEmpty())
+                    showName = nick;
+                else if(!name.isEmpty() && nick.isEmpty())
+                    showName = name;
+                // credits list entry
+                QString mailLink = QString("<a href=\"mailto:%1\">%1</a>").arg(mail);
+                if(task.isEmpty() && mail.isEmpty() && !showName.isEmpty())
+                {
+                    // Name only
+                    out = out + "<li>" + showName + "</li>\n";
+                }
+                else if(showName.isEmpty() && mail.isEmpty() && !task.isEmpty())
+                {
+                    // Task only
+                    out = out + "<li>" + HWApplication::translate("credits", task.toLatin1().constData()) + "</li>\n";
+                }
+                else if(task.isEmpty())
+                {
+                    // Name and e-mail
+                    //: Part of credits. %1: Contributor name. %2: E-mail address
+                    out = out + "<li>" + tr("%1 &lt;%2&gt;").arg(showName).arg(mailLink) + "</li>\n";
+                }
+                else if(mail.isEmpty())
+                {
+                    // Contribution and name
+                    //: Part of credits. %1: Description of contribution. %2: Contributor name
+                    out = out + "<li>" + tr("%1: %2")
+                        .arg(HWApplication::translate("credits", task.toLatin1().constData()))
+                        .arg(showName)
+                        + "</li>\n";
+                }
+                else
+                {
+                    // Contribution, name and e-mail
+                    //: Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address
+                    out = out + "<li>" + tr("%1: %2 &lt;%3&gt;")
+                        .arg(HWApplication::translate("credits", task.toLatin1().constData()))
+                        .arg(showName)
+                        .arg(mailLink)
+                        + "</li>\n";
+                }
+            }
+            else
+            {
+                qWarning("Invalid row type in credits.csv: %s", qPrintable(type));
+            }
+            lineComplete = false;
+            column = 0;
+            cells[0] = "";
+            cells[1] = "";
+            cells[2] = "";
+            cells[3] = "";
+            cells[4] = "";
+            charInCell = 0;
+        }
+
+        prevChar = currChar;
+    }
+    creditsFile.close();
+    out = out + "</ul>";
+    return out;
+}
+
 About::About(QWidget * parent) :
     QWidget(parent)
 {
@@ -89,11 +278,35 @@
     lbl1->setWordWrap(true);
     mainLayout->addWidget(lbl1, 0, 1);
 
-    lbl2 = new QTextBrowser(this);
-    lbl2->setOpenExternalLinks(true);
-    QUrl localpage = QUrl::fromLocalFile(":/res/html/about.html");
-    lbl2->setSource(localpage); //sets the source of the label from the file above
-    mainLayout->addWidget(lbl2, 1, 1);
+    /* Credits */
+    creditsBrowser = new QTextBrowser(this);
+    creditsBrowser->setOpenExternalLinks(true);
+    QString credits = getCreditsHtml();
+
+    QString header =
+        "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">"
+        "<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"en\" xml:lang=\"en\">"
+        "<head>"
+        "<title>Hedgewars Credits</title>"
+        "<meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\" />"
+        "<style type=\"text/css\">"
+        "     body { color: orange; }"
+        "     a { color: #ffe270; }"
+        "     ul { list-style-type: none; }"
+        "     .name { color: #ffffff; font-weight: bold; }"
+        "     .nick { color: #ffff00; font-weight: bold; }"
+        "</style>"
+        "</head>"
+        "<body>"
+        "";
+    QString footer =
+        ""
+        "<h2>" + tr("Extended Credits") + "</h2>"
+        "<p>" + tr("An extended credits list can be found in the CREDITS text file.") + "</p>"
+        "</body></html>";
+
+    creditsBrowser->setHtml(header + credits + footer);
+    mainLayout->addWidget(creditsBrowser, 1, 1);
 
     /* Library information */
 
@@ -102,6 +315,10 @@
 
 #if defined(__GNUC__)
     libinfo.append(QString(tr("<a href=\"https://gcc.gnu.org\">GCC</a>: %1")).arg(__VERSION__));
+#elif defined(WIN32_VCPKG)
+    libinfo.append(QString(tr("<a href=\"https://visualstudio.microsoft.com\">VC++</a>: %1")).arg(_MSC_FULL_VER));
+#elif defined(__VERSION__)
+    libinfo.append(QString(tr("Unknown Compiler: %1")).arg(__VERSION__));
 #else
     libinfo.append(QString(tr("Unknown Compiler")));
 #endif
--- a/QTfrontend/ui/widget/about.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/widget/about.h	Fri Aug 16 10:59:50 2019 -0600
@@ -35,7 +35,8 @@
         virtual void dropEvent(QDropEvent * event);
 
     private:
-        QTextBrowser * lbl2;
+        QString getCreditsHtml();
+        QTextBrowser * creditsBrowser;
 };
 
 #endif // _ABOUT_H
--- a/QTfrontend/ui/widget/chatwidget.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/widget/chatwidget.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -201,8 +201,7 @@
     mainLayout.setMargin(0);
 
     QWidget * leftSideContainer = new QWidget();
-    leftSideContainer->setObjectName("leftSideContainer");
-    leftSideContainer->setStyleSheet("#leftSideContainer { border-width: 0px; background-color: #ffcc00; border-radius: 10px;} QTextBrowser, SmartLineEdit { background-color: rgb(13, 5, 68); }");
+    leftSideContainer->setObjectName("chatContainer");
     QVBoxLayout * leftSide = new QVBoxLayout(leftSideContainer);
     leftSide->setSpacing(3);
     leftSide->setMargin(3);
@@ -217,7 +216,7 @@
     chatText->setMinimumWidth(10);
     chatText->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
     chatText->setOpenLinks(false);
-    chatText->setStyleSheet("QTextBrowser { background-color: rgb(23, 11, 54); border-width: 0px; }");
+    chatText->setObjectName("chatText");
     connect(chatText, SIGNAL(anchorClicked(const QUrl&)),
             this, SLOT(linkClicked(const QUrl&)));
     leftSide->addWidget(chatText, 1);
@@ -521,10 +520,18 @@
     if (!isIgnored)
         printChatString(nick, QString("*** ") + tr("%1 has joined").arg(linkedNick(nick)), "Join", false);
 
-    if (notifyNick && notify && (m_helloSounds.size() > 0))
+    if (notifyNick && notify)
     {
-        SDLInteraction::instance().playSoundFile(
+        if (m_helloSounds.size() > 0)
+        {
+            SDLInteraction::instance().playSoundFile(
                             m_helloSounds.at(rand() % m_helloSounds.size()));
+        }        
+
+        if (!isInGame())
+        {
+            HWApplication::alert(this, 2000);
+        }
     }
 }
 
--- a/QTfrontend/ui/widget/colorwidget.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/widget/colorwidget.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -30,7 +30,7 @@
 
     QStandardItem * item = m_colorsModel->item(m_color);
 
-    setStyleSheet(QString("* { border: 2px solid #ffcc00; border-radius: 8px; background: %1 } :disabled { border-color: #a0a0a0; }").arg(item->data().value<QColor>().name()));
+    setStyleSheet(QString("* { border: 2px solid #ffcc00; border-radius: 8px; background: %1 } :disabled { border-color: #a0a0a0; } :hover { border-color: #ffff00; }").arg(item->data().value<QColor>().name()));
     /*
     QPalette p = palette();
     p.setColor(QPalette::Window, item->data().value<QColor>());
@@ -67,6 +67,7 @@
 
 void ColorWidget::wheelEvent(QWheelEvent *event)
 {
+    event->accept();
     if(event->delta() > 0)
         previousColor();
     else
--- a/QTfrontend/ui/widget/drawmapwidget.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/widget/drawmapwidget.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -154,6 +154,7 @@
             errorMsg.setIcon(QMessageBox::Warning);
             errorMsg.setWindowTitle(QMessageBox::tr("File error"));
             errorMsg.setText(QMessageBox::tr("Cannot open '%1' for writing").arg(fileName));
+            errorMsg.setTextFormat(Qt::PlainText);
             errorMsg.setWindowModality(Qt::WindowModal);
             errorMsg.exec();
         }
@@ -174,6 +175,7 @@
             errorMsg.setIcon(QMessageBox::Warning);
             errorMsg.setWindowTitle(QMessageBox::tr("File error"));
             errorMsg.setText(QMessageBox::tr("Cannot open '%1' for reading").arg(fileName));
+            errorMsg.setTextFormat(Qt::PlainText);
             errorMsg.setWindowModality(Qt::WindowModal);
             errorMsg.exec();
         }
--- a/QTfrontend/ui/widget/feedbackdialog.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/widget/feedbackdialog.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -330,6 +330,7 @@
     msgMsg.setIcon(QMessageBox::Warning);
     msgMsg.setWindowTitle(QMessageBox::tr("Hedgewars - Error"));
     msgMsg.setText(msg);
+    msgMsg.setTextFormat(Qt::PlainText);
     msgMsg.setWindowModality(Qt::WindowModal);
     msgMsg.exec();
 }
@@ -417,6 +418,7 @@
             infoMsg.setIcon(QMessageBox::Information);
             infoMsg.setWindowTitle(QMessageBox::tr("Hedgewars - Success"));
             infoMsg.setText(reply->readAll());
+            infoMsg.setTextFormat(Qt::PlainText);
             infoMsg.setWindowModality(Qt::WindowModal);
             infoMsg.exec();
 
--- a/QTfrontend/ui/widget/frameTeam.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/widget/frameTeam.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -151,9 +151,11 @@
     {
         setStyleSheet(
             "FrameTeams{"
-            "border: solid;"
+            "border-top: transparent;"
+            "border-left: transparent;"
+            "border-right: transparent;"
+            "border-bottom: solid;"
             "border-width: 1px;"
-            "border-radius: 16px;"
             "border-color: #ffcc00;"
             "}"
         );
@@ -163,3 +165,11 @@
         setStyleSheet("FrameTeams{ border: transparent }");
     }
 }
+
+void FrameTeams::resizeEvent(QResizeEvent * event)
+{
+    Q_UNUSED(event);
+
+    QResizeEvent* pevent=new QResizeEvent(parentWidget()->size(), parentWidget()->size());
+    QCoreApplication::postEvent(parentWidget(), pevent);
+}
--- a/QTfrontend/ui/widget/frameTeam.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/widget/frameTeam.h	Fri Aug 16 10:59:50 2019 -0600
@@ -53,6 +53,9 @@
         void addTeam(HWTeam team, bool willPlay);
         void removeTeam(HWTeam team);
 
+    protected:
+        virtual void resizeEvent(QResizeEvent * event);
+
     private:
         int currentColor;
 
--- a/QTfrontend/ui/widget/gamecfgwidget.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/widget/gamecfgwidget.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -150,6 +150,7 @@
     goToSchemePage->setIconSize(pmEdit.size());
     goToSchemePage->setIcon(iconEdit);
     goToSchemePage->setMaximumWidth(pmEdit.width() + 6);
+    goToSchemePage->setStyleSheet("padding: 0px;");
     SchemeWidgetLayout->addWidget(goToSchemePage, 0, 3);
     connect(goToSchemePage, SIGNAL(clicked()), this, SLOT(jumpToSchemes()));
 
@@ -172,6 +173,7 @@
     goToWeaponPage->setIconSize(pmEdit.size());
     goToWeaponPage->setIcon(pmEdit);
     goToWeaponPage->setMaximumWidth(pmEdit.width() + 6);
+    goToWeaponPage->setStyleSheet("padding: 0px;");
     SchemeWidgetLayout->addWidget(goToWeaponPage, 1, 3);
     connect(goToWeaponPage, SIGNAL(clicked()), this, SLOT(jumpToWeapons()));
 
@@ -336,6 +338,7 @@
     bcfg << QString("e$gmflags %1").arg(getGameFlags()).toUtf8();
     bcfg << QString("e$damagepct %1").arg(schemeData(26).toInt()).toUtf8();
     bcfg << QString("e$turntime %1").arg(schemeData(27).toInt() * 1000).toUtf8();
+    bcfg << QString("e$inithealth %1").arg(schemeData(28).toInt()).toUtf8();
     bcfg << QString("e$sd_turns %1").arg(schemeData(29).toInt()).toUtf8();
     bcfg << QString("e$casefreq %1").arg(schemeData(30).toInt()).toUtf8();
     bcfg << QString("e$minestime %1").arg(schemeData(31).toInt() * 1000).toUtf8();
@@ -400,6 +403,7 @@
         illegalMsg.setIcon(QMessageBox::Warning);
         illegalMsg.setWindowTitle(QMessageBox::tr("Error"));
         illegalMsg.setText(QMessageBox::tr("Cannot use the weapon scheme '%1'!").arg(name));
+        illegalMsg.setTextFormat(Qt::PlainText);
         illegalMsg.setWindowModality(Qt::WindowModal);
         illegalMsg.exec();
     }
@@ -545,6 +549,65 @@
     }
 }
 
+void GameCFGWidget::resetSchemeStates()
+{
+    updateSchemeEnabledStates(Scripts->currentIndex());
+}
+
+void GameCFGWidget::updateSchemeEnabledStates(int scriptIndex)
+{
+    QString scheme;
+    QString weapons;
+    if(scriptIndex > 0)
+    {
+        scheme = Scripts->itemData(scriptIndex, GameStyleModel::SchemeRole).toString();
+        weapons = Scripts->itemData(scriptIndex, GameStyleModel::WeaponsRole).toString();
+    }
+    else
+    {
+        scheme = pMapContainer->getCurrentScheme();
+        weapons = pMapContainer->getCurrentWeapons();
+    }
+    if (scheme == "locked")
+    {
+        GameSchemes->setEnabled(false);
+        goToSchemePage->setEnabled(false);
+        lblScheme->setEnabled(false);
+        GameSchemes->setCurrentIndex(GameSchemes->findText("Default"));
+    }
+    else if(m_master)
+    {
+        GameSchemes->setEnabled(true);
+        goToSchemePage->setEnabled(true);
+        lblScheme->setEnabled(true);
+        int num = GameSchemes->findText(scheme);
+        if (num != -1)
+            GameSchemes->setCurrentIndex(num);
+    }
+
+    if (weapons == "locked")
+    {
+        WeaponsName->setEnabled(false);
+        goToWeaponPage->setEnabled(false);
+        lblWeapons->setEnabled(false);
+        WeaponsName->setCurrentIndex(WeaponsName->findText("Default"));
+    }
+    else if(m_master)
+    {
+        WeaponsName->setEnabled(true);
+        goToWeaponPage->setEnabled(true);
+        lblWeapons->setEnabled(true);
+        int num = WeaponsName->findText(weapons);
+        if (num != -1)
+            WeaponsName->setCurrentIndex(num);
+    }
+
+    if (scheme != "locked" && weapons != "locked")
+        bindEntries->setEnabled(true);
+    else
+        bindEntries->setEnabled(false);
+}
+
 void GameCFGWidget::mapChanged(const QString & value)
 {
     if(isEnabled() && pMapContainer->getCurrentIsMission())
@@ -552,49 +615,7 @@
         Scripts->setEnabled(false);
         lblScript->setEnabled(false);
         Scripts->setCurrentIndex(0);
-
-        if (pMapContainer->getCurrentScheme() == "locked")
-        {
-            GameSchemes->setEnabled(false);
-            goToSchemePage->setEnabled(false);
-            lblScheme->setEnabled(false);
-            GameSchemes->setCurrentIndex(GameSchemes->findText("Default"));
-        }
-        else
-        {
-            GameSchemes->setEnabled(true);
-            goToSchemePage->setEnabled(true);
-            lblScheme->setEnabled(true);
-            int num = GameSchemes->findText(pMapContainer->getCurrentScheme());
-            if (num != -1)
-                GameSchemes->setCurrentIndex(num);
-            //else
-            //    GameSchemes->setCurrentIndex(GameSchemes->findText("Default"));
-        }
-
-        if (pMapContainer->getCurrentWeapons() == "locked")
-        {
-            WeaponsName->setEnabled(false);
-            goToWeaponPage->setEnabled(false);
-            lblWeapons->setEnabled(false);
-            WeaponsName->setCurrentIndex(WeaponsName->findText("Default"));
-        }
-        else
-        {
-            WeaponsName->setEnabled(true);
-            goToWeaponPage->setEnabled(true);
-            lblWeapons->setEnabled(true);
-            int num = WeaponsName->findText(pMapContainer->getCurrentWeapons());
-            if (num != -1)
-                WeaponsName->setCurrentIndex(num);
-            //else
-            //    WeaponsName->setCurrentIndex(WeaponsName->findText("Default"));
-        }
-
-        if (pMapContainer->getCurrentScheme() != "locked" && pMapContainer->getCurrentWeapons() != "locked")
-            bindEntries->setEnabled(true);
-        else
-            bindEntries->setEnabled(false);
+        updateSchemeEnabledStates(0);
     }
     else
     {
@@ -671,51 +692,7 @@
 
     if(isEnabled() && index > 0)
     {
-        QString scheme = Scripts->itemData(index, GameStyleModel::SchemeRole).toString();
-        QString weapons = Scripts->itemData(index, GameStyleModel::WeaponsRole).toString();
-
-        if (scheme == "locked")
-        {
-            GameSchemes->setEnabled(false);
-            goToSchemePage->setEnabled(false);
-            lblScheme->setEnabled(false);
-            GameSchemes->setCurrentIndex(GameSchemes->findText("Default"));
-        }
-        else if (m_master)
-        {
-            GameSchemes->setEnabled(true);
-            goToSchemePage->setEnabled(true);
-            lblScheme->setEnabled(true);
-            int num = GameSchemes->findText(scheme);
-            if (num != -1)
-                GameSchemes->setCurrentIndex(num);
-            //else
-            //    GameSchemes->setCurrentIndex(GameSchemes->findText("Default"));
-        }
-
-        if (weapons == "locked")
-        {
-            WeaponsName->setEnabled(false);
-            goToWeaponPage->setEnabled(false);
-            lblWeapons->setEnabled(false);
-            WeaponsName->setCurrentIndex(WeaponsName->findText("Default"));
-        }
-        else if (m_master)
-        {
-            WeaponsName->setEnabled(true);
-            goToWeaponPage->setEnabled(true);
-            lblWeapons->setEnabled(true);
-            int num = WeaponsName->findText(weapons);
-            if (num != -1)
-                WeaponsName->setCurrentIndex(num);
-            //else
-            //    WeaponsName->setCurrentIndex(WeaponsName->findText("Default"));
-        }
-
-        if (scheme != "locked" && weapons != "locked")
-            bindEntries->setEnabled(true);
-        else
-            bindEntries->setEnabled(false);
+        updateSchemeEnabledStates(index);
     }
     else
     {
@@ -744,6 +721,8 @@
 
 void GameCFGWidget::mapgenChanged(MapGenerator m)
 {
+    int scriptIndex = Scripts->currentIndex();
+    updateSchemeEnabledStates(scriptIndex);
     emit paramChanged("MAPGEN", QStringList(QString::number(m)));
 }
 
--- a/QTfrontend/ui/widget/gamecfgwidget.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/widget/gamecfgwidget.h	Fri Aug 16 10:59:50 2019 -0600
@@ -61,6 +61,7 @@
         void fullNetConfig();
         void resendSchemeData();
         void resendAmmoData();
+        void resetSchemeStates();
         void setMaster(bool master);
         void setTabbed(bool tabbed);
 
@@ -77,6 +78,7 @@
         void seedChanged(const QString &);
         void themeChanged(const QString &);
         void schemeChanged(int);
+        void updateSchemeEnabledStates(int scriptIndex);
         void scriptChanged(int);
         void jumpToSchemes();
         void jumpToWeapons();
--- a/QTfrontend/ui/widget/keybinder.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/widget/keybinder.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -38,6 +38,7 @@
 {
     this->defaultText = defaultText;
     enableSignal = false;
+    p_hasConflicts = false;
 
     // Two-column tab layout
     QHBoxLayout * pageKeysLayout = new QHBoxLayout(this);
@@ -48,7 +49,7 @@
     QVBoxLayout * catListContainer = new QVBoxLayout();
     catListContainer->setContentsMargins(10, 10, 10, 10);
     catList = new QListWidget();
-    catList->setFixedWidth(180);
+    catList->setMinimumWidth(180);
     catList->setStyleSheet("QListWidget::item { font-size: 14px; } QListWidget:hover { border-color: #F6CB1C; } QListWidget::item:selected { background: #150A61; color: yellow; }");
     catList->setFocusPolicy(Qt::NoFocus);
     connect(catList, SIGNAL(currentRowChanged(int)), this, SLOT(changeBindingsPage(int)));
@@ -78,7 +79,7 @@
     scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
     scrollArea->setWidgetResizable(true);
     scrollArea->setFrameShape(QFrame::NoFrame);
-    scrollArea->setStyleSheet("background: #130F2A;");
+    scrollArea->setObjectName("keyBinderScrollArea");
 
     // Add key binding pages to bindings tab
     pageKeysLayout->addWidget(scrollArea);
@@ -90,6 +91,12 @@
     helpLabel->setStyleSheet("color: #130F2A; background: #F6CB1C; border: solid 4px #F6CB1C; border-radius: 10px; padding: auto 20px;");
     helpLabel->setFixedHeight(24);
     rightLayout->addWidget(helpLabel, 0, Qt::AlignCenter);
+    conflictLabel = new QLabel();
+    conflictLabel->setText(tr("Warning: The same key is assigned multiple times!"));
+    conflictLabel->setStyleSheet("color: white; background: #E31A1A; border: solid 4px #E31A1A; border-radius: 10px; padding: auto 20px;");
+    conflictLabel->setFixedHeight(24);
+    conflictLabel->setHidden(true);
+    rightLayout->addWidget(conflictLabel, 0, Qt::AlignCenter);
 
     // Category list and bind table row heights
     const int rowHeight = 20;
@@ -117,6 +124,21 @@
     selectedBindTable = NULL;
     bindComboBoxCellMappings = new QHash<QObject *, QTableWidgetItem *>();
     bindCellComboBoxMappings = new QHash<QTableWidgetItem *, QComboBox *>();
+
+    dropDownIcon = new QIcon();
+    QPixmap dd1 = QPixmap(":/res/dropdown.png");
+    QPixmap dd2 = QPixmap(":/res/dropdown_selected.png");
+    dropDownIcon->addPixmap(dd1, QIcon::Normal);
+    dropDownIcon->addPixmap(dd2, QIcon::Selected);
+    conflictIcon = new QIcon();
+    QPixmap kc1 = QPixmap(":/res/keyconflict.png");
+    QPixmap kc2 = QPixmap(":/res/keyconflict_selected.png");
+    conflictIcon->addPixmap(kc1, QIcon::Normal);
+    conflictIcon->addPixmap(kc2, QIcon::Selected);
+    QPixmap emptySpace = QPixmap(16, 16);
+    emptySpace.fill(QColor(0, 0, 0, 0));
+    QIcon emptyIcon = QIcon(emptySpace);
+
     for (int i = 0; i < BINDS_NUMBER; i++)
     {
         if (cbinds[i].category != NULL)
@@ -157,7 +179,7 @@
             curTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
             curTable->verticalHeader()->setDefaultSectionSize(rowHeight);
             curTable->setShowGrid(false);
-            curTable->setStyleSheet("QTableWidget { border: none; } ");
+            curTable->setStyleSheet("QTableWidget { border: none; background-color: transparent; } ");
             curTable->setSelectionBehavior(QAbstractItemView::SelectRows);
             curTable->setSelectionMode(QAbstractItemView::SingleSelection);
             curTable->setFocusPolicy(Qt::NoFocus);
@@ -167,37 +189,55 @@
         }
 
         // Hidden combo box
-        QComboBox * comboBox = CBBind[i] = new QComboBox(curTable);
-        comboBox->setModel((QAbstractItemModel*)DataManager::instance().bindsModel());
-        comboBox->setVisible(false);
-        comboBox->setMinimumWidth(400);
-        comboBox->setMaxVisibleItems(50);
+        QComboBox * comboBox;
+        if (cbinds[i].action != "!MULTI")
+        {
+            comboBox = CBBind[i] = new QComboBox(curTable);
+            comboBox->setModel((QAbstractItemModel*)DataManager::instance().bindsModel());
+            comboBox->setVisible(false);
+            comboBox->setMinimumWidth(400);
+            comboBox->setMaxVisibleItems(50);
+        }
+        else
+        {
+            comboBox = CBBind[i] = NULL;
+        }
 
         // Table row
         int row = curTable->rowCount();
         QTableWidgetItem * nameCell = new QTableWidgetItem(HWApplication::translate("binds", cbinds[i].name));
-        nameCell->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
         curTable->insertRow(row);
         curTable->setItem(row, 0, nameCell);
-        QTableWidgetItem * bindCell = new QTableWidgetItem(comboBox->currentText());
-        QIcon dropDownIcon = QIcon();
-        QPixmap dd1 = QPixmap(":/res/dropdown.png");
-        QPixmap dd2 = QPixmap(":/res/dropdown_selected.png");
-        dropDownIcon.addPixmap(dd1, QIcon::Normal);
-        dropDownIcon.addPixmap(dd2, QIcon::Selected);
-        bindCell->setIcon(dropDownIcon);
-        bindCell->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+        QTableWidgetItem * bindCell;
+        if (cbinds[i].action != "!MULTI")
+        {
+            bindCell = new QTableWidgetItem(comboBox->currentText());
+            nameCell->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+            bindCell->setIcon(*dropDownIcon);
+            bindCell->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+        }
+        else
+        {
+            bindCell = new QTableWidgetItem(HWApplication::translate("binds (combination)", cbinds[i].strbind.toUtf8().constData()));
+            nameCell->setFlags(Qt::NoItemFlags);
+            bindCell->setFlags(Qt::NoItemFlags);
+            bindCell->setIcon(emptyIcon);
+        }
         curTable->setItem(row, 1, bindCell);
         curTable->resizeColumnsToContents();
         curTable->setFixedHeight(curTable->verticalHeader()->length() + 10);
 
-        // Updates the text in the table cell
-        connect(comboBox, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(bindChanged(const QString &)));
+        if (cbinds[i].action != "!MULTI")
+        {
+            // Updates the text in the table cell
+            connect(comboBox, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(bindChanged(const QString &)));
 
-        // Map combo box and that row's cells to each other
-        bindComboBoxCellMappings->insert(comboBox, bindCell);
-        bindCellComboBoxMappings->insert(nameCell, comboBox);
-        bindCellComboBoxMappings->insert(bindCell, comboBox);
+            // Map combo box and that row's cells to each other
+            bindComboBoxCellMappings->insert(comboBox, bindCell);
+            bindCellComboBoxMappings->insert(nameCell, comboBox);
+            bindCellComboBoxMappings->insert(bindCell, comboBox);
+        }
+
     }
 
     // Add stretch at end of last layout
@@ -237,6 +277,7 @@
             if (CBBind[i] == sender())
             {
                 emit bindUpdate(i);
+                checkConflicts();
                 break;
             }
         }
@@ -247,6 +288,8 @@
 void KeyBinder::bindCellClicked(QTableWidgetItem * item)
 {
     QComboBox * box = bindCellComboBoxMappings->value(item);
+    if(box == NULL)
+        return;
     QTableWidget * table = item->tableWidget();
 
     box->move(
@@ -268,18 +311,95 @@
     }
 }
 
+// check if the given key is bound multiple times
+bool KeyBinder::checkConflictsWith(int compareTo, bool updateState)
+{
+    for(int i=0; i<BINDS_NUMBER; i++)
+    {
+        if(i == compareTo)
+            continue;
+        if(CBBind[i] == NULL || CBBind[compareTo] == NULL)
+            continue;
+        QString bind1 = CBBind[i]->currentData(Qt::UserRole + 1).toString();
+        QString bind2 = CBBind[compareTo]->currentData(Qt::UserRole + 1).toString();
+        // TODO: For team key binds, also check collisions with global key binds
+        if((!(bind1 == "none" || bind2 == "none" || bind1 == "default" || bind2 == "default")) && (bind1 == bind2))
+        {
+            if(updateState)
+            {
+                p_hasConflicts = true;
+                conflictLabel->setHidden(false);
+            }
+            QTableWidgetItem* conflictItem = bindComboBoxCellMappings->value(CBBind[i]);
+            conflictItem->setIcon(*conflictIcon);
+            conflictItem->setBackground(QBrush(QColor(0xE3, 0x1A, 0x1A)));
+            conflictItem->setForeground(QBrush(Qt::white));
+            conflictItems.append(conflictItem);
+            conflictItem = bindComboBoxCellMappings->value(CBBind[compareTo]);
+            conflictItem->setIcon(*conflictIcon);
+            conflictItem->setBackground(QBrush(QColor(0xE3, 0x1A, 0x1A)));
+            conflictItem->setForeground(QBrush(Qt::white));
+            conflictItems.append(conflictItem);
+            return true;
+        }
+    }
+    if(updateState)
+    {
+        p_hasConflicts = false;
+        conflictLabel->setHidden(true);
+    }
+    for (int c=0; c < conflictItems.size(); c++)
+    {
+        QTableWidgetItem* conflictItem = conflictItems[c];
+        conflictItem->setIcon(*dropDownIcon);
+        conflictItem->setBackground(QBrush(Qt::transparent));
+        conflictItem->setForeground(QBrush(QColor("#F6CB1C")));
+        conflictItem = NULL;
+    }
+    conflictItems.clear();
+    return false;
+}
+
+// check if any key is bound multiple times and causing a conflict
+bool KeyBinder::checkConflicts()
+{
+    bool conflict = false;
+    for(int i=0; i<BINDS_NUMBER; i++)
+    {
+        conflict = checkConflictsWith(i, false);
+        if(conflict)
+        {
+            p_hasConflicts = true;
+            conflictLabel->setHidden(false);
+            return true;
+        }
+    }
+    p_hasConflicts = false;
+    conflictLabel->setHidden(true);
+    return false;
+}
+
+bool KeyBinder::hasConflicts()
+{
+    return p_hasConflicts;
+}
+
 // Set a combobox's index
 void KeyBinder::setBindIndex(int keyIndex, int bindIndex)
 {
     enableSignal = false;
-    CBBind[keyIndex]->setCurrentIndex(bindIndex);
+    if(CBBind[keyIndex] != NULL)
+        CBBind[keyIndex]->setCurrentIndex(bindIndex);
     enableSignal = true;
 }
 
 // Return a combobox's selected index
 int KeyBinder::bindIndex(int keyIndex)
 {
-    return CBBind[keyIndex]->currentIndex();
+    if(CBBind[keyIndex] != NULL)
+        return CBBind[keyIndex]->currentIndex();
+    else
+        return 0;
 }
 
 // Clears selection and goes to first category
@@ -299,9 +419,12 @@
     DataManager::instance().bindsModel()->item(0)->setData(defaultText, Qt::DisplayRole);
     for (int i = 0; i < BINDS_NUMBER; i++)
     {
-        CBBind[i]->setModel(DataManager::instance().bindsModel());
-        CBBind[i]->setCurrentIndex(0);
-        bindComboBoxCellMappings->value(CBBind[i])->setText(defaultText);
+        if (CBBind[i] != NULL)
+        {
+            CBBind[i]->setModel(DataManager::instance().bindsModel());
+            CBBind[i]->setCurrentIndex(0);
+            bindComboBoxCellMappings->value(CBBind[i])->setText(defaultText);
+        }
     }
 
     enableSignal = true;
--- a/QTfrontend/ui/widget/keybinder.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/widget/keybinder.h	Fri Aug 16 10:59:50 2019 -0600
@@ -29,6 +29,7 @@
 class QTableWidget;
 class QBoxLayout;
 class QComboBox;
+class QLabel;
 
 // USAGE NOTE: Every time the widget comes into view, you must call resetInterface()
 
@@ -43,6 +44,9 @@
         void setBindIndex(int keyIndex, int bindIndex);
         int bindIndex(int keyIndex);
         void resetInterface();
+        bool hasConflicts();
+        bool checkConflicts();
+        bool checkConflictsWith(int bind, bool updateState);
 
     private:
         QHash<QObject *, QTableWidgetItem *> * bindComboBoxCellMappings;
@@ -51,8 +55,13 @@
         QListWidget * catList;
         QBoxLayout *bindingsPages;
         QComboBox * CBBind[BINDS_NUMBER];
+        QLabel * conflictLabel;
+        QIcon * dropDownIcon;
+        QIcon * conflictIcon;
         QString defaultText;
         bool enableSignal;
+        QList<QTableWidgetItem*> conflictItems;
+        bool p_hasConflicts;
 
     signals:
         void bindUpdate(int bindID);
--- a/QTfrontend/ui/widget/mapContainer.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/widget/mapContainer.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -229,14 +229,34 @@
 
     drawnControls->addStretch(1);
 
-    btnLoadMap = new QPushButton(tr("Load map drawing"));
-    btnLoadMap->setStyleSheet("padding: 20px;");
+    QPixmap pmLoad(":/res/Load.png");
+    QIcon iconLoad = QIcon(pmLoad);
+    sz = iconLoad.actualSize(QSize(48, 48));
+
+    btnLoadMap = new QPushButton(tr("Load"));
+    btnLoadMap->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+    btnLoadMap->setWhatsThis(tr("Load map drawing"));
+    btnLoadMap->setStyleSheet("padding: 5px;");
+    btnLoadMap->setFixedHeight(50);
+    btnLoadMap->setIcon(iconLoad);
+    btnLoadMap->setIconSize(sz);
+    btnLoadMap->setFlat(true);
     drawnControls->addWidget(btnLoadMap, 0);
     m_childWidgets << btnLoadMap;
     connect(btnLoadMap, SIGNAL(clicked()), this, SLOT(loadDrawing()));
 
-    btnEditMap = new QPushButton(tr("Edit map drawing"));
-    btnEditMap->setStyleSheet("padding: 20px;");
+    QPixmap pmEdit(":/res/edit.png");
+    QIcon iconEdit = QIcon(pmEdit);
+    sz = iconEdit.actualSize(QSize(48, 48));
+
+    btnEditMap = new QPushButton(tr("Edit"));
+    btnEditMap->setWhatsThis(tr("Edit map drawing"));
+    btnEditMap->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+    btnEditMap->setStyleSheet("padding: 5px;");
+    btnEditMap->setFixedHeight(50);
+    btnEditMap->setIcon(iconEdit);
+    btnEditMap->setIconSize(sz);
+    btnEditMap->setFlat(true);
     drawnControls->addWidget(btnEditMap, 0);
     m_childWidgets << btnEditMap;
     connect(btnEditMap, SIGNAL(clicked()), this, SIGNAL(drawMapRequested()));
@@ -277,6 +297,7 @@
     mapFeatureSize->setMaximum(25);
     mapFeatureSize->setMinimum(1);
     //mapFeatureSize->setFixedWidth(259);
+    mapFeatureSize->setPageStep(5);
     mapFeatureSize->setValue(m_mapFeatureSize);
     mapFeatureSize->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
     bottomLeftLayout->addWidget(mapFeatureSize, 0);
@@ -426,7 +447,7 @@
                    getDrawnMapData(),
                    m_script,
                    m_scriptparam,
-		           m_mapFeatureSize
+                   m_mapFeatureSize
                   );
 
     setHHLimit(0);
@@ -921,6 +942,7 @@
     QString randomNoMapPrev = tr("Click to randomize the theme and seed");
     QString mfsComplex = QString(tr("Adjust the complexity of the generated map"));
     QString mfsFortsDistance = QString(tr("Adjust the distance between forts"));
+    QString mfsDrawnMap = QString(tr("Scale size of the drawn map"));
     switch (type)
     {
         case MapModel::GeneratedMap:
@@ -938,6 +960,7 @@
         case MapModel::HandDrawnMap:
             mapPreview->setWhatsThis(tr("Click to edit"));
             btnRandomize->setWhatsThis(randomSeed);
+            mapFeatureSize->setWhatsThis(mfsDrawnMap);
             break;
         case MapModel::FortsMap:
             mapPreview->setWhatsThis(randomNoMapPrev);
@@ -990,7 +1013,7 @@
             mapgen = MAPGEN_DRAWN;
             setMapInfo(MapModel::MapInfoDrawn);
             btnLoadMap->show();
-            mapFeatureSize->hide();
+            //mapFeatureSize->hide();
             btnEditMap->show();
             break;
         case MapModel::MissionMap:
@@ -1071,18 +1094,14 @@
 {
     m_mapFeatureSize = val;
     intSetFeatureSize(val);
-    //m_mapFeatureSize = val>>2<<2;
-    //if (qAbs(m_prevMapFeatureSize-m_mapFeatureSize) > 4)
-    {
-        m_prevMapFeatureSize = m_mapFeatureSize;
-        updatePreview();
-    }
+    m_prevMapFeatureSize = m_mapFeatureSize;
+    updatePreview();
 }
 
 // unused because I needed the space for the slider
 void HWMapContainer::updateThemeButtonSize()
 {
-    if (m_mapInfo.type != MapModel::StaticMap && m_mapInfo.type != MapModel::HandDrawnMap)
+    if (m_mapInfo.type != MapModel::StaticMap)
     {
         btnTheme->setIconSize(QSize(30, 30));
         btnTheme->setFixedHeight(30);
@@ -1192,6 +1211,15 @@
     {
         if (!selectedTheme.isNull() && !selectedTheme.isEmpty())
         {
+            // Fall back to a default theme if current theme is a background theme or hidden
+            QModelIndexList mdl = m_themeModel->match(m_themeModel->index(0), ThemeModel::ActualNameRole, m_theme);
+            if (mdl.size() > 0)
+            {
+                if ((mdl.at(0).data(ThemeModel::IsBackgroundThemeRole).toBool() == true) || (mdl.at(0).data(ThemeModel::IsHiddenRole).toBool() == true))
+                {
+                    selectedTheme = "Nature";
+                }
+            }
             setTheme(selectedTheme);
             emit themeChanged(selectedTheme);
         }
@@ -1223,6 +1251,7 @@
         errorMsg.setIcon(QMessageBox::Warning);
         errorMsg.setWindowTitle(QMessageBox::tr("File error"));
         errorMsg.setText(QMessageBox::tr("Cannot open '%1' for reading").arg(fileName));
+        errorMsg.setTextFormat(Qt::PlainText);
         errorMsg.setWindowModality(Qt::WindowModal);
         errorMsg.exec();
     }
--- a/QTfrontend/ui/widget/selectWeapon.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/widget/selectWeapon.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -31,6 +31,9 @@
 #include <QSettings>
 #include <QMessageBox>
 #include <QTabWidget>
+#include <QRegExp>
+#include <QRegExpValidator>
+
 #include <math.h>
 
 QImage getAmmoImage(int num)
@@ -205,6 +208,9 @@
 
     //pLayout->setRowStretch(5, 100);
     m_name = new QLineEdit(this);
+    QRegExp rx(*cSafeFileNameRegExp);
+    QRegExpValidator* val = new QRegExpValidator(rx, m_name);
+    m_name->setValidator(val);
     pageLayout->addWidget(m_name, i, 0, 1, 5);
 }
 
@@ -305,6 +311,7 @@
             deniedMsg.setIcon(QMessageBox::Warning);
             deniedMsg.setWindowTitle(QMessageBox::tr("Weapons - Warning"));
             deniedMsg.setText(QMessageBox::tr("A weapon scheme with the name '%1' already exists. Changes made to the weapon scheme have been discarded.").arg(compName));
+            deniedMsg.setTextFormat(Qt::PlainText);
             deniedMsg.setWindowModality(Qt::WindowModal);
             deniedMsg.exec();
             return;
@@ -350,6 +357,7 @@
             deniedMsg.setIcon(QMessageBox::Warning);
             deniedMsg.setWindowTitle(QMessageBox::tr("Weapons - Warning"));
             deniedMsg.setText(QMessageBox::tr("Cannot delete default weapon set '%1'!").arg(cDefaultAmmos[i].first));
+            deniedMsg.setTextFormat(Qt::PlainText);
             deniedMsg.setWindowModality(Qt::WindowModal);
             deniedMsg.exec();
             return;
@@ -360,6 +368,7 @@
     reallyDeleteMsg.setIcon(QMessageBox::Question);
     reallyDeleteMsg.setWindowTitle(QMessageBox::tr("Weapons - Are you sure?"));
     reallyDeleteMsg.setText(QMessageBox::tr("Do you really want to delete the weapon set '%1'?").arg(delWeaponsName));
+    reallyDeleteMsg.setTextFormat(Qt::PlainText);
     reallyDeleteMsg.setWindowModality(Qt::WindowModal);
     reallyDeleteMsg.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
 
--- a/QTfrontend/ui/widget/teamselect.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/ui/widget/teamselect.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -215,8 +215,9 @@
         // dont playing team => playing
         itDontPlay->setColor(framePlaying->getNextColor());
         team=*itDontPlay; // for net team info saving in framePlaying (we have only name with netID from network)
-        curPlayingTeams.push_back(*itDontPlay);
-        if(!m_acceptOuter) emit teamWillPlay(*itDontPlay);
+        team.setOwner(m_curUser);
+        curPlayingTeams.push_back(team);
+        if(!m_acceptOuter) emit teamWillPlay(team);
         m_curNotPlayingTeams.erase(itDontPlay);
 
         // Hide team notice if at least two teams.
--- a/QTfrontend/util/DataManager.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/util/DataManager.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -28,9 +28,12 @@
 #include <QSettings>
 #include <QColor>
 
+#include <SDL2/SDL.h>
+
 #include "hwconsts.h"
 #include "HWApplication.h"
 #include "sdlkeys.h"
+#include "KeyMap.h"
 #include "physfs.h"
 
 #include "DataManager.h"
@@ -147,6 +150,7 @@
 
 QStandardItemModel * DataManager::bindsModel()
 {
+    KeyMap km = KeyMap::instance();
     if(m_bindsModel == NULL)
     {
         m_bindsModel = new QStandardItemModel();
@@ -159,7 +163,33 @@
         for(int j = 0; sdlkeys[j][1][0] != '\0'; j++)
         {
             QStandardItem * item = new QStandardItem();
-            item->setData(HWApplication::translate("binds (keys)", sdlkeys[j][1]).contains(": ") ? HWApplication::translate("binds (keys)", sdlkeys[j][1]) : HWApplication::translate("binds (keys)", "Keyboard") + QString(": ") + HWApplication::translate("binds (keys)", sdlkeys[j][1]), Qt::DisplayRole);
+            QString keyId = QString(sdlkeys[j][0]);
+            QString keyDisplay;
+            bool isKeyboard = sdlkeys_iskeyboard[j] == true;
+            if (keyId == "none" || (!isKeyboard))
+                keyDisplay = HWApplication::translate("binds (keys)", sdlkeys[j][1]);
+            else
+                // Get key name with respect to keyboard layout
+                keyDisplay = QString(SDL_GetKeyName(SDL_GetKeyFromScancode(km.getScancodeFromKeyname(sdlkeys[j][0]))));
+
+            bool kbFallback = keyDisplay.trimmed().isEmpty();
+            if (kbFallback)
+            {
+                keyDisplay = QString(sdlkeys[j][1]);
+                if ((QString(sdlkeys[j][0]) != "f13") && (QString(sdlkeys[j][0]) != "f14") && (QString(sdlkeys[j][0]) != "f15"))
+                {
+                    // If SDL doesn't know a name, show fallback name and a warning
+                    //: Name of QWERTY US keyboard layout
+                    keyDisplay = keyDisplay + QString(" ") + HWApplication::translate("binds (keys)", "(QWERTY)");
+                }
+            }
+            if (isKeyboard)
+            {
+                if (!kbFallback)
+                    keyDisplay = HWApplication::translate("binds (keys)", keyDisplay.toUtf8().constData());
+                keyDisplay = HWApplication::translate("binds (keys)", "Keyboard") + QString(": ") + keyDisplay;
+            }
+            item->setData(keyDisplay, Qt::DisplayRole);
             item->setData(sdlkeys[j][0], Qt::UserRole + 1);
             m_bindsModel->appendRow(item);
         }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/util/KeyMap.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,103 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2004-2019 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program 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; version 2 of the License
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+#include <QStringList>
+#include "KeyMap.h"
+#include "SDL.h"
+
+KeyMap & KeyMap::instance()
+{
+    static KeyMap instance;
+    instance.getKeyMap();
+    return instance;
+}
+
+bool KeyMap::getKeyMap()
+{
+    if (keyMapGenerated)
+        return true;
+    QFile keyFile(":keys.csv");
+    if (!keyFile.open(QIODevice::ReadOnly))
+    {
+        qWarning("ERROR: keys.csv could not be opened!");
+        return false;
+    }
+    QString keyString = keyFile.readAll();
+    QStringList cells = QStringList() << QString("") << QString("");
+    QChar currChar;
+    bool isInQuote = false;
+    int cell = 0;
+    int charInCell = 0;
+    QString scancode = "";
+    QString keyname = "";
+    for(long long int i = 0; i < keyString.length(); i++)
+    {
+        currChar = keyString.at(i);
+        if (currChar == '\"') {
+            isInQuote = !isInQuote;
+        }
+        if (currChar == ',' && !isInQuote) {
+            cell++;
+            continue;
+        }
+        if (currChar == '\n') {
+            mapOfKeynames[(SDL_Scancode) scancode.toInt()] = keyname;
+            mapOfScancodes[keyname] = (SDL_Scancode) scancode.toInt();
+            if ((SDL_Scancode) scancode.toInt() == SDL_SCANCODE_UNKNOWN)
+                continue;
+            cell = 0;
+            scancode = "";
+            keyname = "";
+            continue;
+        }
+        if (cell == 0 && currChar != '\"') {
+            scancode += currChar;
+        } else if (cell == 1 && currChar != '\"') {
+            keyname += currChar;
+        }
+        charInCell++;
+    }
+    keyMapGenerated = true;
+    keyFile.close();
+    return true;
+}
+
+SDL_Scancode KeyMap::getScancodeFromKeyname(QString keyname)
+{
+    if (mapOfScancodes.contains(keyname))
+        return mapOfScancodes[keyname];
+    else
+        return SDL_SCANCODE_UNKNOWN;
+}
+
+QString KeyMap::getKeynameFromScancode(int scancode)
+{
+    if (mapOfKeynames.contains((SDL_Scancode) scancode))
+        if ((SDL_Scancode) scancode == SDL_SCANCODE_UNKNOWN)
+            return QString("none");
+        else
+            return mapOfKeynames[(SDL_Scancode) scancode];
+    else
+        return QString("");
+}
+
+QString KeyMap::getKeynameFromScancodeConverted(int scancode)
+{
+    SDL_Keycode keycode = SDL_GetKeyFromScancode((SDL_Scancode) scancode);
+    return SDL_GetKeyName(keycode);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QTfrontend/util/KeyMap.h	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,56 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2004-2019 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program 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; version 2 of the License
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+/**
+ * @file
+ * @brief KeyMap class definition
+ */
+
+#ifndef HEDGEWARS_KEYMAP_H
+#define HEDGEWARS_KEYMAP_H
+
+#include <QFile>
+#include <QHash>
+#include "SDL.h"
+
+class KeyMap
+{
+    public:
+        /**
+         * @brief Returns reference to the <i>singleton</i> instance of this class.
+         *
+         * @see <a href="https://en.wikipedia.org/wiki/Singleton_pattern">singleton pattern</a>
+         *
+         * @return reference to the instance.
+         */
+        static KeyMap & instance();
+        SDL_Scancode getScancodeFromKeyname(QString keyname);
+        QString getKeynameFromScancode(int scancode);
+        QString getKeynameFromScancodeConverted(int scancode);
+        QString getKeynameFromKeycode(int keycode);
+
+    private:
+        // TODO: Optimize data structures
+        QHash<SDL_Scancode, QString> mapOfKeynames;
+        QHash<QString, SDL_Scancode> mapOfScancodes;
+        bool getKeyMap();
+        bool keyMapGenerated = false;
+
+};
+
+#endif // HEDGEWARS_KEYMAP_H
--- a/QTfrontend/util/LibavInteraction.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/util/LibavInteraction.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -57,14 +57,14 @@
     bool isAudio;
     QString shortName; // used for identification
     QString longName; // used for displaying to user
-    bool isRecomended;
+    bool isRecommended;
 };
 
 struct Format
 {
     QString shortName;
     QString longName;
-    bool isRecomended;
+    bool isRecommended;
     QString extension;
     QVector<Codec*> codecs;
 };
@@ -103,6 +103,10 @@
         if (strcmp(pCodec->name, "rv10") == 0 || strcmp(pCodec->name, "rv20") == 0)
             continue;
 
+        // this encoder is experimental (as of Jan 17, 2019)
+        if (strcmp(pCodec->name, "libaom-av1") == 0)
+            continue;
+
         // doesn't support stereo sound
         if (strcmp(pCodec->name, "real_144") == 0)
             continue;
@@ -151,30 +155,27 @@
         codec.shortName = pCodec->name;
         codec.longName = pCodec->long_name;
 
-        codec.isRecomended = false;
+        codec.isRecommended = false;
         if (strcmp(pCodec->name, "libx264") == 0)
         {
             codec.longName = "H.264/MPEG-4 Part 10 AVC (x264)";
-            codec.isRecomended = true;
+            codec.isRecommended = true;
         }
         else if (strcmp(pCodec->name, "libxvid") == 0)
         {
             codec.longName = "MPEG-4 Part 2 (Xvid)";
-            codec.isRecomended = true;
+            codec.isRecommended = true;
         }
         else if (strcmp(pCodec->name, "libmp3lame") == 0)
         {
             codec.longName = "MP3 (MPEG audio layer 3) (LAME)";
-            codec.isRecomended = true;
+            codec.isRecommended = true;
         }
         else
             codec.longName = pCodec->long_name;
 
         if (strcmp(pCodec->name, "mpeg4") == 0 || strcmp(pCodec->name, "ac3_fixed") == 0)
-            codec.isRecomended = true;
-
-        // FIXME: remove next line
-        //codec.longName += QString(" (%1)").arg(codec.shortName);
+            codec.isRecommended = true;
     }
 
     // get list of all formats
@@ -207,10 +208,7 @@
         format.shortName = pFormat->name;
         format.longName = QString("%1 (*.%2)").arg(pFormat->long_name).arg(ext);
 
-        // FIXME: remove next line
-        //format.longName += QString(" (%1)").arg(format.shortName);
-
-        format.isRecomended = strcmp(pFormat->name, "mp4") == 0 || strcmp(pFormat->name, "avi") == 0;
+        format.isRecommended = strcmp(pFormat->name, "mp4") == 0 || strcmp(pFormat->name, "avi") == 0;
 
         formats[pFormat->name] = format;
     }
@@ -220,7 +218,7 @@
 {
     // first insert recomended formats
     foreach(const Format & format, formats)
-        if (format.isRecomended)
+        if (format.isRecommended)
             pFormats->addItem(format.longName, format.shortName);
 
     // remember where to place separator between recomended and other formats
@@ -228,7 +226,7 @@
 
     // insert remaining formats
     foreach(const Format & format, formats)
-        if (!format.isRecomended)
+        if (!format.isRecommended)
             pFormats->addItem(format.longName, format.shortName);
 
     // insert separator if necessary
@@ -243,7 +241,7 @@
     // first insert recomended codecs
     foreach(Codec * codec, format.codecs)
     {
-        if (codec->isRecomended)
+        if (codec->isRecommended)
         {
             if (codec->isAudio)
                 pACodecs->addItem(codec->longName, codec->shortName);
@@ -259,7 +257,7 @@
     // insert remaining codecs
     foreach(Codec * codec, format.codecs)
     {
-        if (!codec->isRecomended)
+        if (!codec->isRecommended)
         {
             if (codec->isAudio)
                 pACodecs->addItem(codec->longName, codec->shortName);
--- a/QTfrontend/util/MessageDialog.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/util/MessageDialog.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -66,6 +66,7 @@
     msgMsg.setWindowTitle(title != NULL ? title : "Hedgewars");
     msgMsg.setText(msg);
     msgMsg.setIcon(icon);
+    msgMsg.setTextFormat(Qt::PlainText);
     msgMsg.setWindowModality(Qt::WindowModal);
 
     return msgMsg.exec();
--- a/QTfrontend/util/SDLInteraction.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/util/SDLInteraction.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -50,8 +50,26 @@
     m_musicTrack = "";
     m_isPlayingMusic = false;
     lastchannel = 0;
+    int i;
+    // Initialize sdlkeys_iskeyboard
+    for (i=0; i<1024; i++) {
+        // First 7 entries are mouse buttons (see sdlkeys.cpp)
+        if ((i > 6) && (sdlkeys[i][0][0] != '\0'))
+            sdlkeys_iskeyboard[i] = true;
+        else
+            sdlkeys_iskeyboard[i] = false;
+    }
+
     if(SDL_NumJoysticks())
         addGameControllerKeys();
+
+    // Add special "none" key at the end of list
+    i = 0;
+    while(i < 1024 && sdlkeys[i][1][0] != '\0')
+        i++;
+    sprintf(sdlkeys[i][0], "none");
+    sprintf(sdlkeys[i][1], "%s", HWApplication::translate("binds (keys)", unboundcontrol).toUtf8().constData());
+
     SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
 
     m_soundMap = new QMap<QString,Mix_Chunk*>();
--- a/QTfrontend/util/namegen.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/util/namegen.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -228,6 +228,11 @@
     team.setHedgehog(HedgehogNumber, hh);
 }
 
+void HWNamegen::teamLocalizedDefaultVoice(HWTeam & team, bool withDLC)
+{
+    team.setVoicepack(getLocalizedDefaultVoice(withDLC));
+}
+
 QStringList HWNamegen::dictContents(const QString filename)
 {
     QStringList list;
@@ -488,3 +493,26 @@
     //pick a random voice
     return Voices[rand()%(Voices.size())];
 }
+
+QString HWNamegen::getLocalizedDefaultVoice(bool withDLC)
+{
+    QStringList entries = DataManager::instance().entryList(
+        "Sounds/voices",
+        QDir::Dirs | QDir::NoDotAndDotDot,
+        QStringList("*"),
+        withDLC);
+
+    QString loc = QLocale().name();
+    if(entries.contains("Default_" + loc))
+    {
+        return QString("Default_" + loc);
+    }
+    else if(entries.contains("Default_" + loc.left(2)))
+    {
+        return QString("Default_" + loc.left(2));
+    }
+    else
+    {
+        return QString("Default");
+    }
+}
--- a/QTfrontend/util/namegen.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/QTfrontend/util/namegen.h	Fri Aug 16 10:59:50 2019 -0600
@@ -38,6 +38,7 @@
         static void teamRandomHogNames(HWTeam & team);
         static void teamRandomHogName(HWTeam & team, const int HedgehogNumber);
         static void teamRandomEverything(HWTeam & team);
+        static void teamLocalizedDefaultVoice(HWTeam & team, bool withDLC = true);
 
     private:
         HWNamegen();
@@ -48,6 +49,7 @@
         static QString getRandomFort(bool withDLC = true);
         static QString getRandomFlag(bool withDLC = true);
         static QString getRandomVoice(bool withDLC = true);
+        static QString getLocalizedDefaultVoice(bool withDLC = true);
 
         static QList<QStringList> TypesTeamnames;
         static QList<QStringList> TypesHatnames;
--- a/README.md	Mon Jan 14 15:11:15 2019 -0500
+++ b/README.md	Fri Aug 16 10:59:50 2019 -0600
@@ -1,5 +1,6 @@
 Hedgewars - a turn-based strategy game
 ======================================
+[![Build Status](https://travis-ci.org/hedgewars/hw.svg)](https://travis-ci.org/hedgewars/hw)
 
 Description
 -----------
@@ -69,25 +70,6 @@
 * T: Chat
 * U: Clan chat
 
-### Default controller controls
-Hedgewars also supports controllers. By default, Hedgewars sets up a few
-controls for your first (!) connected controller.
-This default might not be ideal, we recommend you set manual controls
-in the settings menu.
-
-* 1st D-pad: Walk and aim
-* 2nd D-pad / 1st thumbstick: Move camera/cursor
-* Button  1: Long jump
-* Button  2: High jump
-* Button  3: Attack
-* Button  4: Ammo menu
-* Button  5: Precise
-* Button  6: Select target, or pick weapon (in ammo menu)
-* Button  7: Switch hedgehog
-* Button  8: Change timer
-* Button  9: Find hedgehog / toggle auto camera
-* Button 10: Mission panel
-
 For the full list, go to the Hedgewars settings. Also read the weapon tooltips
 for weapon-specific controls.
 
@@ -100,6 +82,9 @@
 * Switch  + Toggle hedgehog tags: Toggle hedgehog tag translucency
 * Precise + Toggle team bars + Switch: Toggle HUD
 * Precise + Capture (screenshot key): Save current map + mask into Screenshot directory
+* Precise + zoom in/out: Change zoom in smaller steps
+* Precise + volume up/down: Change volume in smaller steps
+* Precise + Reset zoom: Set zoom to 100% (instead of the zoom level in the settings)
 
 System requirements
 -------------------
@@ -131,8 +116,6 @@
 Mercurial as DVCS. A Git repository is also available (mirrored daily)
 at <https://github.com/hedgewars/hw>.
 
-[![Build Status](https://travis-ci.org/hedgewars/hw.svg)](https://travis-ci.org/hedgewars/hw)
-
 Contribute
 ----------
 If you see a bug or have any suggestion please use the official bug tracker at
@@ -155,8 +138,8 @@
 Licence version 1.2. See the `COPYING` file for the full text of the licenses.
 
 Copyright 2004-2018 Andrey Korotaev <unC0Rr@gmail.com> and others.
-See `QTfrontend/res/html/about.html` and `CREDITS` for a more complete list of
-authors.
+Click on the Hedgewars logo in the main menu and read the `CREDITS` text file
+for a more complete list of authors.
 
 Contact
 -------
--- a/cmake_modules/paths.cmake	Mon Jan 14 15:11:15 2019 -0500
+++ b/cmake_modules/paths.cmake	Fri Aug 16 10:59:50 2019 -0600
@@ -59,6 +59,7 @@
     #@rpath mangling
     set(CMAKE_INSTALL_RPATH "@executable_path/../Frameworks")
     #install_name_tool for libraries
+    set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR TRUE)
     set(CMAKE_INSTALL_NAME_DIR "@executable_path/../Frameworks")
 else(APPLE AND NOT (${CMAKE_INSTALL_PREFIX} MATCHES "/usr"))
     #paths where to find libraries (final slash not optional):
--- a/cmake_modules/platform.cmake	Mon Jan 14 15:11:15 2019 -0500
+++ b/cmake_modules/platform.cmake	Fri Aug 16 10:59:50 2019 -0600
@@ -1,9 +1,12 @@
 
 if(APPLE)
-    if(${CMAKE_VERSION} VERSION_GREATER "2.8.10.2" AND
-       ${CMAKE_VERSION} VERSION_LESS "2.8.12.1")
-        message(FATAL_ERROR "This version of CMake is known *not* to work, please update or use a lower version")
-    endif()
+    #minimum for macOS.  sorry!
+    cmake_minimum_required(VERSION 3.9.0)
+
+    #set c++11 standard for QT requirements
+    set(CMAKE_CXX_STANDARD 11)
+    set(CMAKE_CXX_STANDARD_REQUIRED ON)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++")
 
     set(CMAKE_FIND_FRAMEWORK "FIRST")
 
@@ -31,21 +34,10 @@
         set(minimum_macosx_version ${current_macosx_version})
     endif()
 
-    #10.3 systems don't have enough processing power anyway
-    #10.4 does not have @rpath support (which SDL uses)
-    if(minimum_macosx_version VERSION_LESS "10.5")
-        message(FATAL_ERROR "Hedgewars is not supported on your version of Mac OS X")
-    endif()
-
-    if(NOT CMAKE_OSX_ARCHITECTURES)
-        if(current_macosx_version VERSION_LESS "10.6")
-            #SDL is only 32 bit on older OS version
-            if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "powerpc*")
-                set(CMAKE_OSX_ARCHITECTURES "ppc7400")
-            else()
-                set(CMAKE_OSX_ARCHITECTURES "i386")
-            endif()
-        endif()
+    #minimum OSX version is 10.8.  Earlier versions cannot compile some dependencies anymore
+    #(like ffmpeg/libav)
+    if(minimum_macosx_version VERSION_LESS "10.8")
+        message(FATAL_ERROR "Hedgewars is unsupported on your platform and requires Mac OS X 10.8+")
     endif()
 
     #parse this system variable and adjust only the powerpc syntax to be compatible with -P
@@ -97,12 +89,6 @@
     #add user framework directory
     add_flag_append(CMAKE_Pascal_FLAGS "-Ff~/Library/Frameworks")
 
-    #workaround older cmake versions
-    if(${CMAKE_VERSION} VERSION_LESS "2.8.12")
-        add_flag_append(CMAKE_C_LINK_FLAGS "-Wl,-rpath -Wl,${CMAKE_INSTALL_RPATH}")
-        add_flag_append(CMAKE_CXX_LINK_FLAGS "-Wl,-rpath -Wl,${CMAKE_INSTALL_RPATH}")
-        add_flag_append(CMAKE_Pascal_LINK_FLAGS "-k-rpath -k${CMAKE_INSTALL_RPATH}")
-    endif()
 endif(APPLE)
 
 if(MINGW)
--- a/gameServer/Actions.hs	Mon Jan 14 15:11:15 2019 -0500
+++ b/gameServer/Actions.hs	Fri Aug 16 10:59:50 2019 -0600
@@ -834,14 +834,24 @@
     let (teams', params1, params2, roundMsgs') = fromJust cInfo
 
     when (isJust cInfo) $ do
-        mapM_ processAction $ concat [
-            [AnswerClients [c] ["JOINED", nick cl]]
-            , answerFullConfigParams cl params1 params2
-            , answerAllTeams cl teams'
-            , [AnswerClients [c]  ["RUN_GAME"]]
-            , [AnswerClients [c] $ "EM" : roundMsgs']
-            , [AnswerClients [c] ["KICKED"]]
-            ]
+        mapM_ processAction $
+            if clientProto cl < 58 then
+                concat [
+                    [AnswerClients [c] ["JOINED", nick cl]]
+                    , answerFullConfigParams cl params1 params2
+                    , answerAllTeams cl teams'
+                    , [AnswerClients [c]  ["RUN_GAME"]]
+                    , [AnswerClients [c] $ "EM" : roundMsgs']
+                    , [AnswerClients [c] ["KICKED"]]
+                ]
+            else
+                concat [
+                    [AnswerClients [c] ["REPLAY_START"]]
+                    , answerFullConfigParams cl params1 params2
+                    , answerAllTeams cl teams'
+                    , [AnswerClients [c]  ["RUN_GAME"]]
+                    , [AnswerClients [c] $ "EM" : roundMsgs']
+                ]
 
 processAction (SaveRoom rname) = do
     rnc <- gets roomsClients
@@ -885,3 +895,13 @@
 
 processAction CheckVotes =
     checkVotes >>= mapM_ processAction
+
+processAction (ShowRegisteredOnlyState chans) = do
+    si <- gets serverInfo
+    processAction $ AnswerClients chans
+        ["CHAT", nickServer,
+        if isRegisteredUsersOnly si then
+            loc "This server no longer allows unregistered players to join."
+        else
+            loc "This server now allows unregistered players to join."
+        ]
--- a/gameServer/CoreTypes.hs	Mon Jan 14 15:11:15 2019 -0500
+++ b/gameServer/CoreTypes.hs	Fri Aug 16 10:59:50 2019 -0600
@@ -103,11 +103,13 @@
     | ReactCmd [B.ByteString]
     | CheckVotes
     | SetRandomSeed
+    | ShowRegisteredOnlyState [ClientChan]
 
 
 data Event = LobbyChatMessage
            | EngineMessage
            | RoomJoin
+           | RoomNameUpdate
 
 type EventsInfo = [(Int, UTCTime)]
 
--- a/gameServer/FloodDetection.hs	Mon Jan 14 15:11:15 2019 -0500
+++ b/gameServer/FloodDetection.hs	Fri Aug 16 10:59:50 2019 -0600
@@ -36,15 +36,19 @@
     einfo LobbyChatMessage = eiLobbyChat
     einfo EngineMessage = eiEM
     einfo RoomJoin = eiJoin
+    einfo RoomNameUpdate = eiLobbyChat
 
     transformField LobbyChatMessage f = \c -> c{eiLobbyChat = f $ eiLobbyChat c}
     transformField EngineMessage f = \c -> c{eiEM = f $ eiEM c}
     transformField RoomJoin f = \c -> c{eiJoin = f $ eiJoin c}
+    transformField RoomNameUpdate f = transformField LobbyChatMessage f
+    
 
     boundaries :: Event -> (Int, (NominalDiffTime, Int), (NominalDiffTime, Int), ([Action], [Action]))
     boundaries LobbyChatMessage = (3, (10, 2), (30, 3), (chat1, chat2))
     boundaries EngineMessage = (8, (10, 4), (25, 5), (em1, em2))
     boundaries RoomJoin = (2, (10, 2), (35, 3), (join1, join2))
+    boundaries RoomNameUpdate = (\(a, b, c, _) -> (a, b, c, (roomName1, roomName2))) $ boundaries LobbyChatMessage
 
     chat1 = [Warning $ loc "Warning! Chat flood protection activated"]
     chat2 = [ByeClient $ loc "Excess flood"]
@@ -52,6 +56,8 @@
     em2 = [ByeClient $ loc "Excess flood"]
     join1 = [Warning $ loc "Warning! Joins flood protection activated"]
     join2 = [ByeClient $ loc "Excess flood"]
+    roomName1 = [Warning $ loc "Warning! Room name change flood protection activated"]
+    roomName2 = [ByeClient $ loc "Excess flood"]
 
     doCheck ei = do
         curTime <- io getCurrentTime
--- a/gameServer/HWProtoCore.hs	Mon Jan 14 15:11:15 2019 -0500
+++ b/gameServer/HWProtoCore.hs	Fri Aug 16 10:59:50 2019 -0600
@@ -107,7 +107,7 @@
 
         -- lobby-only commands
         h "STATS" _ = handleCmd_lobbyOnly ["STATS"]
-        h "RESTART_SERVER" "YES" = handleCmd_lobbyOnly ["RESTART_SERVER"]
+        h "RESTART_SERVER" p = handleCmd_lobbyOnly ["RESTART_SERVER", upperCase p]
 
         -- room and lobby commands
         h "QUIT" _ = handleCmd ["QUIT"]
@@ -120,11 +120,11 @@
         h "INFO" n | not $ B.null n = handleCmd ["INFO", n]
         h "HELP" _ = handleCmd ["HELP"]
         h "REGISTERED_ONLY" _ = serverAdminOnly $ do
-            cl <- thisClient
+            rnc <- liftM snd ask
+            let chans = map (sendChan . client rnc) $ allClients rnc
             return
                 [ModifyServerInfo(\s -> s{isRegisteredUsersOnly = not $ isRegisteredUsersOnly s})
-                -- TODO: Say whether 'registered only' state is on or off
-                , AnswerClients [sendChan cl] ["CHAT", nickServer, loc "'Registered only' state toggled."]
+                , ShowRegisteredOnlyState chans
                 ]
         h "SUPER_POWER" _ = serverAdminOnly $ do
             cl <- thisClient
--- a/gameServer/HWProtoInRoomState.hs	Mon Jan 14 15:11:15 2019 -0500
+++ b/gameServer/HWProtoInRoomState.hs	Fri Aug 16 10:59:50 2019 -0600
@@ -326,7 +326,8 @@
             [Warning $ loc "A room with the same name already exists."]
         else
             [ModifyRoom roomUpdate,
-            AnswerClients chans ("ROOM" : "UPD" : name rm : roomInfo (clientProto cl) (nick cl) (roomUpdate rm))]
+            AnswerClients chans ("ROOM" : "UPD" : name rm : roomInfo (clientProto cl) (nick cl) (roomUpdate rm)),
+            RegisterEvent RoomNameUpdate]
     where
         roomUpdate r = r{name = newName}
 
@@ -382,7 +383,7 @@
     where
         -- This is formatted in a way so it can parsed by engine to make it translatable
         -- Format: b<PLAYER NAME>]<MESSAGE>
-        engineMsg cl = toEngineMsg $ B.concat ["b", nick cl, "]", msg]
+        engineMsg cl = toEngineMsg $ B.concat ["b", nick cl, "]", msg, "\x20\x20"]
 
 
 handleCmd_inRoom ["BAN", banNick] = do
@@ -452,7 +453,7 @@
 handleCmd_inRoom ["CALLVOTE"] = do
     cl <- thisClient
     return [AnswerClients [sendChan cl]
-        ["CHAT", nickServer, loc "Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs"]
+        ["CHAT", nickServer, loc "Available callvote commands: hedgehogs <number>, pause, newseed, map <name>, kick <player>"]
         ]
 
 handleCmd_inRoom ["CALLVOTE", "KICK"] = do
--- a/gameServer/HWProtoLobbyState.hs	Mon Jan 14 15:11:15 2019 -0500
+++ b/gameServer/HWProtoLobbyState.hs	Fri Aug 16 10:59:50 2019 -0600
@@ -220,12 +220,18 @@
 handleCmd_lobby ["CLEAR_ACCOUNTS_CACHE"] = serverAdminOnly $
     return [ClearAccountsCache]
 
+handleCmd_lobby ["RESTART_SERVER", "YES"] = serverAdminOnly $
+    return [RestartServer]
+
 handleCmd_lobby ["RESTART_SERVER"] = serverAdminOnly $
-    return [RestartServer]
+    return [Warning $ loc "Please confirm server restart with '/restart_server yes'."]
+
+handleCmd_lobby ["RESTART_SERVER", _] = handleCmd_lobby ["RESTART_SERVER"]
+
 
 handleCmd_lobby ["STATS"] = serverAdminOnly $
     return [Stats]
 
 handleCmd_lobby (s:_) = return [ProtocolError $ "Incorrect command '" `B.append` s `B.append` "' (state: in lobby)"]
 
-handleCmd_lobby [] = return [ProtocolError "Empty command (state: in lobby)"]
\ No newline at end of file
+handleCmd_lobby [] = return [ProtocolError "Empty command (state: in lobby)"]
--- a/gameServer/hedgewars-server.cabal	Mon Jan 14 15:11:15 2019 -0500
+++ b/gameServer/hedgewars-server.cabal	Fri Aug 16 10:59:50 2019 -0600
@@ -22,7 +22,7 @@
     containers,
     vector,
     bytestring,
-    network >= 2.3,
+    network >= 2.3 && < 3.0,
     random,
     time,
     mtl >= 2,
@@ -57,7 +57,7 @@
     containers,
     vector,
     bytestring,
-    network >= 2.3,
+    network >= 2.3 && < 3.0,
     mtl >= 2,
     sandi,
     hslogger,
--- a/gameServer2/Cargo.toml	Mon Jan 14 15:11:15 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-[package]
-edition = "2018"
-name = "hedgewars-server"
-version = "0.0.1"
-authors = [ "Andrey Korotaev <a.korotaev@hedgewars.org>" ]
-
-[features]
-official-server = ["openssl"]
-tls-connections = ["openssl"]
-default = []
-
-[dependencies]
-rand = "0.5"
-mio = "0.6"
-slab = "0.4"
-netbuf = "0.4"
-nom = "4.1"
-env_logger = "0.6"
-log = "0.4"
-base64 = "0.10"
-bitflags = "1.0"
-serde = "1.0"
-serde_yaml = "0.8"
-serde_derive = "1.0"
-openssl = { version = "0.10", optional = true }
-
-[dev-dependencies]
-proptest = "0.8"
\ No newline at end of file
--- a/gameServer2/src/main.rs	Mon Jan 14 15:11:15 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-#![allow(unused_imports)]
-#![deny(bare_trait_objects)]
-
-//use std::io::*;
-//use rand::Rng;
-//use std::cmp::Ordering;
-use mio::net::*;
-use mio::*;
-use log::*;
-
-mod utils;
-mod server;
-mod protocol;
-
-use crate::server::network::NetworkLayer;
-use std::time::Duration;
-
-fn main() {
-    env_logger::init();
-
-    info!("Hedgewars game server, protocol {}", utils::PROTOCOL_VERSION);
-
-    let address = "0.0.0.0:46631".parse().unwrap();
-    let listener = TcpListener::bind(&address).unwrap();
-
-    let poll = Poll::new().unwrap();
-    let mut hw_network = NetworkLayer::new(listener, 1024, 512);
-    hw_network.register_server(&poll).unwrap();
-
-    let mut events = Events::with_capacity(1024);
-
-    loop {
-        let timeout = if hw_network.has_pending_operations() {
-            Some(Duration::from_millis(1))
-        } else {
-            None
-        };
-        poll.poll(&mut events, timeout).unwrap();
-
-        for event in events.iter() {
-            if event.readiness() & Ready::readable() == Ready::readable() {
-                match event.token() {
-                    utils::SERVER => hw_network.accept_client(&poll).unwrap(),
-                    Token(tok) => hw_network.client_readable(&poll, tok).unwrap(),
-                }
-            }
-            if event.readiness() & Ready::writable() == Ready::writable() {
-                match event.token() {
-                    utils::SERVER => unreachable!(),
-                    Token(tok) => hw_network.client_writable(&poll, tok).unwrap(),
-                }
-            }
-//            if event.kind().is_hup() || event.kind().is_error() {
-//                match event.token() {
-//                    utils::SERVER => unreachable!(),
-//                    Token(tok) => server.client_error(&poll, tok).unwrap(),
-//                }
-//            }
-        }
-        hw_network.on_idle(&poll).unwrap();
-    }
-}
--- a/gameServer2/src/protocol/messages.rs	Mon Jan 14 15:11:15 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,316 +0,0 @@
-use crate::server::coretypes::{
-    ServerVar, GameCfg, TeamInfo,
-    HedgehogInfo, VoteType
-};
-use std::{ops, convert::From, iter::once};
-
-#[derive(PartialEq, Eq, Clone, Debug)]
-pub enum HWProtocolMessage {
-    // core
-    Ping,
-    Pong,
-    Quit(Option<String>),
-    //Cmd(String, Vec<String>),
-    Global(String),
-    Watch(String),
-    ToggleServerRegisteredOnly,
-    SuperPower,
-    Info(String),
-    // not entered state
-    Nick(String),
-    Proto(u16),
-    Password(String, String),
-    Checker(u16, String, String),
-    // lobby
-    List,
-    Chat(String),
-    CreateRoom(String, Option<String>),
-    JoinRoom(String, Option<String>),
-    Follow(String),
-    Rnd(Vec<String>),
-    Kick(String),
-    Ban(String, String, u32),
-    BanIP(String, String, u32),
-    BanNick(String, String, u32),
-    BanList,
-    Unban(String),
-    SetServerVar(ServerVar),
-    GetServerVar,
-    RestartServer,
-    Stats,
-    // in room
-    Part(Option<String>),
-    Cfg(GameCfg),
-    AddTeam(Box<TeamInfo>),
-    RemoveTeam(String),
-    SetHedgehogsNumber(String, u8),
-    SetTeamColor(String, u8),
-    ToggleReady,
-    StartGame,
-    EngineMessage(String),
-    RoundFinished,
-    ToggleRestrictJoin,
-    ToggleRestrictTeams,
-    ToggleRegisteredOnly,
-    RoomName(String),
-    Delegate(String),
-    TeamChat(String),
-    MaxTeams(u8),
-    Fix,
-    Unfix,
-    Greeting(String),
-    CallVote(Option<VoteType>),
-    Vote(bool),
-    ForceVote(bool),
-    Save(String, String),
-    Delete(String),
-    SaveRoom(String),
-    LoadRoom(String),
-    Malformed,
-    Empty,
-}
-
-#[derive(Debug)]
-pub enum HWServerMessage {
-    Ping,
-    Pong,
-    Bye(String),
-    Nick(String),
-    Proto(u16),
-    ServerAuth(String),
-    LobbyLeft(String, String),
-    LobbyJoined(Vec<String>),
-    ChatMsg {nick: String, msg: String},
-    ClientFlags(String, Vec<String>),
-    Rooms(Vec<String>),
-    RoomAdd(Vec<String>),
-    RoomJoined(Vec<String>),
-    RoomLeft(String, String),
-    RoomRemove(String),
-    RoomUpdated(String, Vec<String>),
-    TeamAdd(Vec<String>),
-    TeamRemove(String),
-    TeamAccepted(String),
-    TeamColor(String, u8),
-    HedgehogsNumber(String, u8),
-    ConfigEntry(String, Vec<String>),
-    Kicked,
-    RunGame,
-    ForwardEngineMessage(Vec<String>),
-    RoundFinished,
-
-    ServerMessage(String),
-    Notice(String),
-    Warning(String),
-    Error(String),
-    Connected(u32),
-    Unreachable,
-
-    //Deprecated messages
-    LegacyReady(bool, Vec<String>)
-}
-
-pub fn server_chat(msg: String) -> HWServerMessage  {
-    HWServerMessage::ChatMsg{ nick: "[server]".to_string(), msg }
-}
-
-impl GameCfg {
-    pub fn to_protocol(&self) -> (String, Vec<String>) {
-        use crate::server::coretypes::GameCfg::*;
-        match self {
-            FeatureSize(s) => ("FEATURE_SIZE".to_string(), vec![s.to_string()]),
-            MapType(t) => ("MAP".to_string(), vec![t.to_string()]),
-            MapGenerator(g) => ("MAPGEN".to_string(), vec![g.to_string()]),
-            MazeSize(s) => ("MAZE_SIZE".to_string(), vec![s.to_string()]),
-            Seed(s) => ("SEED".to_string(), vec![s.to_string()]),
-            Template(t) => ("TEMPLATE".to_string(), vec![t.to_string()]),
-
-            Ammo(n, None) => ("AMMO".to_string(), vec![n.to_string()]),
-            Ammo(n, Some(s)) => ("AMMO".to_string(), vec![n.to_string(), s.to_string()]),
-            Scheme(n, s) if s.is_empty() => ("SCHEME".to_string(), vec![n.to_string()]),
-            Scheme(n, s) => ("SCHEME".to_string(), {
-                let mut v = vec![n.to_string()];
-                v.extend(s.clone().into_iter());
-                v
-            }),
-            Script(s) => ("SCRIPT".to_string(), vec![s.to_string()]),
-            Theme(t) => ("THEME".to_string(), vec![t.to_string()]),
-            DrawnMap(m) => ("DRAWNMAP".to_string(), vec![m.to_string()])
-        }
-    }
-
-    pub fn to_server_msg(&self) -> HWServerMessage {
-        use self::HWServerMessage::ConfigEntry;
-        let (name, args) = self.to_protocol();
-        HWServerMessage::ConfigEntry(name, args)
-    }
-}
-
-macro_rules! const_braces {
-    ($e: expr) => { "{}\n" }
-}
-
-macro_rules! msg {
-    [$($part: expr),*] => {
-        format!(concat!($(const_braces!($part)),*, "\n"), $($part),*);
-    };
-}
-
-#[cfg(test)]
-macro_rules! several {
-    [$part: expr] => { once($part) };
-    [$part: expr, $($other: expr),*] => { once($part).chain(several![$($other),*]) };
-}
-
-impl HWProtocolMessage {
-    /** Converts the message to a raw `String`, which can be sent over the network.
-     *
-     * This is the inverse of the `message` parser.
-     */
-    #[cfg(test)]
-    pub(crate) fn to_raw_protocol(&self) -> String {
-        use self::HWProtocolMessage::*;
-        match self {
-            Ping => msg!["PING"],
-            Pong => msg!["PONG"],
-            Quit(None) => msg!["QUIT"],
-            Quit(Some(msg)) => msg!["QUIT", msg],
-            Global(msg) => msg!["CMD", format!("GLOBAL {}", msg)],
-            Watch(name) => msg!["CMD", format!("WATCH {}", name)],
-            ToggleServerRegisteredOnly => msg!["CMD", "REGISTERED_ONLY"],
-            SuperPower =>  msg!["CMD", "SUPER_POWER"],
-            Info(info) => msg!["CMD", format!("INFO {}", info)],
-            Nick(nick) => msg!("NICK", nick),
-            Proto(version) => msg!["PROTO", version],
-            Password(p, s) => msg!["PASSWORD", p, s],
-            Checker(i, n, p) => msg!["CHECKER", i, n, p],
-            List => msg!["LIST"],
-            Chat(msg) => msg!["CHAT", msg],
-            CreateRoom(name, None) => msg!["CREATE_ROOM", name],
-            CreateRoom(name, Some(password)) =>
-                msg!["CREATE_ROOM", name, password],
-            JoinRoom(name, None) => msg!["JOIN_ROOM", name],
-            JoinRoom(name, Some(password)) =>
-                msg!["JOIN_ROOM", name, password],
-            Follow(name) => msg!["FOLLOW", name],
-            Rnd(args) => if args.is_empty() {
-                msg!["CMD", "RND"]
-            } else {
-                msg!["CMD", format!("RND {}", args.join(" "))]
-            },
-            Kick(name) => msg!["KICK", name],
-            Ban(name, reason, time) => msg!["BAN", name, reason, time],
-            BanIP(ip, reason, time) => msg!["BAN_IP", ip, reason, time],
-            BanNick(nick, reason, time) =>
-                msg!("BAN_NICK", nick, reason, time),
-            BanList => msg!["BANLIST"],
-            Unban(name) => msg!["UNBAN", name],
-            //SetServerVar(ServerVar), ???
-            GetServerVar => msg!["GET_SERVER_VAR"],
-            RestartServer => msg!["CMD", "RESTART_SERVER YES"],
-            Stats => msg!["CMD", "STATS"],
-            Part(None) => msg!["PART"],
-            Part(Some(msg)) => msg!["PART", msg],
-            Cfg(config) => {
-                let (name, args) = config.to_protocol();
-                msg!["CFG", name, args.join("\n")]
-            },
-            AddTeam(info) =>
-                msg!["ADD_TEAM", info.name, info.color, info.grave, info.fort,
-                     info.voice_pack, info.flag, info.difficulty,
-                     info.hedgehogs.iter()
-                        .flat_map(|h| several![&h.name[..], &h.hat[..]])
-                        .collect::<Vec<_>>().join("\n")],
-            RemoveTeam(name) => msg!["REMOVE_TEAM", name],
-            SetHedgehogsNumber(team, number) => msg!["HH_NUM", team, number],
-            SetTeamColor(team, color) => msg!["TEAM_COLOR", team, color],
-            ToggleReady => msg!["TOGGLE_READY"],
-            StartGame => msg!["START_GAME"],
-            EngineMessage(msg) => msg!["EM", msg],
-            RoundFinished => msg!["ROUNDFINISHED"],
-            ToggleRestrictJoin => msg!["TOGGLE_RESTRICT_JOINS"],
-            ToggleRestrictTeams => msg!["TOGGLE_RESTRICT_TEAMS"],
-            ToggleRegisteredOnly => msg!["TOGGLE_REGISTERED_ONLY"],
-            RoomName(name) => msg!["ROOM_NAME", name],
-            Delegate(name) => msg!["CMD", format!("DELEGATE {}", name)],
-            TeamChat(msg) => msg!["TEAMCHAT", msg],
-            MaxTeams(count) => msg!["CMD", format!("MAXTEAMS {}", count)] ,
-            Fix => msg!["CMD", "FIX"],
-            Unfix => msg!["CMD", "UNFIX"],
-            Greeting(msg) => msg!["CMD", format!("GREETING {}", msg)],
-            //CallVote(Option<(String, Option<String>)>) =>, ??
-            Vote(msg) => msg!["CMD", format!("VOTE {}", if *msg {"YES"} else {"NO"})],
-            ForceVote(msg) => msg!["CMD", format!("FORCE {}", if *msg {"YES"} else {"NO"})],
-            Save(name, location) => msg!["CMD", format!("SAVE {} {}", name, location)],
-            Delete(name) => msg!["CMD", format!("DELETE {}", name)],
-            SaveRoom(name) => msg!["CMD", format!("SAVEROOM {}", name)],
-            LoadRoom(name) => msg!["CMD", format!("LOADROOM {}", name)],
-            Malformed => msg!["A", "QUICK", "BROWN", "HOG", "JUMPS", "OVER", "THE", "LAZY", "DOG"],
-            Empty => msg![""],
-            _ => panic!("Protocol message not yet implemented")
-        }
-    }
-}
-
-fn construct_message(header: &[&str], msg: &[String]) -> String {
-    let mut v: Vec<_> = header.iter().cloned().collect();
-    v.extend(msg.iter().map(|s| &s[..]));
-    v.push("\n");
-    v.join("\n")
-}
-
-impl HWServerMessage {
-    pub fn to_raw_protocol(&self) -> String {
-        use self::HWServerMessage::*;
-        match self {
-            Ping => msg!["PING"],
-            Pong => msg!["PONG"],
-            Connected(protocol_version) => msg![
-                "CONNECTED",
-                "Hedgewars server https://www.hedgewars.org/",
-                protocol_version],
-            Bye(msg) => msg!["BYE", msg],
-            Nick(nick) => msg!["NICK", nick],
-            Proto(proto) => msg!["PROTO", proto],
-            ServerAuth(hash) => msg!["SERVER_AUTH", hash],
-            LobbyLeft(nick, msg) => msg!["LOBBY:LEFT", nick, msg],
-            LobbyJoined(nicks) =>
-                construct_message(&["LOBBY:JOINED"], &nicks),
-            ClientFlags(flags, nicks) =>
-                construct_message(&["CLIENT_FLAGS", flags], &nicks),
-            Rooms(info) =>
-                construct_message(&["ROOMS"], &info),
-            RoomAdd(info) =>
-                construct_message(&["ROOM", "ADD"], &info),
-            RoomJoined(nicks) =>
-                construct_message(&["JOINED"], &nicks),
-            RoomLeft(nick, msg) => msg!["LEFT", nick, msg],
-            RoomRemove(name) => msg!["ROOM", "DEL", name],
-            RoomUpdated(name, info) =>
-                construct_message(&["ROOM", "UPD", name], &info),
-            TeamAdd(info) =>
-                construct_message(&["ADD_TEAM"], &info),
-            TeamRemove(name) => msg!["REMOVE_TEAM", name],
-            TeamAccepted(name) => msg!["TEAM_ACCEPTED", name],
-            TeamColor(name, color) => msg!["TEAM_COLOR", name, color],
-            HedgehogsNumber(name, number) => msg!["HH_NUM", name, number],
-            ConfigEntry(name, values) =>
-                construct_message(&["CFG", name], &values),
-            Kicked => msg!["KICKED"],
-            RunGame => msg!["RUN_GAME"],
-            ForwardEngineMessage(em) =>
-                construct_message(&["EM"], &em),
-            RoundFinished => msg!["ROUND_FINISHED"],
-            ChatMsg {nick, msg} => msg!["CHAT", nick, msg],
-            ServerMessage(msg) => msg!["SERVER_MESSAGE", msg],
-            Notice(msg) => msg!["NOTICE", msg],
-            Warning(msg) => msg!["WARNING", msg],
-            Error(msg) => msg!["ERROR", msg],
-
-            LegacyReady(is_ready, nicks) =>
-                construct_message(&[if *is_ready {"READY"} else {"NOT_READY"}], &nicks),
-
-            _ => msg!["ERROR", "UNIMPLEMENTED"],
-        }
-    }
-}
--- a/gameServer2/src/protocol/mod.rs	Mon Jan 14 15:11:15 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-use netbuf;
-use std::{
-    io::{Read, Result}
-};
-use nom::{
-    IResult, Err
-};
-
-pub mod messages;
-#[cfg(test)]
-pub mod test;
-mod parser;
-
-pub struct ProtocolDecoder {
-    buf: netbuf::Buf,
-    consumed: usize,
-}
-
-impl ProtocolDecoder {
-    pub fn new() -> ProtocolDecoder {
-        ProtocolDecoder {
-            buf: netbuf::Buf::new(),
-            consumed: 0,
-        }
-    }
-
-    pub fn read_from<R: Read>(&mut self, stream: &mut R) -> Result<usize> {
-        self.buf.read_from(stream)
-    }
-
-    pub fn extract_messages(&mut self) -> Vec<messages::HWProtocolMessage> {
-        let parse_result = parser::extract_messages(&self.buf[..]);
-        match parse_result {
-            Ok((tail, msgs)) => {
-                self.consumed = self.buf.len() - self.consumed - tail.len();
-                msgs
-            },
-            Err(Err::Incomplete(_)) => unreachable!(),
-            Err(Err::Error(_)) | Err(Err::Failure(_)) => unreachable!(),
-        }
-    }
-
-    pub fn sweep(&mut self) {
-        self.buf.consume(self.consumed);
-        self.consumed = 0;
-    }
-}
--- a/gameServer2/src/protocol/parser.rs	Mon Jan 14 15:11:15 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,284 +0,0 @@
-/** The parsers for the chat and multiplayer protocol. The main parser is `message`.
- * # Protocol
- * All messages consist of `\n`-separated strings. The end of a message is
- * indicated by a double newline - `\n\n`.
- *
- * For example, a nullary command like PING will be actually sent as `PING\n\n`.
- * A unary command, such as `START_GAME nick` will be actually sent as `START_GAME\nnick\n\n`.
- */
-
-use nom::*;
-
-use std::{
-    str, str::FromStr,
-    ops::Range
-};
-use super::{
-    messages::{HWProtocolMessage, HWProtocolMessage::*}
-};
-#[cfg(test)]
-use {
-    super::test::gen_proto_msg,
-    proptest::{proptest, proptest_helper}
-};
-use crate::server::coretypes::{
-    HedgehogInfo, TeamInfo, GameCfg, VoteType, MAX_HEDGEHOGS_PER_TEAM
-};
-
-named!(end_of_message, tag!("\n\n"));
-named!(str_line<&[u8],   &str>, map_res!(not_line_ending, str::from_utf8));
-named!(  a_line<&[u8], String>, map!(str_line, String::from));
-named!(cmd_arg<&[u8], String>,
-    map!(map_res!(take_until_either!(" \n"), str::from_utf8), String::from));
-named!( u8_line<&[u8],     u8>, map_res!(str_line, FromStr::from_str));
-named!(u16_line<&[u8],    u16>, map_res!(str_line, FromStr::from_str));
-named!(u32_line<&[u8],    u32>, map_res!(str_line, FromStr::from_str));
-named!(yes_no_line<&[u8], bool>, alt!(
-      do_parse!(tag_no_case!("YES") >> (true))
-    | do_parse!(tag_no_case!("NO") >> (false))));
-named!(opt_param<&[u8], Option<String> >, alt!(
-      do_parse!(peek!(tag!("\n\n")) >> (None))
-    | do_parse!(tag!("\n") >> s: str_line >> (Some(s.to_string())))));
-named!(spaces<&[u8], &[u8]>, preceded!(tag!(" "), eat_separator!(" ")));
-named!(opt_space_param<&[u8], Option<String> >, alt!(
-      do_parse!(peek!(tag!("\n\n")) >> (None))
-    | do_parse!(spaces >> s: str_line >> (Some(s.to_string())))));
-named!(hog_line<&[u8], HedgehogInfo>,
-    do_parse!(name: str_line >> eol >> hat: str_line >>
-        (HedgehogInfo{name: name.to_string(), hat: hat.to_string()})));
-named!(_8_hogs<&[u8], [HedgehogInfo; MAX_HEDGEHOGS_PER_TEAM as usize]>,
-    do_parse!(h1: hog_line >> eol >> h2: hog_line >> eol >>
-              h3: hog_line >> eol >> h4: hog_line >> eol >>
-              h5: hog_line >> eol >> h6: hog_line >> eol >>
-              h7: hog_line >> eol >> h8: hog_line >>
-              ([h1, h2, h3, h4, h5, h6, h7, h8])));
-named!(voting<&[u8], VoteType>, alt!(
-      do_parse!(tag_no_case!("KICK") >> spaces >> n: a_line >>
-        (VoteType::Kick(n)))
-    | do_parse!(tag_no_case!("MAP") >>
-        n: opt!(preceded!(spaces, a_line)) >>
-        (VoteType::Map(n)))
-    | do_parse!(tag_no_case!("PAUSE") >>
-        (VoteType::Pause))
-    | do_parse!(tag_no_case!("NEWSEED") >>
-        (VoteType::NewSeed))
-    | do_parse!(tag_no_case!("HEDGEHOGS") >> spaces >> n: u8_line >>
-        (VoteType::HedgehogsPerTeam(n)))));
-
-/** Recognizes messages which do not take any parameters */
-named!(basic_message<&[u8], HWProtocolMessage>, alt!(
-      do_parse!(tag!("PING") >> (Ping))
-    | do_parse!(tag!("PONG") >> (Pong))
-    | do_parse!(tag!("LIST") >> (List))
-    | do_parse!(tag!("BANLIST")        >> (BanList))
-    | do_parse!(tag!("GET_SERVER_VAR") >> (GetServerVar))
-    | do_parse!(tag!("TOGGLE_READY")   >> (ToggleReady))
-    | do_parse!(tag!("START_GAME")     >> (StartGame))
-    | do_parse!(tag!("ROUNDFINISHED")  >> _m: opt_param >> (RoundFinished))
-    | do_parse!(tag!("TOGGLE_RESTRICT_JOINS")  >> (ToggleRestrictJoin))
-    | do_parse!(tag!("TOGGLE_RESTRICT_TEAMS")  >> (ToggleRestrictTeams))
-    | do_parse!(tag!("TOGGLE_REGISTERED_ONLY") >> (ToggleRegisteredOnly))
-));
-
-/** Recognizes messages which take exactly one parameter */
-named!(one_param_message<&[u8], HWProtocolMessage>, alt!(
-      do_parse!(tag!("NICK")    >> eol >> n: a_line >> (Nick(n)))
-    | do_parse!(tag!("INFO")    >> eol >> n: a_line >> (Info(n)))
-    | do_parse!(tag!("CHAT")    >> eol >> m: a_line >> (Chat(m)))
-    | do_parse!(tag!("PART")    >> msg: opt_param   >> (Part(msg)))
-    | do_parse!(tag!("FOLLOW")  >> eol >> n: a_line >> (Follow(n)))
-    | do_parse!(tag!("KICK")    >> eol >> n: a_line >> (Kick(n)))
-    | do_parse!(tag!("UNBAN")   >> eol >> n: a_line >> (Unban(n)))
-    | do_parse!(tag!("EM")      >> eol >> m: a_line >> (EngineMessage(m)))
-    | do_parse!(tag!("TEAMCHAT")    >> eol >> m: a_line >> (TeamChat(m)))
-    | do_parse!(tag!("ROOM_NAME")   >> eol >> n: a_line >> (RoomName(n)))
-    | do_parse!(tag!("REMOVE_TEAM") >> eol >> n: a_line >> (RemoveTeam(n)))
-
-    | do_parse!(tag!("PROTO")   >> eol >> d: u16_line >> (Proto(d)))
-
-    | do_parse!(tag!("QUIT")   >> msg: opt_param >> (Quit(msg)))
-));
-
-/** Recognizes messages preceded with CMD */
-named!(cmd_message<&[u8], HWProtocolMessage>, preceded!(tag!("CMD\n"), alt!(
-      do_parse!(tag_no_case!("STATS") >> (Stats))
-    | do_parse!(tag_no_case!("FIX")   >> (Fix))
-    | do_parse!(tag_no_case!("UNFIX") >> (Unfix))
-    | do_parse!(tag_no_case!("RESTART_SERVER") >> spaces >> tag!("YES") >> (RestartServer))
-    | do_parse!(tag_no_case!("REGISTERED_ONLY") >> (ToggleServerRegisteredOnly))
-    | do_parse!(tag_no_case!("SUPER_POWER")     >> (SuperPower))
-    | do_parse!(tag_no_case!("PART")     >> m: opt_space_param >> (Part(m)))
-    | do_parse!(tag_no_case!("QUIT")     >> m: opt_space_param >> (Quit(m)))
-    | do_parse!(tag_no_case!("DELEGATE") >> spaces >> n: a_line  >> (Delegate(n)))
-    | do_parse!(tag_no_case!("SAVE")     >> spaces >> n: cmd_arg >> spaces >> l: cmd_arg >> (Save(n, l)))
-    | do_parse!(tag_no_case!("DELETE")   >> spaces >> n: a_line  >> (Delete(n)))
-    | do_parse!(tag_no_case!("SAVEROOM") >> spaces >> r: a_line  >> (SaveRoom(r)))
-    | do_parse!(tag_no_case!("LOADROOM") >> spaces >> r: a_line  >> (LoadRoom(r)))
-    | do_parse!(tag_no_case!("GLOBAL")   >> spaces >> m: a_line  >> (Global(m)))
-    | do_parse!(tag_no_case!("WATCH")    >> spaces >> i: a_line  >> (Watch(i)))
-    | do_parse!(tag_no_case!("GREETING") >> spaces >> m: a_line  >> (Greeting(m)))
-    | do_parse!(tag_no_case!("VOTE")     >> spaces >> m: yes_no_line >> (Vote(m)))
-    | do_parse!(tag_no_case!("FORCE")    >> spaces >> m: yes_no_line >> (ForceVote(m)))
-    | do_parse!(tag_no_case!("INFO")     >> spaces >> n: a_line  >> (Info(n)))
-    | do_parse!(tag_no_case!("MAXTEAMS") >> spaces >> n: u8_line >> (MaxTeams(n)))
-    | do_parse!(tag_no_case!("CALLVOTE") >>
-        v: opt!(preceded!(spaces, voting)) >> (CallVote(v)))
-    | do_parse!(
-        tag_no_case!("RND") >> alt!(spaces | peek!(end_of_message)) >>
-        v: str_line >>
-        (Rnd(v.split_whitespace().map(String::from).collect())))
-)));
-
-named!(complex_message<&[u8], HWProtocolMessage>, alt!(
-      do_parse!(tag!("PASSWORD")  >> eol >>
-                    p: a_line     >> eol >>
-                    s: a_line     >>
-                    (Password(p, s)))
-    | do_parse!(tag!("CHECKER")   >> eol >>
-                    i: u16_line   >> eol >>
-                    n: a_line     >> eol >>
-                    p: a_line     >>
-                    (Checker(i, n, p)))
-    | do_parse!(tag!("CREATE_ROOM") >> eol >>
-                    n: a_line       >>
-                    p: opt_param    >>
-                    (CreateRoom(n, p)))
-    | do_parse!(tag!("JOIN_ROOM")   >> eol >>
-                    n: a_line       >>
-                    p: opt_param    >>
-                    (JoinRoom(n, p)))
-    | do_parse!(tag!("ADD_TEAM")    >> eol >>
-                    name: a_line    >> eol >>
-                    color: u8_line  >> eol >>
-                    grave: a_line   >> eol >>
-                    fort: a_line    >> eol >>
-                    voice_pack: a_line >> eol >>
-                    flag: a_line    >> eol >>
-                    difficulty: u8_line >> eol >>
-                    hedgehogs: _8_hogs >>
-                    (AddTeam(Box::new(TeamInfo{
-                        name, color, grave, fort,
-                        voice_pack, flag, difficulty,
-                        hedgehogs, hedgehogs_number: 0
-                     }))))
-    | do_parse!(tag!("HH_NUM")    >> eol >>
-                    n: a_line     >> eol >>
-                    c: u8_line    >>
-                    (SetHedgehogsNumber(n, c)))
-    | do_parse!(tag!("TEAM_COLOR")    >> eol >>
-                    n: a_line     >> eol >>
-                    c: u8_line    >>
-                    (SetTeamColor(n, c)))
-    | do_parse!(tag!("BAN")    >> eol >>
-                    n: a_line     >> eol >>
-                    r: a_line     >> eol >>
-                    t: u32_line   >>
-                    (Ban(n, r, t)))
-    | do_parse!(tag!("BAN_IP")    >> eol >>
-                    n: a_line     >> eol >>
-                    r: a_line     >> eol >>
-                    t: u32_line   >>
-                    (BanIP(n, r, t)))
-    | do_parse!(tag!("BAN_NICK")    >> eol >>
-                    n: a_line     >> eol >>
-                    r: a_line     >> eol >>
-                    t: u32_line   >>
-                    (BanNick(n, r, t)))
-));
-
-named!(cfg_message<&[u8], HWProtocolMessage>, preceded!(tag!("CFG\n"), map!(alt!(
-      do_parse!(tag!("THEME")    >> eol >>
-                name: a_line     >>
-                (GameCfg::Theme(name)))
-    | do_parse!(tag!("SCRIPT")   >> eol >>
-                name: a_line     >>
-                (GameCfg::Script(name)))
-    | do_parse!(tag!("AMMO")     >> eol >>
-                name: a_line     >>
-                value: opt_param >>
-                (GameCfg::Ammo(name, value)))
-    | do_parse!(tag!("SCHEME")   >> eol >>
-                name: a_line     >>
-                values: opt!(preceded!(eol, separated_list!(eol, a_line))) >>
-                (GameCfg::Scheme(name, values.unwrap_or_default())))
-    | do_parse!(tag!("FEATURE_SIZE") >> eol >>
-                value: u32_line    >>
-                (GameCfg::FeatureSize(value)))
-    | do_parse!(tag!("MAP")      >> eol >>
-                value: a_line    >>
-                (GameCfg::MapType(value)))
-    | do_parse!(tag!("MAPGEN")   >> eol >>
-                value: u32_line  >>
-                (GameCfg::MapGenerator(value)))
-    | do_parse!(tag!("MAZE_SIZE") >> eol >>
-                value: u32_line   >>
-                (GameCfg::MazeSize(value)))
-    | do_parse!(tag!("SEED")     >> eol >>
-                value: a_line    >>
-                (GameCfg::Seed(value)))
-    | do_parse!(tag!("TEMPLATE") >> eol >>
-                value: u32_line  >>
-                (GameCfg::Template(value)))
-    | do_parse!(tag!("DRAWNMAP") >> eol >>
-                value: a_line    >>
-                (GameCfg::DrawnMap(value)))
-), Cfg)));
-
-named!(malformed_message<&[u8], HWProtocolMessage>,
-    do_parse!(separated_list!(eol, a_line) >> (Malformed)));
-
-named!(empty_message<&[u8], HWProtocolMessage>,
-    do_parse!(alt!(end_of_message | eol) >> (Empty)));
-
-named!(message<&[u8], HWProtocolMessage>, alt!(terminated!(
-    alt!(
-          basic_message
-        | one_param_message
-        | cmd_message
-        | complex_message
-        | cfg_message
-        ), end_of_message
-    )
-    | terminated!(malformed_message, end_of_message)
-    | empty_message
-    )
-);
-
-named!(pub extract_messages<&[u8], Vec<HWProtocolMessage> >, many0!(complete!(message)));
-
-#[cfg(test)]
-proptest! {
-    #[test]
-    fn is_parser_composition_idempotent(ref msg in gen_proto_msg()) {
-        println!("!! Msg: {:?}, Bytes: {:?} !!", msg, msg.to_raw_protocol().as_bytes());
-        assert_eq!(message(msg.to_raw_protocol().as_bytes()), Ok((&b""[..], msg.clone())))
-    }
-}
-
-#[test]
-fn parse_test() {
-    assert_eq!(message(b"PING\n\n"),          Ok((&b""[..], Ping)));
-    assert_eq!(message(b"START_GAME\n\n"),    Ok((&b""[..], StartGame)));
-    assert_eq!(message(b"NICK\nit's me\n\n"), Ok((&b""[..], Nick("it's me".to_string()))));
-    assert_eq!(message(b"PROTO\n51\n\n"),     Ok((&b""[..], Proto(51))));
-    assert_eq!(message(b"QUIT\nbye-bye\n\n"), Ok((&b""[..], Quit(Some("bye-bye".to_string())))));
-    assert_eq!(message(b"QUIT\n\n"),          Ok((&b""[..], Quit(None))));
-    assert_eq!(message(b"CMD\nwatch demo\n\n"), Ok((&b""[..], Watch("demo".to_string()))));
-    assert_eq!(message(b"BAN\nme\nbad\n77\n\n"), Ok((&b""[..], Ban("me".to_string(), "bad".to_string(), 77))));
-
-    assert_eq!(message(b"CMD\nPART\n\n"),      Ok((&b""[..], Part(None))));
-    assert_eq!(message(b"CMD\nPART _msg_\n\n"), Ok((&b""[..], Part(Some("_msg_".to_string())))));
-
-    assert_eq!(message(b"CMD\nRND\n\n"), Ok((&b""[..], Rnd(vec![]))));
-    assert_eq!(
-        message(b"CMD\nRND A B\n\n"),
-        Ok((&b""[..], Rnd(vec![String::from("A"), String::from("B")])))
-    );
-
-    assert_eq!(extract_messages(b"QUIT\n1\n2\n\n"),    Ok((&b""[..], vec![Malformed])));
-
-    assert_eq!(extract_messages(b"PING\n\nPING\n\nP"), Ok((&b"P"[..], vec![Ping, Ping])));
-    assert_eq!(extract_messages(b"SING\n\nPING\n\n"),  Ok((&b""[..],  vec![Malformed, Ping])));
-    assert_eq!(extract_messages(b"\n\n\n\nPING\n\n"),  Ok((&b""[..],  vec![Empty, Empty, Ping])));
-    assert_eq!(extract_messages(b"\n\n\nPING\n\n"),    Ok((&b""[..],  vec![Empty, Empty, Ping])));
-}
--- a/gameServer2/src/protocol/test.rs	Mon Jan 14 15:11:15 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,168 +0,0 @@
-use proptest::{
-    test_runner::{TestRunner, Reason},
-    arbitrary::{any, any_with, Arbitrary, StrategyFor},
-    strategy::{Strategy, BoxedStrategy, Just, Map}
-};
-
-use crate::server::coretypes::{GameCfg, TeamInfo, HedgehogInfo};
-
-use super::messages::{
-    HWProtocolMessage, HWProtocolMessage::*
-};
-
-// Due to inability to define From between Options
-trait Into2<T>: Sized { fn into2(self) -> T; }
-impl <T> Into2<T> for T { fn into2(self) -> T { self } }
-impl Into2<Vec<String>> for Vec<Ascii> {
-    fn into2(self) -> Vec<String> {
-        self.into_iter().map(|x| x.0).collect()
-    }
-}
-impl Into2<String> for Ascii { fn into2(self) -> String { self.0 } }
-impl Into2<Option<String>> for Option<Ascii>{
-    fn into2(self) -> Option<String> { self.map(|x| {x.0}) }
-}
-
-macro_rules! proto_msg_case {
-    ($val: ident()) =>
-        (Just($val));
-    ($val: ident($arg: ty)) =>
-        (any::<$arg>().prop_map(|v| {$val(v.into2())}));
-    ($val: ident($arg1: ty, $arg2: ty)) =>
-        (any::<($arg1, $arg2)>().prop_map(|v| {$val(v.0.into2(), v.1.into2())}));
-    ($val: ident($arg1: ty, $arg2: ty, $arg3: ty)) =>
-        (any::<($arg1, $arg2, $arg3)>().prop_map(|v| {$val(v.0.into2(), v.1.into2(), v.2.into2())}));
-}
-
-macro_rules! proto_msg_match {
-    ($var: expr, def = $default: expr, $($num: expr => $constr: ident $res: tt),*) => (
-        match $var {
-            $($num => (proto_msg_case!($constr $res)).boxed()),*,
-            _ => Just($default).boxed()
-        }
-    )
-}
-
-/// Wrapper type for generating non-empty strings
-#[derive(Debug)]
-struct Ascii(String);
-
-impl Arbitrary for Ascii {
-    type Parameters = <String as Arbitrary>::Parameters;
-
-    fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy {
-        "[a-zA-Z0-9]+".prop_map(Ascii).boxed()
-    }
-
-    type Strategy = BoxedStrategy<Ascii>;
-}
-
-impl Arbitrary for GameCfg {
-    type Parameters = ();
-
-    fn arbitrary_with(_args: <Self as Arbitrary>::Parameters) -> <Self as Arbitrary>::Strategy {
-        use crate::server::coretypes::GameCfg::*;
-        (0..10).no_shrink().prop_flat_map(|i| {
-            proto_msg_match!(i, def = FeatureSize(0),
-            0 => FeatureSize(u32),
-            1 => MapType(Ascii),
-            2 => MapGenerator(u32),
-            3 => MazeSize(u32),
-            4 => Seed(Ascii),
-            5 => Template(u32),
-            6 => Ammo(Ascii, Option<Ascii>),
-            7 => Scheme(Ascii, Vec<Ascii>),
-            8 => Script(Ascii),
-            9 => Theme(Ascii),
-            10 => DrawnMap(Ascii))
-        }).boxed()
-    }
-
-    type Strategy = BoxedStrategy<GameCfg>;
-}
-
-impl Arbitrary for TeamInfo {
-    type Parameters = ();
-
-    fn arbitrary_with(_args: <Self as Arbitrary>::Parameters) -> <Self as Arbitrary>::Strategy {
-        ("[a-z]+", 0u8..127u8, "[a-z]+", "[a-z]+", "[a-z]+", "[a-z]+",  0u8..127u8)
-            .prop_map(|(name, color, grave, fort, voice_pack, flag, difficulty)| {
-                fn hog(n: u8) -> HedgehogInfo {
-                    HedgehogInfo { name: format!("hog{}", n), hat: format!("hat{}", n)}
-                }
-                let hedgehogs = [hog(1), hog(2), hog(3), hog(4), hog(5), hog(6), hog(7), hog(8)];
-                TeamInfo {
-                    name, color, grave, fort,
-                    voice_pack, flag,difficulty,
-                    hedgehogs, hedgehogs_number: 0
-                }
-            }).boxed()
-    }
-
-    type Strategy = BoxedStrategy<TeamInfo>;
-}
-
-pub fn gen_proto_msg() -> BoxedStrategy<HWProtocolMessage> where {
-    let res = (0..58).no_shrink().prop_flat_map(|i| {
-        proto_msg_match!(i, def = Malformed,
-        0 => Ping(),
-        1 => Pong(),
-        2 => Quit(Option<Ascii>),
-        //3 => Cmd
-        4 => Global(Ascii),
-        5 => Watch(Ascii),
-        6 => ToggleServerRegisteredOnly(),
-        7 => SuperPower(),
-        8 => Info(Ascii),
-        9 => Nick(Ascii),
-        10 => Proto(u16),
-        11 => Password(Ascii, Ascii),
-        12 => Checker(u16, Ascii, Ascii),
-        13 => List(),
-        14 => Chat(Ascii),
-        15 => CreateRoom(Ascii, Option<Ascii>),
-        16 => JoinRoom(Ascii, Option<Ascii>),
-        17 => Follow(Ascii),
-        18 => Rnd(Vec<Ascii>),
-        19 => Kick(Ascii),
-        20 => Ban(Ascii, Ascii, u32),
-        21 => BanIP(Ascii, Ascii, u32),
-        22 => BanNick(Ascii, Ascii, u32),
-        23 => BanList(),
-        24 => Unban(Ascii),
-        //25 => SetServerVar(ServerVar),
-        26 => GetServerVar(),
-        27 => RestartServer(),
-        28 => Stats(),
-        29 => Part(Option<Ascii>),
-        30 => Cfg(GameCfg),
-        31 => AddTeam(Box<TeamInfo>),
-        32 => RemoveTeam(Ascii),
-        33 => SetHedgehogsNumber(Ascii, u8),
-        34 => SetTeamColor(Ascii, u8),
-        35 => ToggleReady(),
-        36 => StartGame(),
-        37 => EngineMessage(Ascii),
-        38 => RoundFinished(),
-        39 => ToggleRestrictJoin(),
-        40 => ToggleRestrictTeams(),
-        41 => ToggleRegisteredOnly(),
-        42 => RoomName(Ascii),
-        43 => Delegate(Ascii),
-        44 => TeamChat(Ascii),
-        45 => MaxTeams(u8),
-        46 => Fix(),
-        47 => Unfix(),
-        48 => Greeting(Ascii),
-        //49 => CallVote(Option<(String, Option<String>)>),
-        50 => Vote(bool),
-        51 => ForceVote(bool),
-        52 => Save(Ascii, Ascii),
-        53 => Delete(Ascii),
-        54 => SaveRoom(Ascii),
-        55 => LoadRoom(Ascii),
-        56 => Malformed(),
-        57 => Empty()
-    )});
-    res.boxed()
-}
--- a/gameServer2/src/server/actions.rs	Mon Jan 14 15:11:15 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,631 +0,0 @@
-use std::{
-    io, io::Write,
-    iter::once,
-    mem::replace
-};
-use super::{
-    server::HWServer,
-    room::{GameInfo, RoomFlags},
-    client::HWClient,
-    coretypes::{ClientId, RoomId, GameCfg, VoteType},
-    room::HWRoom,
-    handlers
-};
-use crate::{
-    protocol::messages::{
-        HWProtocolMessage,
-        HWServerMessage,
-        HWServerMessage::*,
-        server_chat
-    },
-    utils::to_engine_msg
-};
-use rand::{thread_rng, Rng, distributions::Uniform};
-
-pub enum Destination {
-    ToId(ClientId),
-    ToSelf,
-    ToAll {
-        room_id: Option<RoomId>,
-        protocol: Option<u16>,
-        skip_self: bool
-    }
-}
-
-pub struct PendingMessage {
-    pub destination: Destination,
-    pub message: HWServerMessage
-}
-
-impl PendingMessage {
-    pub fn send(message: HWServerMessage, client_id: ClientId) -> PendingMessage {
-        PendingMessage{ destination: Destination::ToId(client_id), message}
-    }
-
-    pub fn send_self(message: HWServerMessage) -> PendingMessage {
-        PendingMessage{ destination: Destination::ToSelf, message }
-    }
-
-    pub fn send_all(message: HWServerMessage) -> PendingMessage {
-        let destination = Destination::ToAll {
-            room_id: None,
-            protocol: None,
-            skip_self: false,
-        };
-        PendingMessage{ destination, message }
-    }
-
-    pub fn in_room(mut self, clients_room_id: RoomId) -> PendingMessage {
-        if let Destination::ToAll {ref mut room_id, ..} = self.destination {
-            *room_id = Some(clients_room_id)
-        }
-        self
-    }
-
-    pub fn with_protocol(mut self, protocol_number: u16) -> PendingMessage {
-        if let Destination::ToAll {ref mut protocol, ..} = self.destination {
-            *protocol = Some(protocol_number)
-        }
-        self
-    }
-
-    pub fn but_self(mut self) -> PendingMessage {
-        if let Destination::ToAll {ref mut skip_self, ..} = self.destination {
-            *skip_self = true
-        }
-        self
-    }
-
-    pub fn action(self) -> Action { Send(self) }
-}
-
-impl Into<Action> for PendingMessage {
-    fn into(self) -> Action { self.action() }
-}
-
-impl HWServerMessage {
-    pub fn send(self, client_id: ClientId) -> PendingMessage { PendingMessage::send(self, client_id) }
-    pub fn send_self(self) -> PendingMessage { PendingMessage::send_self(self) }
-    pub fn send_all(self) -> PendingMessage { PendingMessage::send_all(self) }
-}
-
-pub enum Action {
-    Send(PendingMessage),
-    RemoveClient,
-    ByeClient(String),
-    ReactProtocolMessage(HWProtocolMessage),
-    CheckRegistered,
-    JoinLobby,
-    AddRoom(String, Option<String>),
-    RemoveRoom(RoomId),
-    MoveToRoom(RoomId),
-    MoveToLobby(String),
-    ChangeMaster(RoomId, Option<ClientId>),
-    RemoveTeam(String),
-    RemoveClientTeams,
-    SendRoomUpdate(Option<String>),
-    StartRoomGame(RoomId),
-    SendTeamRemovalMessage(String),
-    FinishRoomGame(RoomId),
-    SendRoomData{to: ClientId, teams: bool, config: bool, flags: bool},
-    AddVote{vote: bool, is_forced: bool},
-    ApplyVoting(VoteType, RoomId),
-    Warn(String),
-    ProtocolError(String)
-}
-
-use self::Action::*;
-
-pub fn run_action(server: &mut HWServer, client_id: usize, action: Action) {
-    match action {
-        Send(msg) => server.send(client_id, &msg.destination, msg.message),
-        ByeClient(msg) => {
-            let c = &server.clients[client_id];
-            let nick = c.nick.clone();
-
-            if let Some(id) = c.room_id{
-                if id != server.lobby_id {
-                    server.react(client_id, vec![
-                        MoveToLobby(format!("quit: {}", msg.clone()))]);
-                }
-            }
-
-            server.react(client_id, vec![
-                LobbyLeft(nick, msg.clone()).send_all().action(),
-                Bye(msg).send_self().action(),
-                RemoveClient]);
-        },
-        RemoveClient => {
-            server.removed_clients.push(client_id);
-            if server.clients.contains(client_id) {
-                server.clients.remove(client_id);
-            }
-        },
-        ReactProtocolMessage(msg) =>
-            handlers::handle(server, client_id, msg),
-        CheckRegistered => {
-            let client = &server.clients[client_id];
-            if client.protocol_number > 0 && client.nick != "" {
-                let has_nick_clash = server.clients.iter().any(
-                    |(id, c)| id != client_id && c.nick == client.nick);
-
-                let actions = if !client.is_checker() && has_nick_clash {
-                    if client.protocol_number < 38 {
-                        vec![ByeClient("Nickname is already in use".to_string())]
-                    } else {
-                        server.clients[client_id].nick.clear();
-                        vec![Notice("NickAlreadyInUse".to_string()).send_self().action()]
-                    }
-                } else {
-                    vec![JoinLobby]
-                };
-                server.react(client_id, actions);
-            }
-        },
-        JoinLobby => {
-            server.clients[client_id].room_id = Some(server.lobby_id);
-
-            let mut lobby_nicks = Vec::new();
-            for (_, c) in server.clients.iter() {
-                if c.room_id.is_some() {
-                    lobby_nicks.push(c.nick.clone());
-                }
-            }
-            let joined_msg = LobbyJoined(lobby_nicks);
-
-            let everyone_msg = LobbyJoined(vec![server.clients[client_id].nick.clone()]);
-            let flags_msg = ClientFlags(
-                "+i".to_string(),
-                server.clients.iter()
-                    .filter(|(_, c)| c.room_id.is_some())
-                    .map(|(_, c)| c.nick.clone())
-                    .collect());
-            let server_msg = ServerMessage("\u{1f994} is watching".to_string());
-            let rooms_msg = Rooms(server.rooms.iter()
-                .filter(|(id, _)| *id != server.lobby_id)
-                .flat_map(|(_, r)|
-                    r.info(r.master_id.map(|id| &server.clients[id])))
-                .collect());
-            server.react(client_id, vec![
-                everyone_msg.send_all().but_self().action(),
-                joined_msg.send_self().action(),
-                flags_msg.send_self().action(),
-                server_msg.send_self().action(),
-                rooms_msg.send_self().action(),
-                ]);
-        },
-        AddRoom(name, password) => {
-            let room_id = server.add_room();;
-
-            let r = &mut server.rooms[room_id];
-            let c = &mut server.clients[client_id];
-            r.master_id = Some(c.id);
-            r.name = name;
-            r.password = password;
-            r.protocol_number = c.protocol_number;
-
-            let actions = vec![
-                RoomAdd(r.info(Some(&c))).send_all()
-                    .with_protocol(r.protocol_number).action(),
-                MoveToRoom(room_id)];
-
-            server.react(client_id, actions);
-        },
-        RemoveRoom(room_id) => {
-            let r = &mut server.rooms[room_id];
-            let actions = vec![RoomRemove(r.name.clone()).send_all()
-                .with_protocol(r.protocol_number).action()];
-            server.rooms.remove(room_id);
-            server.react(client_id, actions);
-        }
-        MoveToRoom(room_id) => {
-            let r = &mut server.rooms[room_id];
-            let c = &mut server.clients[client_id];
-            r.players_number += 1;
-            c.room_id = Some(room_id);
-
-            let is_master = r.master_id == Some(c.id);
-            c.set_is_master(is_master);
-            c.set_is_ready(is_master);
-            c.set_is_joined_mid_game(false);
-
-            if is_master {
-                r.ready_players_number += 1;
-            }
-
-            let mut v = vec![
-                RoomJoined(vec![c.nick.clone()]).send_all().in_room(room_id).action(),
-                ClientFlags("+i".to_string(), vec![c.nick.clone()]).send_all().action(),
-                SendRoomUpdate(None)];
-
-            if !r.greeting.is_empty() {
-                v.push(ChatMsg {nick: "[greeting]".to_string(), msg: r.greeting.clone()}
-                    .send_self().action());
-            }
-
-            if !c.is_master() {
-                let team_names: Vec<_>;
-                if let Some(ref mut info) = r.game_info {
-                    c.set_is_in_game(true);
-                    c.set_is_joined_mid_game(true);
-
-                    {
-                        let teams = info.client_teams(c.id);
-                        c.teams_in_game = teams.clone().count() as u8;
-                        c.clan = teams.clone().next().map(|t| t.color);
-                        team_names = teams.map(|t| t.name.clone()).collect();
-                    }
-
-                    if !team_names.is_empty() {
-                        info.left_teams.retain(|name|
-                            !team_names.contains(&name));
-                        info.teams_in_game += team_names.len() as u8;
-                        r.teams = info.teams_at_start.iter()
-                            .filter(|(_, t)| !team_names.contains(&t.name))
-                            .cloned().collect();
-                    }
-                } else {
-                    team_names = Vec::new();
-                }
-
-                v.push(SendRoomData{ to: client_id, teams: true, config: true, flags: true});
-
-                if let Some(ref info) = r.game_info {
-                    v.push(RunGame.send_self().action());
-                    v.push(ClientFlags("+g".to_string(), vec![c.nick.clone()])
-                        .send_all().in_room(r.id).action());
-                    v.push(ForwardEngineMessage(
-                        vec![to_engine_msg("e$spectate 1".bytes())])
-                        .send_self().action());
-                    v.push(ForwardEngineMessage(info.msg_log.clone())
-                        .send_self().action());
-
-                    for name in &team_names {
-                        v.push(ForwardEngineMessage(
-                            vec![to_engine_msg(once(b'G').chain(name.bytes()))])
-                            .send_all().in_room(r.id).action());
-                    }
-                    if info.is_paused {
-                        v.push(ForwardEngineMessage(vec![to_engine_msg(once(b'I'))])
-                            .send_all().in_room(r.id).action())
-                    }
-                }
-            }
-            server.react(client_id, v);
-        }
-        SendRoomData {to, teams, config, flags} => {
-            let mut actions = Vec::new();
-            let room_id = server.clients[client_id].room_id;
-            if let Some(r) = room_id.and_then(|id| server.rooms.get(id)) {
-                if config {
-                    actions.push(ConfigEntry("FULLMAPCONFIG".to_string(), r.map_config())
-                        .send(to).action());
-                    for cfg in r.game_config() {
-                        actions.push(cfg.to_server_msg().send(to).action());
-                    }
-                }
-                if teams {
-                    let current_teams = match r.game_info {
-                        Some(ref info) => &info.teams_at_start,
-                        None => &r.teams
-                    };
-                    for (owner_id, team) in current_teams.iter() {
-                        actions.push(TeamAdd(HWRoom::team_info(&server.clients[*owner_id], &team))
-                            .send(to).action());
-                        actions.push(TeamColor(team.name.clone(), team.color)
-                            .send(to).action());
-                        actions.push(HedgehogsNumber(team.name.clone(), team.hedgehogs_number)
-                            .send(to).action());
-                    }
-                }
-                if flags {
-                    if let Some(id) = r.master_id {
-                        actions.push(ClientFlags("+h".to_string(), vec![server.clients[id].nick.clone()])
-                            .send(to).action());
-                    }
-                    let nicks: Vec<_> = server.clients.iter()
-                        .filter(|(_, c)| c.room_id == Some(r.id) && c.is_ready())
-                        .map(|(_, c)| c.nick.clone()).collect();
-                    if !nicks.is_empty() {
-                        actions.push(ClientFlags("+r".to_string(), nicks)
-                            .send(to).action());
-                    }
-                }
-            }
-            server.react(client_id, actions);
-        }
-        AddVote{vote, is_forced} => {
-            let mut actions = Vec::new();
-            if let Some(r) = server.room(client_id) {
-                let mut result = None;
-                if let Some(ref mut voting) = r.voting {
-                    if is_forced || voting.votes.iter().all(|(id, _)| client_id != *id) {
-                        actions.push(server_chat("Your vote has been counted.".to_string())
-                            .send_self().action());
-                        voting.votes.push((client_id, vote));
-                        let i = voting.votes.iter();
-                        let pro = i.clone().filter(|(_, v)| *v).count();
-                        let contra = i.filter(|(_, v)| !*v).count();
-                        let success_quota = voting.voters.len() / 2 + 1;
-                        if is_forced && vote || pro >= success_quota {
-                            result = Some(true);
-                        } else if is_forced && !vote || contra > voting.voters.len() - success_quota {
-                            result = Some(false);
-                        }
-                    } else {
-                        actions.push(server_chat("You already have voted.".to_string())
-                            .send_self().action());
-                    }
-                } else {
-                    actions.push(server_chat("There's no voting going on.".to_string())
-                        .send_self().action());
-                }
-
-                if let Some(res) = result {
-                    actions.push(server_chat("Voting closed.".to_string())
-                        .send_all().in_room(r.id).action());
-                    let voting = replace(&mut r.voting, None).unwrap();
-                    if res {
-                        actions.push(ApplyVoting(voting.kind, r.id));
-                    }
-                }
-            }
-
-            server.react(client_id, actions);
-        }
-        ApplyVoting(kind, room_id) => {
-            let mut actions = Vec::new();
-            let mut id = client_id;
-            match kind {
-                VoteType::Kick(nick) => {
-                    if let Some(c) = server.find_client(&nick) {
-                        if c.room_id == Some(room_id) {
-                            id = c.id;
-                            actions.push(Kicked.send_self().action());
-                            actions.push(MoveToLobby("kicked".to_string()));
-                        }
-                    }
-                },
-                VoteType::Map(None) => (),
-                VoteType::Map(Some(name)) => {
-                    if let Some(location) = server.rooms[room_id].load_config(&name) {
-                        actions.push(server_chat(location.to_string())
-                            .send_all().in_room(room_id).action());
-                        actions.push(SendRoomUpdate(None));
-                        for (_, c) in server.clients.iter() {
-                            if c.room_id == Some(room_id) {
-                               actions.push(SendRoomData{
-                                   to: c.id, teams: false,
-                                   config: true, flags: false})
-                            }
-                        }
-                    }
-                },
-                VoteType::Pause => {
-                    if let Some(ref mut info) = server.rooms[room_id].game_info {
-                        info.is_paused = !info.is_paused;
-                        actions.push(server_chat("Pause toggled.".to_string())
-                            .send_all().in_room(room_id).action());
-                        actions.push(ForwardEngineMessage(vec![to_engine_msg(once(b'I'))])
-                            .send_all().in_room(room_id).action());
-                    }
-                },
-                VoteType::NewSeed => {
-                    let seed = thread_rng().gen_range(0, 1_000_000_000).to_string();
-                    let cfg = GameCfg::Seed(seed);
-                    actions.push(cfg.to_server_msg().send_all().in_room(room_id).action());
-                    server.rooms[room_id].set_config(cfg);
-                },
-                VoteType::HedgehogsPerTeam(number) => {
-                    let r = &mut server.rooms[room_id];
-                    let nicks = r.set_hedgehogs_number(number);
-                    actions.extend(nicks.into_iter().map(|n|
-                        HedgehogsNumber(n, number).send_all().in_room(room_id).action()
-                    ));
-                },
-            }
-            server.react(id, actions);
-        }
-        MoveToLobby(msg) => {
-            let mut actions = Vec::new();
-            let lobby_id = server.lobby_id;
-            if let (c, Some(r)) = server.client_and_room(client_id) {
-                r.players_number -= 1;
-                if c.is_ready() && r.ready_players_number > 0 {
-                    r.ready_players_number -= 1;
-                }
-                if c.is_master() && (r.players_number > 0 || r.is_fixed()) {
-                    actions.push(ChangeMaster(r.id, None));
-                }
-                actions.push(ClientFlags("-i".to_string(), vec![c.nick.clone()])
-                    .send_all().action());
-            }
-            server.react(client_id, actions);
-            actions = Vec::new();
-
-            if let (c, Some(r)) = server.client_and_room(client_id) {
-                c.room_id = Some(lobby_id);
-                if r.players_number == 0 && !r.is_fixed() {
-                    actions.push(RemoveRoom(r.id));
-                } else {
-                    actions.push(RemoveClientTeams);
-                    actions.push(RoomLeft(c.nick.clone(), msg)
-                        .send_all().in_room(r.id).but_self().action());
-                    actions.push(SendRoomUpdate(Some(r.name.clone())));
-                }
-            }
-            server.react(client_id, actions)
-        }
-        ChangeMaster(room_id, new_id) => {
-            let mut actions = Vec::new();
-            let room_client_ids = server.room_clients(room_id);
-            let new_id = if server.room(client_id).map(|r| r.is_fixed()).unwrap_or(false) {
-                new_id
-            } else {
-                new_id.or_else(||
-                    room_client_ids.iter().find(|id| **id != client_id).cloned())
-            };
-            let new_nick = new_id.map(|id| server.clients[id].nick.clone());
-
-            if let (c, Some(r)) = server.client_and_room(client_id) {
-                match r.master_id {
-                    Some(id) if id == c.id => {
-                        c.set_is_master(false);
-                        r.master_id = None;
-                        actions.push(ClientFlags("-h".to_string(), vec![c.nick.clone()])
-                            .send_all().in_room(r.id).action());
-                    }
-                    Some(_) => unreachable!(),
-                    None => {}
-                }
-                r.master_id = new_id;
-                if !r.is_fixed() && c.protocol_number < 42 {
-                    r.name.replace_range(.., new_nick.as_ref().map_or("[]", String::as_str));
-                }
-                r.set_join_restriction(false);
-                r.set_team_add_restriction(false);
-                let is_fixed = r.is_fixed();
-                r.set_unregistered_players_restriction(is_fixed);
-                if let Some(nick) = new_nick {
-                    actions.push(ClientFlags("+h".to_string(), vec![nick])
-                        .send_all().in_room(r.id).action());
-                }
-            }
-            if let Some(id) = new_id {
-                server.clients[id].set_is_master(true)
-            }
-            server.react(client_id, actions);
-        }
-        RemoveTeam(name) => {
-            let mut actions = Vec::new();
-            if let (c, Some(r)) = server.client_and_room(client_id) {
-                r.remove_team(&name);
-                if let Some(ref mut info) = r.game_info {
-                    info.left_teams.push(name.clone());
-                }
-                actions.push(TeamRemove(name.clone()).send_all().in_room(r.id).action());
-                actions.push(SendRoomUpdate(None));
-                if r.game_info.is_some() && c.is_in_game() {
-                    actions.push(SendTeamRemovalMessage(name));
-                }
-            }
-            server.react(client_id, actions);
-        },
-        RemoveClientTeams => {
-            if let (c, Some(r)) = server.client_and_room(client_id) {
-                let actions = r.client_teams(c.id).map(|t| RemoveTeam(t.name.clone())).collect();
-                server.react(client_id, actions);
-            }
-        }
-        SendRoomUpdate(old_name) => {
-            if let (c, Some(r)) = server.client_and_room(client_id) {
-                let name = old_name.unwrap_or_else(|| r.name.clone());
-                let actions = vec![RoomUpdated(name, r.info(Some(&c)))
-                    .send_all().with_protocol(r.protocol_number).action()];
-                server.react(client_id, actions);
-            }
-        },
-        StartRoomGame(room_id) => {
-            let actions = {
-                let (room_clients, room_nicks): (Vec<_>, Vec<_>) = server.clients.iter()
-                    .map(|(id, c)| (id, c.nick.clone())).unzip();
-                let room = &mut server.rooms[room_id];
-
-                if !room.has_multiple_clans() {
-                    vec![Warn("The game can't be started with less than two clans!".to_string())]
-                } else if room.protocol_number <= 43 && room.players_number != room.ready_players_number {
-                    vec![Warn("Not all players are ready".to_string())]
-                } else if room.game_info.is_some() {
-                    vec![Warn("The game is already in progress".to_string())]
-                } else {
-                    room.start_round();
-                    for id in room_clients {
-                        let c = &mut server.clients[id];
-                        c.set_is_in_game(false);
-                        c.team_indices = room.client_team_indices(c.id);
-                    }
-                    vec![RunGame.send_all().in_room(room.id).action(),
-                         SendRoomUpdate(None),
-                         ClientFlags("+g".to_string(), room_nicks)
-                             .send_all().in_room(room.id).action()]
-                }
-            };
-            server.react(client_id, actions);
-        }
-        SendTeamRemovalMessage(team_name) => {
-            let mut actions = Vec::new();
-            if let Some(r) = server.room(client_id) {
-                if let Some(ref mut info) = r.game_info {
-                    let msg = once(b'F').chain(team_name.bytes());
-                    actions.push(ForwardEngineMessage(vec![to_engine_msg(msg)]).
-                        send_all().in_room(r.id).but_self().action());
-                    info.teams_in_game -= 1;
-                    if info.teams_in_game == 0 {
-                        actions.push(FinishRoomGame(r.id));
-                    }
-                    let remove_msg = to_engine_msg(once(b'F').chain(team_name.bytes()));
-                    if let Some(m) = &info.sync_msg {
-                        info.msg_log.push(m.clone());
-                    }
-                    if info.sync_msg.is_some() {
-                        info.sync_msg = None
-                    }
-                    info.msg_log.push(remove_msg.clone());
-                    actions.push(ForwardEngineMessage(vec![remove_msg])
-                        .send_all().in_room(r.id).but_self().action());
-                }
-            }
-            server.react(client_id, actions);
-        }
-        FinishRoomGame(room_id) => {
-            let mut actions = Vec::new();
-
-            let r = &mut server.rooms[room_id];
-            r.ready_players_number = 1;
-            actions.push(SendRoomUpdate(None));
-            actions.push(RoundFinished.send_all().in_room(r.id).action());
-
-            if let Some(info) = replace(&mut r.game_info, None) {
-                for (_, c) in server.clients.iter() {
-                    if c.room_id == Some(room_id) && c.is_joined_mid_game() {
-                        actions.push(SendRoomData{
-                            to: c.id, teams: false,
-                            config: true, flags: false});
-                        for name in &info.left_teams {
-                            actions.push(TeamRemove(name.clone())
-                                .send(c.id).action());
-                        }
-                    }
-                }
-            }
-
-            let nicks: Vec<_> = server.clients.iter_mut()
-                .filter(|(_, c)| c.room_id == Some(room_id))
-                .map(|(_, c)| {
-                    c.set_is_ready(c.is_master());
-                    c.set_is_joined_mid_game(false);
-                    c
-                }).filter_map(|c| if !c.is_master() {
-                    Some(c.nick.clone())
-                } else {
-                    None
-                }).collect();
-
-            if !nicks.is_empty() {
-                let msg = if r.protocol_number < 38 {
-                    LegacyReady(false, nicks)
-                } else {
-                    ClientFlags("-r".to_string(), nicks)
-                };
-                actions.push(msg.send_all().in_room(room_id).action());
-            }
-            server.react(client_id, actions);
-        }
-        Warn(msg) => {
-            run_action(server, client_id, Warning(msg).send_self().action());
-        }
-        ProtocolError(msg) => {
-            run_action(server, client_id, Error(msg).send_self().action())
-        }
-    }
-}
--- a/gameServer2/src/server/client.rs	Mon Jan 14 15:11:15 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-use super::coretypes::ClientId;
-use bitflags::*;
-
-bitflags!{
-    pub struct ClientFlags: u8 {
-        const IS_ADMIN = 0b0000_0001;
-        const IS_MASTER = 0b0000_0010;
-        const IS_READY = 0b0000_0100;
-        const IS_IN_GAME = 0b0000_1000;
-        const IS_JOINED_MID_GAME = 0b0001_0000;
-        const IS_CHECKER = 0b0010_0000;
-
-        const NONE = 0b0000_0000;
-        const DEFAULT = Self::NONE.bits;
-    }
-}
-
-pub struct HWClient {
-    pub id: ClientId,
-    pub room_id: Option<usize>,
-    pub nick: String,
-    pub web_password: String,
-    pub server_salt: String,
-    pub protocol_number: u16,
-    pub flags: ClientFlags,
-    pub teams_in_game: u8,
-    pub team_indices: Vec<u8>,
-    pub clan: Option<u8>
-}
-
-impl HWClient {
-    pub fn new(id: ClientId, salt: String) -> HWClient {
-        HWClient {
-            id,
-            room_id: None,
-            nick: String::new(),
-            web_password: String::new(),
-            server_salt: salt,
-            protocol_number: 0,
-            flags: ClientFlags::DEFAULT,
-            teams_in_game: 0,
-            team_indices: Vec::new(),
-            clan: None,
-        }
-    }
-
-    fn contains(& self, mask: ClientFlags) -> bool {
-        self.flags.contains(mask)
-    }
-
-    fn set(&mut self, mask: ClientFlags, value: bool) {
-        self.flags.set(mask, value);
-    }
-
-    pub fn is_admin(&self)-> bool { self.contains(ClientFlags::IS_ADMIN) }
-    pub fn is_master(&self)-> bool { self.contains(ClientFlags::IS_MASTER) }
-    pub fn is_ready(&self)-> bool { self.contains(ClientFlags::IS_READY) }
-    pub fn is_in_game(&self)-> bool { self.contains(ClientFlags::IS_IN_GAME) }
-    pub fn is_joined_mid_game(&self)-> bool { self.contains(ClientFlags::IS_JOINED_MID_GAME) }
-    pub fn is_checker(&self)-> bool { self.contains(ClientFlags::IS_CHECKER) }
-
-    pub fn set_is_admin(&mut self, value: bool) { self.set(ClientFlags::IS_ADMIN, value) }
-    pub fn set_is_master(&mut self, value: bool) { self.set(ClientFlags::IS_MASTER, value) }
-    pub fn set_is_ready(&mut self, value: bool) { self.set(ClientFlags::IS_READY, value) }
-    pub fn set_is_in_game(&mut self, value: bool) { self.set(ClientFlags::IS_IN_GAME, value) }
-    pub fn set_is_joined_mid_game(&mut self, value: bool) { self.set(ClientFlags::IS_JOINED_MID_GAME, value) }
-    pub fn set_is_checker(&mut self, value: bool) { self.set(ClientFlags::IS_CHECKER, value) }
-}
\ No newline at end of file
--- a/gameServer2/src/server/coretypes.rs	Mon Jan 14 15:11:15 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,72 +0,0 @@
-pub type ClientId = usize;
-pub type RoomId = usize;
-
-pub const MAX_HEDGEHOGS_PER_TEAM: u8 = 8;
-
-#[derive(PartialEq, Eq, Clone, Debug)]
-pub enum ServerVar {
-    MOTDNew(String),
-    MOTDOld(String),
-    LatestProto(u32),
-}
-
-#[derive(PartialEq, Eq, Clone, Debug)]
-pub enum GameCfg {
-    FeatureSize(u32),
-    MapType(String),
-    MapGenerator(u32),
-    MazeSize(u32),
-    Seed(String),
-    Template(u32),
-
-    Ammo(String, Option<String>),
-    Scheme(String, Vec<String>),
-    Script(String),
-    Theme(String),
-    DrawnMap(String)
-}
-
-#[derive(PartialEq, Eq, Clone, Debug)]
-pub struct TeamInfo {
-    pub name: String,
-    pub color: u8,
-    pub grave: String,
-    pub fort: String,
-    pub voice_pack: String,
-    pub flag: String,
-    pub difficulty: u8,
-    pub hedgehogs_number: u8,
-    pub hedgehogs: [HedgehogInfo; MAX_HEDGEHOGS_PER_TEAM as usize],
-}
-
-#[derive(PartialEq, Eq, Clone, Debug)]
-pub struct HedgehogInfo {
-    pub name: String,
-    pub hat: String,
-}
-
-#[derive(PartialEq, Eq, Clone, Debug)]
-pub enum VoteType {
-    Kick(String),
-    Map(Option<String>),
-    Pause,
-    NewSeed,
-    HedgehogsPerTeam(u8)
-}
-
-#[derive(Clone, Debug)]
-pub struct Voting {
-    pub ttl: u32,
-    pub voters: Vec<ClientId>,
-    pub votes: Vec<(ClientId, bool)>,
-    pub kind: VoteType
-}
-
-impl Voting {
-    pub fn new(kind: VoteType, voters: Vec<ClientId>) -> Voting {
-        Voting {
-            kind, voters, ttl: 2,
-            votes: Vec::new()
-        }
-    }
-}
\ No newline at end of file
--- a/gameServer2/src/server/handlers/checker.rs	Mon Jan 14 15:11:15 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-use mio;
-use log::*;
-
-use crate::{
-    server::{
-        server::HWServer,
-        coretypes::ClientId,
-    },
-    protocol::messages::{
-        HWProtocolMessage
-    },
-};
-
-pub fn handle(server: & mut HWServer, client_id: ClientId, message: HWProtocolMessage) {
-    match message {
-        _ => warn!("Unknown command"),
-    }
-}
--- a/gameServer2/src/server/handlers/common.rs	Mon Jan 14 15:11:15 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-use crate::{
-    server::{actions::Action, server::HWServer},
-    protocol::messages::{
-        HWProtocolMessage::{self, Rnd}, HWServerMessage::{self, ChatMsg},
-    }
-};
-use rand::{self, Rng, thread_rng};
-
-pub fn rnd_reply(options: &[String]) -> HWServerMessage {
-    let mut rng = thread_rng();
-    let reply = if options.is_empty() {
-        (*rng.choose(&["heads", "tails"]).unwrap()).to_owned()
-    } else {
-        rng.choose(&options).unwrap().clone()
-    };
-
-    ChatMsg {
-        nick: "[random]".to_owned(),
-        msg: reply.clone(),
-    }
-}
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-    use crate::protocol::messages::HWServerMessage::ChatMsg;
-    use crate::server::actions::{
-        Action::{self, Send}, PendingMessage,
-    };
-
-    fn reply2string(r: HWServerMessage) -> String {
-        match r {
-            ChatMsg { msg: p, .. } => String::from(p),
-            _ => panic!("expected a ChatMsg"),
-        }
-    }
-
-    fn run_handle_test(opts: Vec<String>) {
-        let opts2 = opts.clone();
-        for opt in opts {
-            while reply2string(rnd_reply(&opts2)) != opt {}
-        }
-    }
-
-    /// This test terminates almost surely.
-    #[test]
-    fn test_handle_rnd_empty() {
-        run_handle_test(vec![])
-    }
-
-    /// This test terminates almost surely.
-    #[test]
-    fn test_handle_rnd_nonempty() {
-        run_handle_test(vec!["A".to_owned(), "B".to_owned(), "C".to_owned()])
-    }
-
-    /// This test terminates almost surely (strong law of large numbers)
-    #[test]
-    fn test_distribution() {
-        let eps = 0.000001;
-        let lim = 0.5;
-        let opts = vec![0.to_string(), 1.to_string()];
-        let mut ones = 0;
-        let mut tries = 0;
-
-        while tries < 1000 || ((ones as f64 / tries as f64) - lim).abs() >= eps {
-            tries += 1;
-            if reply2string(rnd_reply(&opts)) == 1.to_string() {
-                ones += 1;
-            }
-        }
-    }
-}
--- a/gameServer2/src/server/handlers/inroom.rs	Mon Jan 14 15:11:15 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,499 +0,0 @@
-use mio;
-
-use crate::{
-    server::{
-        coretypes::{
-            ClientId, RoomId, Voting, VoteType, GameCfg,
-            MAX_HEDGEHOGS_PER_TEAM
-        },
-        server::HWServer,
-        room::{HWRoom, RoomFlags},
-        actions::{Action, Action::*}
-    },
-    protocol::messages::{
-        HWProtocolMessage,
-        HWServerMessage::*,
-        server_chat
-    },
-    utils::is_name_illegal
-};
-use std::{
-    mem::swap, fs::{File, OpenOptions},
-    io::{Read, Write, Result, Error, ErrorKind}
-};
-use base64::{encode, decode};
-use super::common::rnd_reply;
-use log::*;
-
-#[derive(Clone)]
-struct ByMsg<'a> {
-    messages: &'a[u8]
-}
-
-impl <'a> Iterator for ByMsg<'a> {
-    type Item = &'a[u8];
-
-    fn next(&mut self) -> Option<<Self as Iterator>::Item> {
-        if let Some(size) = self.messages.get(0) {
-            let (msg, next) = self.messages.split_at(*size as usize + 1);
-            self.messages = next;
-            Some(msg)
-        } else {
-            None
-        }
-    }
-}
-
-fn by_msg(source: &[u8]) -> ByMsg {
-    ByMsg {messages: source}
-}
-
-const VALID_MESSAGES: &[u8] =
-    b"M#+LlRrUuDdZzAaSjJ,NpPwtgfhbc12345\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A";
-const NON_TIMED_MESSAGES: &[u8] = b"M#hb";
-
-#[cfg(canhazslicepatterns)]
-fn is_msg_valid(msg: &[u8], team_indices: &[u8]) -> bool {
-    match msg {
-        [size, typ, body..] => VALID_MESSAGES.contains(typ)
-            && match body {
-                [1...MAX_HEDGEHOGS_PER_TEAM, team, ..] if *typ == b'h' =>
-                    team_indices.contains(team),
-                _ => *typ != b'h'
-            },
-        _ => false
-    }
-}
-
-fn is_msg_valid(msg: &[u8], _team_indices: &[u8]) -> bool {
-    if let Some(typ) = msg.get(1) {
-        VALID_MESSAGES.contains(typ)
-    } else {
-        false
-    }
-}
-
-fn is_msg_empty(msg: &[u8]) -> bool {
-    msg.get(1).filter(|t| **t == b'+').is_some()
-}
-
-fn is_msg_timed(msg: &[u8]) -> bool {
-    msg.get(1).filter(|t| !NON_TIMED_MESSAGES.contains(t)).is_some()
-}
-
-fn voting_description(kind: &VoteType) -> String {
-    format!("New voting started: {}", match kind {
-        VoteType::Kick(nick) => format!("kick {}", nick),
-        VoteType::Map(name) => format!("map {}", name.as_ref().unwrap()),
-        VoteType::Pause => "pause".to_string(),
-        VoteType::NewSeed => "new seed".to_string(),
-        VoteType::HedgehogsPerTeam(number) => format!("hedgehogs per team: {}", number)
-    })
-}
-
-fn room_message_flag(msg: &HWProtocolMessage) -> RoomFlags {
-    use crate::protocol::messages::HWProtocolMessage::*;
-    match msg {
-        ToggleRestrictJoin => RoomFlags::RESTRICTED_JOIN,
-        ToggleRestrictTeams => RoomFlags::RESTRICTED_TEAM_ADD,
-        ToggleRegisteredOnly => RoomFlags::RESTRICTED_UNREGISTERED_PLAYERS,
-        _ => RoomFlags::empty()
-    }
-}
-
-fn read_file(filename: &str) -> Result<String> {
-    let mut reader = File::open(filename)?;
-    let mut result = String::new();
-    reader.read_to_string(&mut result)?;
-    Ok(result)
-}
-
-fn write_file(filename: &str, content: &str) -> Result<()> {
-    let mut writer = OpenOptions::new().create(true).write(true).open(filename)?;
-    writer.write_all(content.as_bytes())
-}
-
-pub fn handle(server: &mut HWServer, client_id: ClientId, room_id: RoomId, message: HWProtocolMessage) {
-    use crate::protocol::messages::HWProtocolMessage::*;
-    match message {
-        Part(None) => server.react(client_id, vec![
-            MoveToLobby("part".to_string())]),
-        Part(Some(msg)) => server.react(client_id, vec![
-            MoveToLobby(format!("part: {}", msg))]),
-        Chat(msg) => {
-            let actions = {
-                let c = &mut server.clients[client_id];
-                let chat_msg = ChatMsg {nick: c.nick.clone(), msg};
-                vec![chat_msg.send_all().in_room(room_id).but_self().action()]
-            };
-            server.react(client_id, actions);
-        },
-        Fix => {
-            if let (c, Some(r)) = server.client_and_room(client_id) {
-                if c.is_admin() { r.set_is_fixed(true) }
-            }
-        }
-        Unfix => {
-            if let (c, Some(r)) = server.client_and_room(client_id) {
-                if c.is_admin() { r.set_is_fixed(false) }
-            }
-        }
-        Greeting(text) => {
-            if let (c, Some(r)) = server.client_and_room(client_id) {
-                if c.is_admin() || c.is_master() && !r.is_fixed() {
-                    r.greeting = text
-                }
-            }
-        }
-        RoomName(new_name) => {
-            let actions =
-                if is_name_illegal(&new_name) {
-                    vec![Warn("Illegal room name! A room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}".to_string())]
-                } else if server.rooms[room_id].is_fixed() {
-                    vec![Warn("Access denied.".to_string())]
-                } else if server.has_room(&new_name) {
-                    vec![Warn("A room with the same name already exists.".to_string())]
-                } else {
-                    let mut old_name = new_name.clone();
-                    swap(&mut server.rooms[room_id].name, &mut old_name);
-                    vec![SendRoomUpdate(Some(old_name))]
-                };
-            server.react(client_id, actions);
-        },
-        ToggleReady => {
-            if let (c, Some(r)) = server.client_and_room(client_id) {
-                let flags = if c.is_ready() {
-                    r.ready_players_number -= 1;
-                    "-r"
-                } else {
-                    r.ready_players_number += 1;
-                    "+r"
-                };
-
-                let msg = if c.protocol_number < 38 {
-                    LegacyReady(c.is_ready(), vec![c.nick.clone()])
-                } else {
-                    ClientFlags(flags.to_string(), vec![c.nick.clone()])
-                };
-
-                let mut v = vec![msg.send_all().in_room(r.id).action()];
-
-                if r.is_fixed() && r.ready_players_number == r.players_number {
-                    v.push(StartRoomGame(r.id))
-                }
-
-                c.set_is_ready(!c.is_ready());
-                server.react(client_id, v);
-            }
-        }
-        AddTeam(info) => {
-            let mut actions = Vec::new();
-            if let (c, Some(r)) = server.client_and_room(client_id) {
-                if r.teams.len() >= r.team_limit as usize {
-                    actions.push(Warn("Too many teams!".to_string()))
-                } else if r.addable_hedgehogs() == 0 {
-                    actions.push(Warn("Too many hedgehogs!".to_string()))
-                } else if r.find_team(|t| t.name == info.name) != None {
-                    actions.push(Warn("There's already a team with same name in the list.".to_string()))
-                } else if r.game_info.is_some() {
-                    actions.push(Warn("Joining not possible: Round is in progress.".to_string()))
-                } else if r.is_team_add_restricted() {
-                    actions.push(Warn("This room currently does not allow adding new teams.".to_string()));
-                } else {
-                    let team = r.add_team(c.id, *info, c.protocol_number < 42);
-                    c.teams_in_game += 1;
-                    c.clan = Some(team.color);
-                    actions.push(TeamAccepted(team.name.clone())
-                        .send_self().action());
-                    actions.push(TeamAdd(HWRoom::team_info(&c, team))
-                        .send_all().in_room(room_id).but_self().action());
-                    actions.push(TeamColor(team.name.clone(), team.color)
-                        .send_all().in_room(room_id).action());
-                    actions.push(HedgehogsNumber(team.name.clone(), team.hedgehogs_number)
-                        .send_all().in_room(room_id).action());
-                    actions.push(SendRoomUpdate(None));
-                }
-            }
-            server.react(client_id, actions);
-        },
-        RemoveTeam(name) => {
-            let mut actions = Vec::new();
-            if let (c, Some(r)) = server.client_and_room(client_id) {
-                match r.find_team_owner(&name) {
-                    None =>
-                        actions.push(Warn("Error: The team you tried to remove does not exist.".to_string())),
-                    Some((id, _)) if id != client_id =>
-                        actions.push(Warn("You can't remove a team you don't own.".to_string())),
-                    Some((_, name)) => {
-                        c.teams_in_game -= 1;
-                        c.clan = r.find_team_color(c.id);
-                        actions.push(Action::RemoveTeam(name.to_string()));
-                    }
-                }
-            };
-            server.react(client_id, actions);
-        },
-        SetHedgehogsNumber(team_name, number) => {
-            if let (c, Some(r)) = server.client_and_room(client_id) {
-                let addable_hedgehogs = r.addable_hedgehogs();
-                let actions = if let Some((_, team)) = r.find_team_and_owner_mut(|t| t.name == team_name) {
-                    if !c.is_master() {
-                        vec![ProtocolError("You're not the room master!".to_string())]
-                    } else if number < 1 || number > MAX_HEDGEHOGS_PER_TEAM
-                           || number > addable_hedgehogs + team.hedgehogs_number {
-                        vec![HedgehogsNumber(team.name.clone(), team.hedgehogs_number)
-                            .send_self().action()]
-                    } else {
-                        team.hedgehogs_number = number;
-                        vec![HedgehogsNumber(team.name.clone(), number)
-                            .send_all().in_room(room_id).but_self().action()]
-                    }
-                } else {
-                    vec![(Warn("No such team.".to_string()))]
-                };
-                server.react(client_id, actions);
-            }
-        },
-        SetTeamColor(team_name, color) => {
-            if let (c, Some(r)) = server.client_and_room(client_id) {
-                let mut owner_id = None;
-                let actions = if let Some((owner, team)) = r.find_team_and_owner_mut(|t| t.name == team_name) {
-                    if !c.is_master() {
-                        vec![ProtocolError("You're not the room master!".to_string())]
-                    } else if false  {
-                        Vec::new()
-                    } else {
-                        owner_id = Some(owner);
-                        team.color = color;
-                        vec![TeamColor(team.name.clone(), color)
-                            .send_all().in_room(room_id).but_self().action()]
-                    }
-                } else {
-                    vec![(Warn("No such team.".to_string()))]
-                };
-
-                if let Some(id) = owner_id {
-                    server.clients[id].clan = Some(color);
-                }
-
-                server.react(client_id, actions);
-            };
-        },
-        Cfg(cfg) => {
-            if let (c, Some(r)) = server.client_and_room(client_id) {
-                let actions = if r.is_fixed() {
-                    vec![Warn("Access denied.".to_string())]
-                } else if !c.is_master() {
-                    vec![ProtocolError("You're not the room master!".to_string())]
-                } else {
-                    let cfg = match cfg {
-                        GameCfg::Scheme(name, mut values) => {
-                            if c.protocol_number == 49 && values.len() >= 2 {
-                                let mut s = "X".repeat(50);
-                                s.push_str(&values.pop().unwrap());
-                                values.push(s);
-                            }
-                            GameCfg::Scheme(name, values)
-                        }
-                        cfg => cfg
-                    };
-
-                    let v = vec![cfg.to_server_msg()
-                        .send_all().in_room(r.id).but_self().action()];
-                    r.set_config(cfg);
-                    v
-                };
-                server.react(client_id, actions);
-            }
-        }
-        Save(name, location) => {
-            let actions = vec![server_chat(format!("Room config saved as {}", name))
-                .send_all().in_room(room_id).action()];
-            server.rooms[room_id].save_config(name, location);
-            server.react(client_id, actions);
-        }
-        SaveRoom(filename) => {
-            if server.clients[client_id].is_admin() {
-                let actions = match server.rooms[room_id].get_saves() {
-                    Ok(text) => match write_file(&filename, &text) {
-                        Ok(_) => vec![server_chat("Room configs saved successfully.".to_string())
-                            .send_self().action()],
-                        Err(e) => {
-                            warn!("Error while writing the config file \"{}\": {}", filename, e);
-                            vec![Warn("Unable to save the room configs.".to_string())]
-                        }
-                    }
-                    Err(e) => {
-                        warn!("Error while serializing the room configs: {}", e);
-                        vec![Warn("Unable to serialize the room configs.".to_string())]
-                    }
-                };
-                server.react(client_id, actions);
-            }
-        }
-        LoadRoom(filename) => {
-            if server.clients[client_id].is_admin() {
-                let actions = match read_file(&filename) {
-                    Ok(text) => match server.rooms[room_id].set_saves(&text) {
-                        Ok(_) => vec![server_chat("Room configs loaded successfully.".to_string())
-                            .send_self().action()],
-                        Err(e) => {
-                            warn!("Error while deserializing the room configs: {}", e);
-                            vec![Warn("Unable to deserialize the room configs.".to_string())]
-                        }
-                    }
-                    Err(e) => {
-                        warn!("Error while reading the config file \"{}\": {}", filename, e);
-                        vec![Warn("Unable to load the room configs.".to_string())]
-                    }
-                };
-                server.react(client_id, actions);
-            }
-        }
-        Delete(name) => {
-            let actions = if !server.rooms[room_id].delete_config(&name) {
-                vec![Warn(format!("Save doesn't exist: {}", name))]
-            } else {
-                vec![server_chat(format!("Room config {} has been deleted", name))
-                    .send_all().in_room(room_id).action()]
-            };
-            server.react(client_id, actions);
-        }
-        CallVote(None) => {
-            server.react(client_id, vec![
-                server_chat("Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs <number>".to_string())
-                    .send_self().action()])
-        }
-        CallVote(Some(kind)) => {
-            let is_in_game = server.rooms[room_id].game_info.is_some();
-            let error = match &kind {
-                VoteType::Kick(nick) => {
-                    if server.find_client(&nick).filter(|c| c.room_id == Some(room_id)).is_some() {
-                        None
-                    } else {
-                        Some("/callvote kick: No such user!".to_string())
-                    }
-                },
-                VoteType::Map(None) => {
-                    let names: Vec<_> = server.rooms[room_id].saves.keys().cloned().collect();
-                    if names.is_empty() {
-                        Some("/callvote map: No maps saved in this room!".to_string())
-                    } else {
-                        Some(format!("Available maps: {}", names.join(", ")))
-                    }
-                },
-                VoteType::Map(Some(name)) => {
-                    if server.rooms[room_id].saves.get(&name[..]).is_some() {
-                        None
-                    } else {
-                        Some("/callvote map: No such map!".to_string())
-                    }
-                },
-                VoteType::Pause => {
-                    if is_in_game {
-                        None
-                    } else {
-                        Some("/callvote pause: No game in progress!".to_string())
-                    }
-                },
-                VoteType::NewSeed => {
-                    None
-                },
-                VoteType::HedgehogsPerTeam(number) => {
-                    match number {
-                        1...MAX_HEDGEHOGS_PER_TEAM => None,
-                        _ => Some("/callvote hedgehogs: Specify number from 1 to 8.".to_string())
-                    }
-                },
-            };
-            match error {
-                None => {
-                    let msg = voting_description(&kind);
-                    let voting = Voting::new(kind, server.room_clients(client_id));
-                    server.rooms[room_id].voting = Some(voting);
-                    server.react(client_id, vec![
-                        server_chat(msg).send_all().in_room(room_id).action(),
-                        AddVote{ vote: true, is_forced: false}]);
-                }
-                Some(msg) => {
-                    server.react(client_id, vec![
-                        server_chat(msg).send_self().action()])
-                }
-            }
-        }
-        Vote(vote) => {
-            server.react(client_id, vec![AddVote{ vote, is_forced: false }]);
-        }
-        ForceVote(vote) => {
-            let is_forced = server.clients[client_id].is_admin();
-            server.react(client_id, vec![AddVote{ vote, is_forced }]);
-        }
-        ToggleRestrictJoin | ToggleRestrictTeams | ToggleRegisteredOnly  => {
-            if server.clients[client_id].is_master() {
-                server.rooms[room_id].flags.toggle(room_message_flag(&message));
-            }
-            server.react(client_id, vec![SendRoomUpdate(None)]);
-        }
-        StartGame => {
-            server.react(client_id, vec![StartRoomGame(room_id)]);
-        }
-        EngineMessage(em) => {
-            let mut actions = Vec::new();
-            if let (c, Some(r)) = server.client_and_room(client_id) {
-                if c.teams_in_game > 0 {
-                    let decoding = decode(&em[..]).unwrap();
-                    let messages = by_msg(&decoding);
-                    let valid = messages.filter(|m| is_msg_valid(m, &c.team_indices));
-                    let non_empty = valid.clone().filter(|m| !is_msg_empty(m));
-                    let sync_msg = valid.clone().filter(|m| is_msg_timed(m))
-                        .last().map(|m| if is_msg_empty(m) {Some(encode(m))} else {None});
-
-                    let em_response = encode(&valid.flat_map(|msg| msg).cloned().collect::<Vec<_>>());
-                    if !em_response.is_empty() {
-                        actions.push(ForwardEngineMessage(vec![em_response])
-                            .send_all().in_room(r.id).but_self().action());
-                    }
-                    let em_log = encode(&non_empty.flat_map(|msg| msg).cloned().collect::<Vec<_>>());
-                    if let Some(ref mut info) = r.game_info {
-                        if !em_log.is_empty() {
-                            info.msg_log.push(em_log);
-                        }
-                        if let Some(msg) = sync_msg {
-                            info.sync_msg = msg;
-                        }
-                    }
-                }
-            }
-            server.react(client_id, actions)
-        }
-        RoundFinished => {
-            let mut actions = Vec::new();
-            if let (c, Some(r)) = server.client_and_room(client_id) {
-                if c.is_in_game() {
-                    c.set_is_in_game(false);
-                    actions.push(ClientFlags("-g".to_string(), vec![c.nick.clone()]).
-                        send_all().in_room(r.id).action());
-                    if r.game_info.is_some() {
-                        for team in r.client_teams(c.id) {
-                            actions.push(SendTeamRemovalMessage(team.name.clone()));
-                        }
-                    }
-                }
-            }
-            server.react(client_id, actions)
-        },
-        Rnd(v) => {
-            let result = rnd_reply(&v);
-            let mut echo = vec!["/rnd".to_string()];
-            echo.extend(v.into_iter());
-            let chat_msg = ChatMsg {
-                nick: server.clients[client_id].nick.clone(),
-                msg: echo.join(" ")
-            };
-            server.react(client_id, vec![
-                chat_msg.send_all().in_room(room_id).action(),
-                result.send_all().in_room(room_id).action()])
-        },
-        _ => warn!("Unimplemented!")
-    }
-}
--- a/gameServer2/src/server/handlers/lobby.rs	Mon Jan 14 15:11:15 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,72 +0,0 @@
-use mio;
-
-use crate::{
-    server::{
-        server::HWServer,
-        coretypes::ClientId,
-        actions::{Action, Action::*}
-    },
-    protocol::messages::{
-        HWProtocolMessage,
-        HWServerMessage::*
-    },
-    utils::is_name_illegal
-};
-use super::common::rnd_reply;
-use log::*;
-
-pub fn handle(server: &mut HWServer, client_id: ClientId, message: HWProtocolMessage) {
-    use crate::protocol::messages::HWProtocolMessage::*;
-    match message {
-        CreateRoom(name, password) => {
-            let actions =
-                if is_name_illegal(&name) {
-                    vec![Warn("Illegal room name! A room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}".to_string())]
-                } else if server.has_room(&name) {
-                    vec![Warn("A room with the same name already exists.".to_string())]
-                } else {
-                    let flags_msg = ClientFlags(
-                        "+hr".to_string(),
-                        vec![server.clients[client_id].nick.clone()]);
-                    vec![AddRoom(name, password),
-                         flags_msg.send_self().action()]
-                };
-            server.react(client_id, actions);
-        },
-        Chat(msg) => {
-            let actions = vec![ChatMsg {nick: server.clients[client_id].nick.clone(), msg}
-                .send_all().in_room(server.lobby_id).but_self().action()];
-            server.react(client_id, actions);
-        },
-        JoinRoom(name, _password) => {
-            let room = server.rooms.iter().find(|(_, r)| r.name == name);
-            let room_id = room.map(|(_, r)| r.id);
-            let nicks = server.clients.iter()
-                .filter(|(_, c)| c.room_id == room_id)
-                .map(|(_, c)| c.nick.clone())
-                .collect();
-            let c = &mut server.clients[client_id];
-
-            let actions = if let Some((_, r)) = room {
-                if c.protocol_number != r.protocol_number {
-                    vec![Warn("Room version incompatible to your Hedgewars version!".to_string())]
-                } else if r.is_join_restricted() {
-                    vec![Warn("Access denied. This room currently doesn't allow joining.".to_string())]
-                } else if r.players_number == u8::max_value() {
-                    vec![Warn("This room is already full".to_string())]
-                } else {
-                    vec![MoveToRoom(r.id),
-                         RoomJoined(nicks).send_self().action()]
-                }
-            } else {
-                vec![Warn("No such room.".to_string())]
-            };
-            server.react(client_id, actions);
-        },
-        Rnd(v) => {
-            server.react(client_id, vec![rnd_reply(&v).send_self().action()]);
-        },
-        List => warn!("Deprecated LIST message received"),
-        _ => warn!("Incorrect command in lobby state"),
-    }
-}
--- a/gameServer2/src/server/handlers/loggingin.rs	Mon Jan 14 15:11:15 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +0,0 @@
-use mio;
-
-use crate::{
-    server::{
-        client::HWClient,
-        server::HWServer,
-        coretypes::ClientId,
-        actions::{Action, Action::*}
-    },
-    protocol::messages::{
-        HWProtocolMessage, HWServerMessage::*
-    },
-    utils::is_name_illegal
-};
-#[cfg(feature = "official-server")]
-use openssl::sha::sha1;
-use std::fmt::{Formatter, LowerHex};
-use log::*;
-
-#[derive(PartialEq)]
-struct Sha1Digest([u8; 20]);
-
-impl LowerHex for Sha1Digest {
-    fn fmt(&self, f: &mut Formatter) -> Result<(), std::fmt::Error> {
-        for byte in &self.0 {
-            write!(f, "{:02x}", byte)?;
-        }
-        Ok(())
-    }
-}
-
-#[cfg(feature = "official-server")]
-fn get_hash(client: &HWClient, salt1: &str, salt2: &str) -> Sha1Digest {
-    let s = format!("{}{}{}{}{}", salt1, salt2,
-                    client.web_password, client.protocol_number, "!hedgewars");
-    Sha1Digest(sha1(s.as_bytes()))
-}
-
-pub fn handle(server: & mut HWServer, client_id: ClientId, message: HWProtocolMessage) {
-    match message {
-        HWProtocolMessage::Nick(nick) => {
-            let client = &mut server.clients[client_id];
-            debug!("{} {}", nick, is_name_illegal(&nick));
-            let actions = if client.room_id != None {
-                unreachable!()
-            }
-            else if !client.nick.is_empty() {
-                vec![ProtocolError("Nickname already provided.".to_string())]
-            }
-            else if is_name_illegal(&nick) {
-                vec![ByeClient("Illegal nickname! Nicknames must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}".to_string())]
-            }
-            else {
-                client.nick = nick.clone();
-                vec![Nick(nick).send_self().action(),
-                     CheckRegistered]
-            };
-
-            server.react(client_id, actions);
-        }
-        HWProtocolMessage::Proto(proto) => {
-            let client = &mut server.clients[client_id];
-            let actions = if client.protocol_number != 0 {
-                vec![ProtocolError("Protocol already known.".to_string())]
-            }
-            else if proto == 0 {
-                vec![ProtocolError("Bad number.".to_string())]
-            }
-            else {
-                client.protocol_number = proto;
-                vec![Proto(proto).send_self().action(),
-                     CheckRegistered]
-            };
-            server.react(client_id, actions);
-        }
-        #[cfg(feature = "official-server")]
-        HWProtocolMessage::Password(hash, salt) => {
-            let c = &server.clients[client_id];
-
-            let client_hash = get_hash(c, &salt, &c.server_salt);
-            let server_hash = get_hash(c, &c.server_salt, &salt);
-            let actions = if client_hash == server_hash {
-                vec![ServerAuth(format!("{:x}", server_hash)).send_self().action(),
-                     JoinLobby]
-            } else {
-                vec![ByeClient("Authentication failed".to_string())]
-            };
-            server.react(client_id, actions);
-        }
-        #[cfg(feature = "official-server")]
-        HWProtocolMessage::Checker(protocol, nick, password) => {
-            let c = &mut server.clients[client_id];
-            c.nick = nick;
-            c.web_password = password;
-            c.set_is_checker(true);
-        }
-        _ => warn!("Incorrect command in logging-in state"),
-    }
-}
--- a/gameServer2/src/server/handlers/mod.rs	Mon Jan 14 15:11:15 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-use mio;
-use std::{io, io::Write};
-
-use super::{
-    server::HWServer,
-    actions::{Action, Action::*},
-    coretypes::ClientId
-};
-use crate::{
-    protocol::messages::{
-        HWProtocolMessage,
-        HWServerMessage::*
-    }
-};
-use log::*;
-
-mod loggingin;
-mod lobby;
-mod inroom;
-mod common;
-mod checker;
-
-pub fn handle(server: &mut HWServer, client_id: ClientId, message: HWProtocolMessage) {
-    match message {
-        HWProtocolMessage::Ping =>
-            server.react(client_id, vec![Pong.send_self().action()]),
-        HWProtocolMessage::Quit(Some(msg)) =>
-            server.react(client_id, vec![ByeClient("User quit: ".to_string() + &msg)]),
-        HWProtocolMessage::Quit(None) =>
-            server.react(client_id, vec![ByeClient("User quit".to_string())]),
-        HWProtocolMessage::Malformed => warn!("Malformed/unknown message"),
-        HWProtocolMessage::Empty => warn!("Empty message"),
-        _ => {
-            match server.clients[client_id].room_id {
-                None =>
-                    loggingin::handle(server, client_id, message),
-                Some(id) if id == server.lobby_id =>
-                    lobby::handle(server, client_id, message),
-                Some(id) =>
-                    inroom::handle(server, client_id, id, message)
-            }
-        },
-    }
-}
--- a/gameServer2/src/server/mod.rs	Mon Jan 14 15:11:15 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-pub mod server;
-pub mod client;
-pub mod room;
-pub mod network;
-pub mod coretypes;
-mod actions;
-mod handlers;
--- a/gameServer2/src/server/network.rs	Mon Jan 14 15:11:15 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,443 +0,0 @@
-extern crate slab;
-
-use std::{
-    io, io::{Error, ErrorKind, Read, Write},
-    net::{SocketAddr, IpAddr, Ipv4Addr},
-    collections::HashSet,
-    mem::{swap, replace}
-};
-
-use mio::{
-    net::{TcpStream, TcpListener},
-    Poll, PollOpt, Ready, Token
-};
-use netbuf;
-use slab::Slab;
-use log::*;
-
-use crate::{
-    utils,
-    protocol::{ProtocolDecoder, messages::*}
-};
-use super::{
-    server::{HWServer},
-    coretypes::ClientId
-};
-#[cfg(feature = "tls-connections")]
-use openssl::{
-    ssl::{
-        SslMethod, SslContext, Ssl, SslContextBuilder,
-        SslVerifyMode, SslFiletype, SslOptions,
-        SslStreamBuilder, HandshakeError, MidHandshakeSslStream, SslStream
-    },
-    error::ErrorStack
-};
-
-const MAX_BYTES_PER_READ: usize = 2048;
-
-#[derive(Hash, Eq, PartialEq, Copy, Clone)]
-pub enum NetworkClientState {
-    Idle,
-    NeedsWrite,
-    NeedsRead,
-    Closed,
-}
-
-type NetworkResult<T> = io::Result<(T, NetworkClientState)>;
-
-#[cfg(not(feature = "tls-connections"))]
-pub enum ClientSocket {
-    Plain(TcpStream)
-}
-
-#[cfg(feature = "tls-connections")]
-pub enum ClientSocket {
-    SslHandshake(Option<MidHandshakeSslStream<TcpStream>>),
-    SslStream(SslStream<TcpStream>)
-}
-
-impl ClientSocket {
-    fn inner(&self) -> &TcpStream {
-        #[cfg(not(feature = "tls-connections"))]
-        match self {
-            ClientSocket::Plain(stream) => stream,
-        }
-
-        #[cfg(feature = "tls-connections")]
-        match self {
-            ClientSocket::SslHandshake(Some(builder)) => builder.get_ref(),
-            ClientSocket::SslHandshake(None) => unreachable!(),
-            ClientSocket::SslStream(ssl_stream) => ssl_stream.get_ref()
-        }
-    }
-}
-
-pub struct NetworkClient {
-    id: ClientId,
-    socket: ClientSocket,
-    peer_addr: SocketAddr,
-    decoder: ProtocolDecoder,
-    buf_out: netbuf::Buf
-}
-
-impl NetworkClient {
-    pub fn new(id: ClientId, socket: ClientSocket, peer_addr: SocketAddr) -> NetworkClient {
-        NetworkClient {
-            id, socket, peer_addr,
-            decoder: ProtocolDecoder::new(),
-            buf_out: netbuf::Buf::new()
-        }
-    }
-
-    #[cfg(feature = "tls-connections")]
-    fn handshake_impl(&mut self, handshake: MidHandshakeSslStream<TcpStream>) -> io::Result<NetworkClientState> {
-        match handshake.handshake() {
-            Ok(stream) => {
-                self.socket = ClientSocket::SslStream(stream);
-                debug!("TLS handshake with {} ({}) completed", self.id, self.peer_addr);
-                Ok(NetworkClientState::Idle)
-            }
-            Err(HandshakeError::WouldBlock(new_handshake)) => {
-                self.socket = ClientSocket::SslHandshake(Some(new_handshake));
-                Ok(NetworkClientState::Idle)
-            }
-            Err(HandshakeError::Failure(new_handshake)) => {
-                self.socket = ClientSocket::SslHandshake(Some(new_handshake));
-                debug!("TLS handshake with {} ({}) failed", self.id, self.peer_addr);
-                Err(Error::new(ErrorKind::Other, "Connection failure"))
-            }
-            Err(HandshakeError::SetupFailure(_)) => unreachable!()
-        }
-    }
-
-    fn read_impl<R: Read>(decoder: &mut ProtocolDecoder, source: &mut R,
-                          id: ClientId, addr: &SocketAddr) -> NetworkResult<Vec<HWProtocolMessage>> {
-        let mut bytes_read = 0;
-        let result = loop {
-            match decoder.read_from(source) {
-                Ok(bytes) => {
-                    debug!("Client {}: read {} bytes", id, bytes);
-                    bytes_read += bytes;
-                    if bytes == 0 {
-                        let result = if bytes_read == 0 {
-                            info!("EOF for client {} ({})", id, addr);
-                            (Vec::new(), NetworkClientState::Closed)
-                        } else {
-                            (decoder.extract_messages(), NetworkClientState::NeedsRead)
-                        };
-                        break Ok(result);
-                    }
-                    else if bytes_read >= MAX_BYTES_PER_READ {
-                        break Ok((decoder.extract_messages(), NetworkClientState::NeedsRead))
-                    }
-                }
-                Err(ref error) if error.kind() == ErrorKind::WouldBlock => {
-                    let messages =  if bytes_read == 0 {
-                        Vec::new()
-                    } else {
-                        decoder.extract_messages()
-                    };
-                    break Ok((messages, NetworkClientState::Idle));
-                }
-                Err(error) =>
-                    break Err(error)
-            }
-        };
-        decoder.sweep();
-        result
-    }
-
-    pub fn read(&mut self) -> NetworkResult<Vec<HWProtocolMessage>> {
-        #[cfg(not(feature = "tls-connections"))]
-        match self.socket {
-            ClientSocket::Plain(ref mut stream) =>
-                NetworkClient::read_impl(&mut self.decoder, stream, self.id, &self.peer_addr),
-        }
-
-        #[cfg(feature = "tls-connections")]
-        match self.socket {
-            ClientSocket::SslHandshake(ref mut handshake_opt) => {
-                let handshake = std::mem::replace(handshake_opt, None).unwrap();
-                Ok((Vec::new(), self.handshake_impl(handshake)?))
-            },
-            ClientSocket::SslStream(ref mut stream) =>
-                NetworkClient::read_impl(&mut self.decoder, stream, self.id, &self.peer_addr)
-        }
-    }
-
-    fn write_impl<W: Write>(buf_out: &mut netbuf::Buf, destination: &mut W) -> NetworkResult<()> {
-        let result = loop {
-            match buf_out.write_to(destination) {
-                Ok(bytes) if buf_out.is_empty() || bytes == 0 =>
-                    break Ok(((), NetworkClientState::Idle)),
-                Ok(_) => (),
-                Err(ref error) if error.kind() == ErrorKind::Interrupted
-                    || error.kind() == ErrorKind::WouldBlock => {
-                    break Ok(((), NetworkClientState::NeedsWrite));
-                },
-                Err(error) =>
-                    break Err(error)
-            }
-        };
-        result
-    }
-
-    pub fn write(&mut self) -> NetworkResult<()> {
-        let result = {
-            #[cfg(not(feature = "tls-connections"))]
-            match self.socket {
-                ClientSocket::Plain(ref mut stream) =>
-                    NetworkClient::write_impl(&mut self.buf_out, stream)
-            }
-
-            #[cfg(feature = "tls-connections")] {
-                match self.socket {
-                    ClientSocket::SslHandshake(ref mut handshake_opt) => {
-                        let handshake = std::mem::replace(handshake_opt, None).unwrap();
-                        Ok(((), self.handshake_impl(handshake)?))
-                    }
-                    ClientSocket::SslStream(ref mut stream) =>
-                        NetworkClient::write_impl(&mut self.buf_out, stream)
-                }
-            }
-        };
-
-        self.socket.inner().flush()?;
-        result
-    }
-
-    pub fn send_raw_msg(&mut self, msg: &[u8]) {
-        self.buf_out.write_all(msg).unwrap();
-    }
-
-    pub fn send_string(&mut self, msg: &str) {
-        self.send_raw_msg(&msg.as_bytes());
-    }
-
-    pub fn send_msg(&mut self, msg: &HWServerMessage) {
-        self.send_string(&msg.to_raw_protocol());
-    }
-}
-
-#[cfg(feature = "tls-connections")]
-struct ServerSsl {
-    context: SslContext
-}
-
-pub struct NetworkLayer {
-    listener: TcpListener,
-    server: HWServer,
-    clients: Slab<NetworkClient>,
-    pending: HashSet<(ClientId, NetworkClientState)>,
-    pending_cache: Vec<(ClientId, NetworkClientState)>,
-    #[cfg(feature = "tls-connections")]
-    ssl: ServerSsl
-}
-
-impl NetworkLayer {
-    pub fn new(listener: TcpListener, clients_limit: usize, rooms_limit: usize) -> NetworkLayer {
-        let server = HWServer::new(clients_limit, rooms_limit);
-        let clients = Slab::with_capacity(clients_limit);
-        let pending = HashSet::with_capacity(2 * clients_limit);
-        let pending_cache = Vec::with_capacity(2 * clients_limit);
-
-        NetworkLayer {
-            listener, server, clients, pending, pending_cache,
-            #[cfg(feature = "tls-connections")]
-            ssl: NetworkLayer::create_ssl_context()
-        }
-    }
-
-    #[cfg(feature = "tls-connections")]
-    fn create_ssl_context() -> ServerSsl {
-        let mut builder = SslContextBuilder::new(SslMethod::tls()).unwrap();
-        builder.set_verify(SslVerifyMode::NONE);
-        builder.set_read_ahead(true);
-        builder.set_certificate_file("ssl/cert.pem", SslFiletype::PEM).unwrap();
-        builder.set_private_key_file("ssl/key.pem", SslFiletype::PEM).unwrap();
-        builder.set_options(SslOptions::NO_COMPRESSION);
-        builder.set_cipher_list("DEFAULT:!LOW:!RC4:!EXP").unwrap();
-        ServerSsl { context: builder.build() }
-    }
-
-    pub fn register_server(&self, poll: &Poll) -> io::Result<()> {
-        poll.register(&self.listener, utils::SERVER, Ready::readable(),
-                      PollOpt::edge())
-    }
-
-    fn deregister_client(&mut self, poll: &Poll, id: ClientId) {
-        let mut client_exists = false;
-        if let Some(ref client) = self.clients.get(id) {
-            poll.deregister(client.socket.inner())
-                .expect("could not deregister socket");
-            info!("client {} ({}) removed", client.id, client.peer_addr);
-            client_exists = true;
-        }
-        if client_exists {
-            self.clients.remove(id);
-        }
-    }
-
-    fn register_client(&mut self, poll: &Poll, id: ClientId, client_socket: ClientSocket, addr: SocketAddr) {
-        poll.register(client_socket.inner(), Token(id),
-                      Ready::readable() | Ready::writable(),
-                      PollOpt::edge())
-            .expect("could not register socket with event loop");
-
-        let entry = self.clients.vacant_entry();
-        let client = NetworkClient::new(id, client_socket, addr);
-        info!("client {} ({}) added", client.id, client.peer_addr);
-        entry.insert(client);
-    }
-
-    fn flush_server_messages(&mut self) {
-        debug!("{} pending server messages", self.server.output.len());
-        for (clients, message) in self.server.output.drain(..) {
-            debug!("Message {:?} to {:?}", message, clients);
-            let msg_string = message.to_raw_protocol();
-            for client_id in clients {
-                if let Some(client) = self.clients.get_mut(client_id) {
-                    client.send_string(&msg_string);
-                    self.pending.insert((client_id, NetworkClientState::NeedsWrite));
-                }
-            }
-        }
-    }
-
-    fn create_client_socket(&self, socket: TcpStream) -> io::Result<ClientSocket> {
-        #[cfg(not(feature = "tls-connections"))] {
-            Ok(ClientSocket::Plain(socket))
-        }
-
-        #[cfg(feature = "tls-connections")] {
-            let ssl = Ssl::new(&self.ssl.context).unwrap();
-            let mut builder = SslStreamBuilder::new(ssl, socket);
-            builder.set_accept_state();
-            match builder.handshake() {
-                Ok(stream) =>
-                    Ok(ClientSocket::SslStream(stream)),
-                Err(HandshakeError::WouldBlock(stream)) =>
-                    Ok(ClientSocket::SslHandshake(Some(stream))),
-                Err(e) => {
-                    debug!("OpenSSL handshake failed: {}", e);
-                    Err(Error::new(ErrorKind::Other, "Connection failure"))
-                }
-            }
-        }
-    }
-
-    pub fn accept_client(&mut self, poll: &Poll) -> io::Result<()> {
-        let (client_socket, addr) = self.listener.accept()?;
-        info!("Connected: {}", addr);
-
-        let client_id = self.server.add_client();
-        self.register_client(poll, client_id, self.create_client_socket(client_socket)?, addr);
-        self.flush_server_messages();
-
-        Ok(())
-    }
-
-    fn operation_failed(&mut self, poll: &Poll, client_id: ClientId, error: &Error, msg: &str) -> io::Result<()> {
-        let addr = if let Some(ref mut client) = self.clients.get_mut(client_id) {
-            client.peer_addr
-        } else {
-            SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 0)
-        };
-        debug!("{}({}): {}", msg, addr, error);
-        self.client_error(poll, client_id)
-    }
-
-    pub fn client_readable(&mut self, poll: &Poll,
-                           client_id: ClientId) -> io::Result<()> {
-        let messages =
-            if let Some(ref mut client) = self.clients.get_mut(client_id) {
-                client.read()
-            } else {
-                warn!("invalid readable client: {}", client_id);
-                Ok((Vec::new(), NetworkClientState::Idle))
-            };
-
-        match messages {
-            Ok((messages, state)) => {
-                for message in messages {
-                    self.server.handle_msg(client_id, message);
-                }
-                match state {
-                    NetworkClientState::NeedsRead => {
-                        self.pending.insert((client_id, state));
-                    },
-                    NetworkClientState::Closed =>
-                        self.client_error(&poll, client_id)?,
-                    _ => {}
-                };
-            }
-            Err(e) => self.operation_failed(
-                poll, client_id, &e,
-                "Error while reading from client socket")?
-        }
-
-        self.flush_server_messages();
-
-        if !self.server.removed_clients.is_empty() {
-            let ids: Vec<_> = self.server.removed_clients.drain(..).collect();
-            for client_id in ids {
-                self.deregister_client(poll, client_id);
-            }
-        }
-
-        Ok(())
-    }
-
-    pub fn client_writable(&mut self, poll: &Poll,
-                           client_id: ClientId) -> io::Result<()> {
-        let result =
-            if let Some(ref mut client) = self.clients.get_mut(client_id) {
-                client.write()
-            } else {
-                warn!("invalid writable client: {}", client_id);
-                Ok(((), NetworkClientState::Idle))
-            };
-
-        match result {
-            Ok(((), state)) if state == NetworkClientState::NeedsWrite => {
-                self.pending.insert((client_id, state));
-            },
-            Ok(_) => {}
-            Err(e) => self.operation_failed(
-                poll, client_id, &e,
-                "Error while writing to client socket")?
-        }
-
-        Ok(())
-    }
-
-    pub fn client_error(&mut self, poll: &Poll,
-                        client_id: ClientId) -> io::Result<()> {
-        self.deregister_client(poll, client_id);
-        self.server.client_lost(client_id);
-
-        Ok(())
-    }
-
-    pub fn has_pending_operations(&self) -> bool {
-        !self.pending.is_empty()
-    }
-
-    pub fn on_idle(&mut self, poll: &Poll) -> io::Result<()> {
-        if self.has_pending_operations() {
-            let mut cache = replace(&mut self.pending_cache, Vec::new());
-            cache.extend(self.pending.drain());
-            for (id, state) in cache.drain(..) {
-                match state {
-                    NetworkClientState::NeedsRead =>
-                        self.client_readable(poll, id)?,
-                    NetworkClientState::NeedsWrite =>
-                        self.client_writable(poll, id)?,
-                    _ => {}
-                }
-            }
-            swap(&mut cache, &mut self.pending_cache);
-        }
-        Ok(())
-    }
-}
--- a/gameServer2/src/server/room.rs	Mon Jan 14 15:11:15 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,391 +0,0 @@
-use std::{
-    iter, collections::HashMap
-};
-use crate::server::{
-    coretypes::{
-        ClientId, RoomId, TeamInfo, GameCfg, GameCfg::*, Voting,
-        MAX_HEDGEHOGS_PER_TEAM
-    },
-    client::{HWClient}
-};
-use bitflags::*;
-use serde::{Serialize, Deserialize};
-use serde_derive::{Serialize, Deserialize};
-use serde_yaml;
-
-const MAX_TEAMS_IN_ROOM: u8 = 8;
-const MAX_HEDGEHOGS_IN_ROOM: u8 =
-    MAX_HEDGEHOGS_PER_TEAM * MAX_HEDGEHOGS_PER_TEAM;
-
-#[derive(Clone, Serialize, Deserialize)]
-struct Ammo {
-    name: String,
-    settings: Option<String>
-}
-
-#[derive(Clone, Serialize, Deserialize)]
-struct Scheme {
-    name: String,
-    settings: Vec<String>
-}
-
-#[derive(Clone, Serialize, Deserialize)]
-struct RoomConfig {
-    feature_size: u32,
-    map_type: String,
-    map_generator: u32,
-    maze_size: u32,
-    seed: String,
-    template: u32,
-
-    ammo: Ammo,
-    scheme: Scheme,
-    script: String,
-    theme: String,
-    drawn_map: Option<String>
-}
-
-impl RoomConfig {
-    fn new() -> RoomConfig {
-        RoomConfig {
-            feature_size: 12,
-            map_type: "+rnd+".to_string(),
-            map_generator: 0,
-            maze_size: 0,
-            seed: "seed".to_string(),
-            template: 0,
-
-            ammo: Ammo {name: "Default".to_string(), settings: None },
-            scheme: Scheme {name: "Default".to_string(), settings: Vec::new() },
-            script: "Normal".to_string(),
-            theme: "\u{1f994}".to_string(),
-            drawn_map: None
-        }
-    }
-}
-
-fn client_teams_impl(teams: &[(ClientId, TeamInfo)], client_id: ClientId)
-    -> impl Iterator<Item = &TeamInfo> + Clone
-{
-    teams.iter().filter(move |(id, _)| *id == client_id).map(|(_, t)| t)
-}
-
-fn map_config_from(c: &RoomConfig) -> Vec<String> {
-    vec![c.feature_size.to_string(), c.map_type.to_string(),
-         c.map_generator.to_string(), c.maze_size.to_string(),
-         c.seed.to_string(), c.template.to_string()]
-}
-
-fn game_config_from(c: &RoomConfig) -> Vec<GameCfg> {
-    use crate::server::coretypes::GameCfg::*;
-    let mut v = vec![
-        Ammo(c.ammo.name.to_string(), c.ammo.settings.clone()),
-        Scheme(c.scheme.name.to_string(), c.scheme.settings.clone()),
-        Script(c.script.to_string()),
-        Theme(c.theme.to_string())];
-    if let Some(ref m) = c.drawn_map {
-        v.push(DrawnMap(m.to_string()))
-    }
-    v
-}
-
-pub struct GameInfo {
-    pub teams_in_game: u8,
-    pub teams_at_start: Vec<(ClientId, TeamInfo)>,
-    pub left_teams: Vec<String>,
-    pub msg_log: Vec<String>,
-    pub sync_msg: Option<String>,
-    pub is_paused: bool,
-    config: RoomConfig
-}
-
-impl GameInfo {
-    fn new(teams: Vec<(ClientId, TeamInfo)>, config: RoomConfig) -> GameInfo {
-        GameInfo {
-            left_teams: Vec::new(),
-            msg_log: Vec::new(),
-            sync_msg: None,
-            is_paused: false,
-            teams_in_game: teams.len() as u8,
-            teams_at_start: teams,
-            config
-        }
-    }
-
-    pub fn client_teams(&self, client_id: ClientId) -> impl Iterator<Item = &TeamInfo> + Clone {
-        client_teams_impl(&self.teams_at_start, client_id)
-    }
-}
-
-#[derive(Serialize, Deserialize)]
-pub struct RoomSave {
-    pub location: String,
-    config: RoomConfig
-}
-
-bitflags!{
-    pub struct RoomFlags: u8 {
-        const FIXED = 0b0000_0001;
-        const RESTRICTED_JOIN = 0b0000_0010;
-        const RESTRICTED_TEAM_ADD = 0b0000_0100;
-        const RESTRICTED_UNREGISTERED_PLAYERS = 0b0000_1000;
-    }
-}
-
-pub struct HWRoom {
-    pub id: RoomId,
-    pub master_id: Option<ClientId>,
-    pub name: String,
-    pub password: Option<String>,
-    pub greeting: String,
-    pub protocol_number: u16,
-    pub flags: RoomFlags,
-
-    pub players_number: u8,
-    pub default_hedgehog_number: u8,
-    pub team_limit: u8,
-    pub ready_players_number: u8,
-    pub teams: Vec<(ClientId, TeamInfo)>,
-    config: RoomConfig,
-    pub voting: Option<Voting>,
-    pub saves: HashMap<String, RoomSave>,
-    pub game_info: Option<GameInfo>
-}
-
-impl HWRoom {
-    pub fn new(id: RoomId) -> HWRoom {
-        HWRoom {
-            id,
-            master_id: None,
-            name: String::new(),
-            password: None,
-            greeting: "".to_string(),
-            flags: RoomFlags::empty(),
-            protocol_number: 0,
-            players_number: 0,
-            default_hedgehog_number: 4,
-            team_limit: MAX_TEAMS_IN_ROOM,
-            ready_players_number: 0,
-            teams: Vec::new(),
-            config: RoomConfig::new(),
-            voting: None,
-            saves: HashMap::new(),
-            game_info: None
-        }
-    }
-
-    pub fn hedgehogs_number(&self) -> u8 {
-        self.teams.iter().map(|(_, t)| t.hedgehogs_number).sum()
-    }
-
-    pub fn addable_hedgehogs(&self) -> u8 {
-        MAX_HEDGEHOGS_IN_ROOM - self.hedgehogs_number()
-    }
-
-    pub fn add_team(&mut self, owner_id: ClientId, mut team: TeamInfo, preserve_color: bool) -> &TeamInfo {
-        if !preserve_color {
-            team.color = iter::repeat(()).enumerate()
-                .map(|(i, _)| i as u8).take(u8::max_value() as usize + 1)
-                .find(|i| self.teams.iter().all(|(_, t)| t.color != *i))
-                .unwrap_or(0u8)
-        };
-        team.hedgehogs_number = if self.teams.is_empty() {
-            self.default_hedgehog_number
-        } else {
-            self.teams[0].1.hedgehogs_number.min(self.addable_hedgehogs())
-        };
-        self.teams.push((owner_id, team));
-        &self.teams.last().unwrap().1
-    }
-
-    pub fn remove_team(&mut self, name: &str) {
-        if let Some(index) = self.teams.iter().position(|(_, t)| t.name == name) {
-            self.teams.remove(index);
-        }
-    }
-
-    pub fn set_hedgehogs_number(&mut self, n: u8) -> Vec<String> {
-        let mut names = Vec::new();
-        let teams = match self.game_info {
-            Some(ref mut info) => &mut info.teams_at_start,
-            None => &mut self.teams
-        };
-
-        if teams.len() as u8 * n <= MAX_HEDGEHOGS_IN_ROOM {
-            for (_, team) in teams.iter_mut() {
-                team.hedgehogs_number = n;
-                names.push(team.name.clone())
-            };
-            self.default_hedgehog_number = n;
-        }
-        names
-    }
-
-    pub fn find_team_and_owner_mut<F>(&mut self, f: F) -> Option<(ClientId, &mut TeamInfo)>
-        where F: Fn(&TeamInfo) -> bool {
-        self.teams.iter_mut().find(|(_, t)| f(t)).map(|(id, t)| (*id, t))
-    }
-
-    pub fn find_team<F>(&self, f: F) -> Option<&TeamInfo>
-        where F: Fn(&TeamInfo) -> bool {
-        self.teams.iter().find_map(|(_, t)| Some(t).filter(|t| f(&t)))
-    }
-
-    pub fn client_teams(&self, client_id: ClientId) -> impl Iterator<Item = &TeamInfo> {
-        client_teams_impl(&self.teams, client_id)
-    }
-
-    pub fn client_team_indices(&self, client_id: ClientId) -> Vec<u8> {
-        self.teams.iter().enumerate()
-            .filter(move |(_, (id, _))| *id == client_id)
-            .map(|(i, _)| i as u8).collect()
-    }
-
-    pub fn find_team_owner(&self, team_name: &str) -> Option<(ClientId, &str)> {
-        self.teams.iter().find(|(_, t)| t.name == team_name)
-            .map(|(id, t)| (*id, &t.name[..]))
-    }
-
-    pub fn find_team_color(&self, owner_id: ClientId) -> Option<u8> {
-        self.client_teams(owner_id).nth(0).map(|t| t.color)
-    }
-
-    pub fn has_multiple_clans(&self) -> bool {
-        self.teams.iter().min_by_key(|(_, t)| t.color) !=
-            self.teams.iter().max_by_key(|(_, t)| t.color)
-    }
-
-    pub fn set_config(&mut self, cfg: GameCfg) {
-        let c = &mut self.config;
-        match cfg {
-            FeatureSize(s) => c.feature_size = s,
-            MapType(t) => c.map_type = t,
-            MapGenerator(g) => c.map_generator = g,
-            MazeSize(s) => c.maze_size = s,
-            Seed(s) => c.seed = s,
-            Template(t) => c.template = t,
-
-            Ammo(n, s) => c.ammo = Ammo {name: n, settings: s},
-            Scheme(n, s) => c.scheme = Scheme {name: n, settings: s},
-            Script(s) => c.script = s,
-            Theme(t) => c.theme = t,
-            DrawnMap(m) => c.drawn_map = Some(m)
-        };
-    }
-
-    pub fn start_round(&mut self) {
-        if self.game_info.is_none() {
-            self.game_info = Some(GameInfo::new(
-                self.teams.clone(), self.config.clone()));
-        }
-    }
-
-    pub fn is_fixed(&self) -> bool {
-        self.flags.contains(RoomFlags::FIXED)
-    }
-    pub fn is_join_restricted(&self) -> bool {
-        self.flags.contains(RoomFlags::RESTRICTED_JOIN)
-    }
-    pub fn is_team_add_restricted(&self) -> bool {
-        self.flags.contains(RoomFlags::RESTRICTED_TEAM_ADD)
-    }
-    pub fn are_unregistered_players_restricted(&self) -> bool {
-        self.flags.contains(RoomFlags::RESTRICTED_UNREGISTERED_PLAYERS)
-    }
-
-    pub fn set_is_fixed(&mut self, value: bool) {
-        self.flags.set(RoomFlags::FIXED, value)
-    }
-    pub fn set_join_restriction(&mut self, value: bool) {
-        self.flags.set(RoomFlags::RESTRICTED_JOIN, value)
-    }
-    pub fn set_team_add_restriction(&mut self, value: bool) {
-        self.flags.set(RoomFlags::RESTRICTED_TEAM_ADD, value)
-    }
-    pub fn set_unregistered_players_restriction(&mut self, value: bool) {
-        self.flags.set(RoomFlags::RESTRICTED_UNREGISTERED_PLAYERS, value)
-    }
-
-    fn flags_string(&self) -> String {
-        let mut result = "-".to_string();
-        if self.game_info.is_some()  { result += "g" }
-        if self.password.is_some()   { result += "p" }
-        if self.is_join_restricted() { result += "j" }
-        if self.are_unregistered_players_restricted() {
-            result += "r"
-        }
-        result
-    }
-
-    pub fn info(&self, master: Option<&HWClient>) -> Vec<String> {
-        let c = &self.config;
-        vec![
-            self.flags_string(),
-            self.name.clone(),
-            self.players_number.to_string(),
-            self.teams.len().to_string(),
-            master.map_or("[]", |c| &c.nick).to_string(),
-            c.map_type.to_string(),
-            c.script.to_string(),
-            c.scheme.name.to_string(),
-            c.ammo.name.to_string()
-        ]
-    }
-
-    pub fn map_config(&self) -> Vec<String> {
-        match self.game_info {
-            Some(ref info) => map_config_from(&info.config),
-            None => map_config_from(&self.config)
-        }
-    }
-
-    pub fn game_config(&self) -> Vec<GameCfg> {
-        match self.game_info {
-            Some(ref info) => game_config_from(&info.config),
-            None => game_config_from(&self.config)
-        }
-    }
-
-    pub fn save_config(&mut self, name: String, location: String) {
-        self.saves.insert(name, RoomSave { location, config: self.config.clone() });
-    }
-
-    pub fn load_config(&mut self, name: &str) -> Option<&str> {
-        if let Some(save) = self.saves.get(name) {
-            self.config = save.config.clone();
-            Some(&save.location[..])
-        } else {
-            None
-        }
-    }
-
-    pub fn delete_config(&mut self, name: &str) -> bool {
-        self.saves.remove(name).is_some()
-    }
-
-    pub fn get_saves(&self) -> Result<String, serde_yaml::Error> {
-        serde_yaml::to_string(&(&self.greeting, &self.saves))
-    }
-
-    pub fn set_saves(&mut self, text: &str) -> Result<(), serde_yaml::Error> {
-        serde_yaml::from_str::<(String, HashMap<String, RoomSave>)>(text).map(|(greeting, saves)| {
-            self.greeting = greeting;
-            self.saves = saves;
-        })
-    }
-
-    pub fn team_info(owner: &HWClient, team: &TeamInfo) -> Vec<String> {
-        let mut info = vec![
-            team.name.clone(),
-            team.grave.clone(),
-            team.fort.clone(),
-            team.voice_pack.clone(),
-            team.flag.clone(),
-            owner.nick.clone(),
-            team.difficulty.to_string()];
-        let hogs = team.hedgehogs.iter().flat_map(|h|
-            iter::once(h.name.clone()).chain(iter::once(h.hat.clone())));
-        info.extend(hogs);
-        info
-    }
-}
\ No newline at end of file
--- a/gameServer2/src/server/server.rs	Mon Jan 14 15:11:15 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,156 +0,0 @@
-use slab;
-use crate::utils;
-use super::{
-    client::HWClient, room::HWRoom, actions, handlers,
-    coretypes::{ClientId, RoomId},
-    actions::{Destination, PendingMessage}
-};
-use crate::protocol::messages::*;
-use rand::{RngCore, thread_rng};
-use base64::{encode};
-use log::*;
-
-type Slab<T> = slab::Slab<T>;
-
-
-pub struct HWServer {
-    pub clients: Slab<HWClient>,
-    pub rooms: Slab<HWRoom>,
-    pub lobby_id: RoomId,
-    pub output: Vec<(Vec<ClientId>, HWServerMessage)>,
-    pub removed_clients: Vec<ClientId>,
-}
-
-impl HWServer {
-    pub fn new(clients_limit: usize, rooms_limit: usize) -> HWServer {
-        let rooms = Slab::with_capacity(rooms_limit);
-        let clients = Slab::with_capacity(clients_limit);
-        let mut server = HWServer {
-            clients, rooms,
-            lobby_id: 0,
-            output: vec![],
-            removed_clients: vec![]
-        };
-        server.lobby_id = server.add_room();
-        server
-    }
-
-    pub fn add_client(&mut self) -> ClientId {
-        let key: ClientId;
-        {
-            let entry = self.clients.vacant_entry();
-            key = entry.key();
-            let mut salt = [0u8; 18];
-            thread_rng().fill_bytes(&mut salt);
-
-            let client = HWClient::new(entry.key(), encode(&salt));
-            entry.insert(client);
-        }
-        self.send(key, &Destination::ToSelf, HWServerMessage::Connected(utils::PROTOCOL_VERSION));
-        key
-    }
-
-    pub fn client_lost(&mut self, client_id: ClientId) {
-        actions::run_action(self, client_id,
-                            actions::Action::ByeClient("Connection reset".to_string()));
-    }
-
-    pub fn add_room(&mut self) -> RoomId {
-        let entry = self.rooms.vacant_entry();
-        let key = entry.key();
-        let room = HWRoom::new(entry.key());
-        entry.insert(room);
-        key
-    }
-
-    pub fn handle_msg(&mut self, client_id: ClientId, msg: HWProtocolMessage) {
-        debug!("Handling message {:?} for client {}", msg, client_id);
-        if self.clients.contains(client_id) {
-            handlers::handle(self, client_id, msg);
-        }
-    }
-
-    fn get_recipients(&self, client_id: ClientId, destination: &Destination) -> Vec<ClientId> {
-        let mut ids = match *destination {
-            Destination::ToSelf => vec![client_id],
-            Destination::ToId(id) => vec![id],
-            Destination::ToAll {room_id: Some(id), ..} =>
-                self.room_clients(id),
-            Destination::ToAll {protocol: Some(proto), ..} =>
-                self.protocol_clients(proto),
-            Destination::ToAll {..} =>
-                self.clients.iter().map(|(id, _)| id).collect::<Vec<_>>()
-        };
-        if let Destination::ToAll {skip_self: true, ..} = destination {
-            if let Some(index) = ids.iter().position(|id| *id == client_id) {
-                ids.remove(index);
-            }
-        }
-        ids
-    }
-
-    pub fn send(&mut self, client_id: ClientId, destination: &Destination, message: HWServerMessage) {
-        let ids = self.get_recipients(client_id, &destination);
-        self.output.push((ids, message));
-    }
-
-    pub fn react(&mut self, client_id: ClientId, actions: Vec<actions::Action>) {
-        for action in actions {
-            actions::run_action(self, client_id, action);
-        }
-    }
-
-    pub fn lobby(&self) -> &HWRoom { &self.rooms[self.lobby_id] }
-
-    pub fn has_room(&self, name: &str) -> bool {
-        self.rooms.iter().any(|(_, r)| r.name == name)
-    }
-
-    pub fn find_room(&self, name: &str) -> Option<&HWRoom> {
-        self.rooms.iter().find_map(|(_, r)| Some(r).filter(|r| r.name == name))
-    }
-
-    pub fn find_room_mut(&mut self, name: &str) -> Option<&mut HWRoom> {
-        self.rooms.iter_mut().find_map(|(_, r)| Some(r).filter(|r| r.name == name))
-    }
-
-    pub fn find_client(&self, nick: &str) -> Option<&HWClient> {
-        self.clients.iter().find_map(|(_, c)| Some(c).filter(|c| c.nick == nick))
-    }
-
-    pub fn find_client_mut(&mut self, nick: &str) -> Option<&mut HWClient> {
-        self.clients.iter_mut().find_map(|(_, c)| Some(c).filter(|c| c.nick == nick))
-    }
-
-    pub fn select_clients<F>(&self, f: F) -> Vec<ClientId>
-        where F: Fn(&(usize, &HWClient)) -> bool {
-        self.clients.iter().filter(f)
-            .map(|(_, c)| c.id).collect()
-    }
-
-    pub fn room_clients(&self, room_id: RoomId) -> Vec<ClientId> {
-        self.select_clients(|(_, c)| c.room_id == Some(room_id))
-    }
-
-    pub fn protocol_clients(&self, protocol: u16) -> Vec<ClientId> {
-        self.select_clients(|(_, c)| c.protocol_number == protocol)
-    }
-
-    pub fn other_clients_in_room(&self, self_id: ClientId) -> Vec<ClientId> {
-        let room_id = self.clients[self_id].room_id;
-        self.select_clients(|(id, c)| *id != self_id && c.room_id == room_id )
-    }
-
-    pub fn client_and_room(&mut self, client_id: ClientId) -> (&mut HWClient, Option<&mut HWRoom>) {
-        let c = &mut self.clients[client_id];
-        if let Some(room_id) = c.room_id {
-            (c, Some(&mut self.rooms[room_id]))
-        } else {
-            (c, None)
-        }
-    }
-
-    pub fn room(&mut self, client_id: ClientId) -> Option<&mut HWRoom> {
-        self.client_and_room(client_id).1
-    }
-}
--- a/gameServer2/src/utils.rs	Mon Jan 14 15:11:15 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-use std::iter::Iterator;
-use mio;
-use base64::{encode};
-
-pub const PROTOCOL_VERSION : u32 = 3;
-pub const SERVER: mio::Token = mio::Token(1_000_000_000);
-
-pub fn is_name_illegal(name: &str ) -> bool{
-    name.len() > 40 ||
-        name.trim().is_empty() ||
-        name.chars().any(|c|
-            "$()*+?[]^{|}\x7F".contains(c) ||
-                '\x00' <= c && c <= '\x1F')
-}
-
-pub fn to_engine_msg<T>(msg: T) -> String
-    where T: Iterator<Item = u8> + Clone
-{
-    let mut tmp = Vec::new();
-    tmp.push(msg.clone().count() as u8);
-    tmp.extend(msg);
-    encode(&tmp)
-}
-
-pub fn protocol_version_string(protocol_number: u16) -> &'static str {
-    match protocol_number {
-        17 => "0.9.7-dev",
-        19 => "0.9.7",
-        20 => "0.9.8-dev",
-        21 => "0.9.8",
-        22 => "0.9.9-dev",
-        23 => "0.9.9",
-        24 => "0.9.10-dev",
-        25 => "0.9.10",
-        26 => "0.9.11-dev",
-        27 => "0.9.11",
-        28 => "0.9.12-dev",
-        29 => "0.9.12",
-        30 => "0.9.13-dev",
-        31 => "0.9.13",
-        32 => "0.9.14-dev",
-        33 => "0.9.14",
-        34 => "0.9.15-dev",
-        35 => "0.9.14.1",
-        37 => "0.9.15",
-        38 => "0.9.16-dev",
-        39 => "0.9.16",
-        40 => "0.9.17-dev",
-        41 => "0.9.17",
-        42 => "0.9.18-dev",
-        43 => "0.9.18",
-        44 => "0.9.19-dev",
-        45 => "0.9.19",
-        46 => "0.9.20-dev",
-        47 => "0.9.20",
-        48 => "0.9.21-dev",
-        49 => "0.9.21",
-        50 => "0.9.22-dev",
-        51 => "0.9.22",
-        52 => "0.9.23-dev",
-        53 => "0.9.23",
-        54 => "0.9.24-dev",
-        55 => "0.9.24",
-        56 => "0.9.25-dev",
-        _ => "Unknown"
-    }
-}
\ No newline at end of file
--- a/hedgewars/ArgParsers.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/ArgParsers.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -87,10 +87,12 @@
     WriteLn(stdout, 'Graphics:');
     WriteLn(stdout, '  --width <width in pixels>: Set game window width');
     WriteLn(stdout, '  --height <height in pixels>: Set game window height');
+    WriteLn(stdout, '  --maximized: Start in maximized window');
     WriteLn(stdout, '  --fullscreen: Start in fullscreen');
     WriteLn(stdout, '  --fullscreen-width <width in pixels>: Set fullscreen width');
     WriteLn(stdout, '  --fullscreen-height <height in pixels>: Set fullscreen height');
     WriteLn(stdout, '  --low-quality: Lowers the game quality');
+    WriteLn(stdout, '  --zoom <percent>: Start with custom zoom level');
     WriteLn(stdout, '');
     WriteLn(stdout, 'Audio:');
     WriteLn(stdout, '  --volume <sound level>: Set volume between 0 and 100');
@@ -128,14 +130,6 @@
     helpCommandUsed:= true;
 end;
 
-procedure setDepth(var paramIndex: LongInt);
-begin
-    WriteLn(stdout, 'WARNING: --depth is a deprecated command, which could be removed in a future version!');
-    WriteLn(stdout, '         This option no longer does anything, please consider removing it.');
-    WriteLn(stdout, '');
-   inc(ParamIndex);
-end;
-
 procedure statsOnlyGame;
 begin
     cOnlyStats:= true;
@@ -231,21 +225,31 @@
     getstringParameter:= str;
 end;
 
-procedure parseClassicParameter(cmdarray: array of string; size:LongInt; var paramIndex:LongInt); forward;
+procedure setZoom(str:shortstring; var paramIndex:LongInt; var wrongParameter:Boolean);
+var param: LongInt;
+begin
+    param:= getLongIntParameter(str, paramIndex, wrongParameter);
+
+    if param = 100 then
+        exit;
+    UserZoom:= (param/100.0) * cDefaultZoomLevel;
+
+    if UserZoom < cMaxZoomLevel then
+        UserZoom:= cMaxZoomLevel;
+    if UserZoom > cMinZoomLevel then
+        UserZoom:= cMinZoomLevel;
+    zoom:= UserZoom;
+    ZoomValue:= UserZoom;
+end;
 
 function parseParameter(cmd:string; arg:string; var paramIndex:LongInt): Boolean;
-const videoarray: array [0..4] of string = ('--fullscreen-width','--fullscreen-height', '--width', '--height', '--depth');
-      audioarray: array [0..2] of string = ('--volume','--nomusic','--nosound');
-      otherarray: array [0..2] of string = ('--locale','--fullscreen','--showfps');
-      mediaarray: array [0..9] of string = ('--fullscreen-width', '--fullscreen-height', '--width', '--height', '--depth', '--volume','--nomusic','--nosound','--locale','--fullscreen');
-      allarray: array [0..18] of string = ('--fullscreen-width','--fullscreen-height', '--width', '--height', '--depth','--volume','--nomusic','--nosound','--nodampen','--locale','--fullscreen','--showfps','--altdmg','--frame-interval','--low-quality','--no-teamtag','--no-hogtag','--no-healthtag','--translucent-tags');
-      reallyAll: array[0..37] of shortstring = (
+const reallyAll: array[0..34] of shortstring = (
                 '--prefix', '--user-prefix', '--locale', '--fullscreen-width', '--fullscreen-height', '--width',
-                '--height', '--frame-interval', '--volume','--nomusic', '--nosound', '--nodampen',
+                '--height', '--maximized', '--frame-interval', '--volume','--nomusic', '--nosound', '--nodampen',
                 '--fullscreen', '--showfps', '--altdmg', '--low-quality', '--raw-quality', '--stereo', '--nick',
-  {deprecated}  '--depth', '--set-video', '--set-audio', '--set-other', '--set-multimedia', '--set-everything',
+                '--zoom',
   {internal}    '--internal', '--port', '--recorder', '--landpreview',
-  {misc}        '--stats-only', '--gci', '--help','--protocol', '--no-teamtag','--no-hogtag','--no-healthtag','--translucent-tags','--lua-test');
+  {misc}        '--stats-only', '--gci', '--help','--protocol', '--no-teamtag','--no-hogtag','--no-healthtag','--translucent-tags','--lua-test','--no-holiday-silliness');
 var cmdIndex: byte;
 begin
     parseParameter:= false;
@@ -258,45 +262,41 @@
     case cmdIndex of
         {--prefix}               0 : PathPrefix        := getstringParameter (arg, paramIndex, parseParameter);
         {--user-prefix}          1 : UserPathPrefix    := getstringParameter (arg, paramIndex, parseParameter);
-        {--locale}               2 : cLocaleFName      := getstringParameter (arg, paramIndex, parseParameter);
+        {--locale}               2 : cLanguageFName    := getstringParameter (arg, paramIndex, parseParameter);
         {--fullscreen-width}     3 : cFullscreenWidth  := max(getLongIntParameter(arg, paramIndex, parseParameter), cMinScreenWidth);
         {--fullscreen-height}    4 : cFullscreenHeight := max(getLongIntParameter(arg, paramIndex, parseParameter), cMinScreenHeight);
         {--width}                5 : cWindowedWidth    := max(2 * (getLongIntParameter(arg, paramIndex, parseParameter) div 2), cMinScreenWidth);
         {--height}               6 : cWindowedHeight   := max(2 * (getLongIntParameter(arg, paramIndex, parseParameter) div 2), cMinScreenHeight);
-        {--frame-interval}       7 : cTimerInterval    := getLongIntParameter(arg, paramIndex, parseParameter);
-        {--volume}               8 : SetVolume          ( max(getLongIntParameter(arg, paramIndex, parseParameter), 0) );
-        {--nomusic}              9 : SetMusic           ( false );
-        {--nosound}             10 : SetSound           ( false );
-        {--nodampen}            11 : SetAudioDampen     ( false );
-        {--fullscreen}          12 : cFullScreen       := true;
-        {--showfps}             13 : cShowFPS          := true;
-        {--altdmg}              14 : cAltDamage        := true;
-        {--low-quality}         15 : cReducedQuality   := $FFFFFFFF xor rqLowRes;
-        {--raw-quality}         16 : cReducedQuality   := getLongIntParameter(arg, paramIndex, parseParameter);
-        {--stereo}              17 : setStereoMode      ( getLongIntParameter(arg, paramIndex, parseParameter) );
-        {--nick}                18 : UserNick          := parseNick( getstringParameter(arg, paramIndex, parseParameter) );
-        {deprecated options}
-        {--depth}               19 : setDepth(paramIndex);
-        {--set-video}           20 : parseClassicParameter(videoarray,5,paramIndex);
-        {--set-audio}           21 : parseClassicParameter(audioarray,3,paramIndex);
-        {--set-other}           22 : parseClassicParameter(otherarray,3,paramIndex);
-        {--set-multimedia}      23 : parseClassicParameter(mediaarray,10,paramIndex);
-        {--set-everything}      24 : parseClassicParameter(allarray,14,paramIndex);
+        {--maximized}            7 : cWindowedMaximized:= true;
+        {--frame-interval}       8 : cTimerInterval    := getLongIntParameter(arg, paramIndex, parseParameter);
+        {--volume}               9 : SetVolume          ( max(getLongIntParameter(arg, paramIndex, parseParameter), 0) );
+        {--nomusic}             10 : SetMusic           ( false );
+        {--nosound}             11 : SetSound           ( false );
+        {--nodampen}            12 : SetAudioDampen     ( false );
+        {--fullscreen}          13 : cFullScreen       := true;
+        {--showfps}             14 : cShowFPS          := true;
+        {--altdmg}              15 : cAltDamage        := true;
+        {--low-quality}         16 : cReducedQuality   := $FFFFFFFF xor rqLowRes;
+        {--raw-quality}         17 : cReducedQuality   := getLongIntParameter(arg, paramIndex, parseParameter);
+        {--stereo}              18 : setStereoMode      ( getLongIntParameter(arg, paramIndex, parseParameter) );
+        {--nick}                19 : UserNick          := parseNick( getstringParameter(arg, paramIndex, parseParameter) );
+        {--zoom}                20 : setZoom(arg, paramIndex, parseParameter);
         {"internal" options}
-        {--internal}            25 : {$IFDEF HWLIBRARY}isInternal:= true{$ENDIF};
-        {--port}                26 : setIpcPort( getLongIntParameter(arg, paramIndex, parseParameter), parseParameter );
-        {--recorder}            27 : startVideoRecording(paramIndex);
-        {--landpreview}         28 : GameType := gmtLandPreview;
+        {--internal}            21 : {$IFDEF HWLIBRARY}isInternal:= true{$ENDIF};
+        {--port}                22 : setIpcPort( getLongIntParameter(arg, paramIndex, parseParameter), parseParameter );
+        {--recorder}            23 : startVideoRecording(paramIndex);
+        {--landpreview}         24 : GameType := gmtLandPreview;
         {anything else}
-        {--stats-only}          29 : statsOnlyGame();
-        {--gci}                 30 : GciEasterEgg();
-        {--help}                31 : DisplayUsage();
-        {--protocol}            32 : DisplayProtocol();
-        {--no-teamtag}          33 : cTagsMask := cTagsMask and (not htTeamName);
-        {--no-hogtag}           34 : cTagsMask := cTagsMask and (not htName);
-        {--no-healthtag}        35 : cTagsMask := cTagsMask and (not htHealth);
-        {--translucent-tags}    36 : cTagsMask := cTagsMask or htTransparent;
-        {--lua-test}            37 : begin cTestLua := true; SetSound(false); cScriptName := getstringParameter(arg, paramIndex, parseParameter); WriteLn(stdout, 'Lua test file specified: ' + cScriptName);end;
+        {--stats-only}          25 : statsOnlyGame();
+        {--gci}                 26 : GciEasterEgg();
+        {--help}                27 : DisplayUsage();
+        {--protocol}            28 : DisplayProtocol();
+        {--no-teamtag}          29 : cTagsMask := cTagsMask and (not htTeamName);
+        {--no-hogtag}           30 : cTagsMask := cTagsMask and (not htName);
+        {--no-healthtag}        31 : cTagsMask := cTagsMask and (not htHealth);
+        {--translucent-tags}    32 : cTagsMask := cTagsMask or htTransparent;
+        {--lua-test}            33 : begin cTestLua := true; SetSound(false); cScriptName := getstringParameter(arg, paramIndex, parseParameter); WriteLn(stdout, 'Lua test file specified: ' + cScriptName);end;
+        {--no-holiday-silliness} 34 : cHolidaySilliness:= false;
     else
         begin
         //Assume the first "non parameter" is the demo file, anything else is invalid
@@ -311,48 +311,6 @@
     end;
 end;
 
-procedure parseClassicParameter(cmdarray: array of string; size:LongInt; var paramIndex:LongInt);
-var index, tmpInt: LongInt;
-    isBool, isValid: Boolean;
-    cmd, arg, newSyntax: string;
-begin
-    WriteLn(stdout, 'WARNING: You are using a deprecated command, which could be removed in a future version!');
-    WriteLn(stdout, '         Consider updating to the latest syntax, which is much more flexible!');
-    WriteLn(stdout, '         Run "hwegine --help" to learn it!');
-    WriteLn(stdout, '');
-
-    index:= 0;
-    tmpInt:= 1;
-    while (index < size) do
-        begin
-        newSyntax:= '';
-        inc(paramIndex);
-        cmd:= cmdarray[index];
-        arg:= cmdarray[paramIndex];
-        isValid:= (cmd<>'--depth');
-
-        // check if the parameter is a boolean one
-        isBool:= (cmd = '--nomusic') or (cmd = '--nosound') or (cmd = '--nodampen') or (cmd = '--fullscreen') or (cmd = '--showfps') or (cmd = '--altdmg') or (cmd = '--no-teamtag') or (cmd = '--no-hogtag') or (cmd = '--no-healthtag') or (cmd = '--translucent-tags');
-        if isBool and (arg='0') then
-            isValid:= false;
-        if (cmd='--nomusic') or (cmd='--nosound') or (cmd='--nodampen') then
-            isValid:= not isValid;
-
-        if isValid then
-            begin
-            parseParameter(cmd, arg, tmpInt);
-            newSyntax:= newSyntax + cmd + ' ';
-            if not isBool then
-                newSyntax:= newSyntax + arg + ' ';
-            end;
-        inc(index);
-        end;
-
-    WriteLn(stdout, 'Attempted to automatically convert to the new syntax:');
-    WriteLn(stdout, newSyntax);
-    WriteLn(stdout, '');
-end;
-
 procedure parseCommandLine;
 var paramIndex: LongInt;
     paramTotal: LongInt;
@@ -363,15 +321,6 @@
 
     paramIndex:= {$IFDEF HWLIBRARY}0{$ELSE}1{$ENDIF};
     paramTotal:= ParamCount; //-1 because pascal enumeration is inclusive
-    (*
-    WriteLn(stdout, 'total parameters: ' + inttostr(paramTotal));
-    tmpInt:= 0;
-    while (tmpInt <= paramTotal) do
-        begin
-        WriteLn(stdout, inttostr(tmpInt) + ': ' + {$IFDEF HWLIBRARY}argv[tmpInt]{$ELSE}paramCount(tmpInt){$ENDIF});
-        inc(tmpInt);
-        end;
-    *)
     wrongParameter:= false;
     while (paramIndex <= paramTotal) do
         begin
@@ -414,10 +363,6 @@
     if (GameType = gmtBadSyntax) then
         WriteLn(stderr, 'Please use --help to see possible arguments and their usage.');
 
-    (*
-    WriteLn(stdout,'PathPrefix:     ' + PathPrefix);
-    WriteLn(stdout,'UserPathPrefix: ' + UserPathPrefix);
-    *)
 end;
 
 end.
--- a/hedgewars/CMakeLists.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/CMakeLists.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -52,6 +52,7 @@
     uConsole.pas
     uCommands.pas
     uDebug.pas
+    uKeyNames.pas
     uInputHandler.pas
     uTextures.pas
     uRenderUtils.pas
@@ -143,13 +144,15 @@
     add_definitions(-dUSE_VIDEO_RECORDING)
 endif()
 
-find_package_or_disable_msg(PNG NOPNG "Screenshots will be saved in BMP")
-if(PNG_FOUND)
-    list(INSERT engine_sources 0 PNGh.pas)
-    list(REMOVE_AT PNG_LIBRARIES 1) #removing the zlib library path
-    get_filename_component(PNG_LIBRARY_DIR ${PNG_LIBRARIES} PATH)
-    add_flag_append(CMAKE_Pascal_FLAGS "-k-L${PNG_LIBRARY_DIR} -Fl${PNG_LIBRARY_DIR}")
-    add_definitions(-dPNG_SCREENSHOTS)
+if(NOT WIN32)
+    find_package_or_disable_msg(PNG NOPNG "Screenshots will be saved in BMP")
+    if(PNG_FOUND)
+        list(INSERT engine_sources 0 PNGh.pas)
+        list(REMOVE_AT PNG_LIBRARIES 1) #removing the zlib library path
+        get_filename_component(PNG_LIBRARY_DIR ${PNG_LIBRARIES} PATH)
+        add_flag_append(CMAKE_Pascal_FLAGS "-k-L${PNG_LIBRARY_DIR} -Fl${PNG_LIBRARY_DIR}")
+        add_definitions(-dPNG_SCREENSHOTS)
+    endif()
 endif()
 
 if(LUA_SYSTEM)
@@ -188,6 +191,7 @@
 
 if (WIN32 AND VCPKG_TOOLCHAIN)
     add_definitions(-dWIN32_VCPKG)
+    add_flag_append(CMAKE_Pascal_FLAGS_DEBUG "-dVCPKG_DEBUG")
 endif()
 
 
--- a/hedgewars/SDLh.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/SDLh.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -56,11 +56,10 @@
     type PLongInt = ^LongInt;
 {$ENDIF}
 
-
 (*  SDL  *)
 const
 {$IFDEF WINDOWS}
-    SDLLibName = 'SDL2.dll';
+    SDLLibName = {$IFDEF VCPKG_DEBUG}'SDL2d.dll'{$ELSE}'SDL2.dll'{$ENDIF};
     SDL_TTFLibName = 'SDL2_ttf.dll';
     SDL_MixerLibName = 'SDL2_mixer.dll';
     SDL_ImageLibName = 'SDL2_image.dll';
@@ -109,6 +108,10 @@
     SDL_BUTTON_X1        = 4;
     SDL_BUTTON_X2        = 5;
 
+    // SDL_ShowCursor consts
+    SDL_QUERY = -1;
+    SDL_DISABLE = 0;
+    SDL_ENABLE = 1;
 
     SDL_TEXTEDITINGEVENT_TEXT_SIZE = 32;
     SDL_TEXTINPUTEVENT_TEXT_SIZE   = 32;
@@ -247,6 +250,7 @@
     MIX_INIT_MP3        = $00000008;
     MIX_INIT_OGG        = $00000010;
     MIX_INIT_FLUIDSYNTH = $00000020;
+    MIX_INIT_OPUS       = $00000040;
 
     {* SDL_TTF *}
     TTF_STYLE_NORMAL = 0;
@@ -554,6 +558,7 @@
     TSDL_Keycode = LongInt;
     TSDL_Scancode = LongInt;
     TSDL_JoystickID = LongInt;
+    TSDL_bool = LongInt;
 
     TSDL_eventaction = (SDL_ADDEVENT, SDL_PEEPEVENT, SDL_GETEVENT);
 
@@ -1107,6 +1112,7 @@
 function  SDL_RenderReadPixels(renderer: PSDL_Renderer; rect: PSDL_Rect; format: LongInt; pixels: Pointer; pitch: LongInt): LongInt; cdecl; external SDLLibName;
 function  SDL_RenderSetViewport(window: PSDL_Window; rect: PSDL_Rect): LongInt; cdecl; external SDLLibName;
 
+function  SDL_SetRelativeMouseMode(enabled: TSDL_bool): LongInt; cdecl; external SDLLibName;
 function  SDL_GetRelativeMouseState(x, y: PLongInt): Byte; cdecl; external SDLLibName;
 function  SDL_PixelFormatEnumToMasks(format: TSDL_ArrayByteOrder; bpp: PLongInt; Rmask, Gmask, Bmask, Amask: PLongInt): Boolean; cdecl; external SDLLibName;
 
@@ -1247,6 +1253,7 @@
 function  IMG_Load_RW(rwop: PSDL_RWops; freesrc: LongBool): PSDL_Surface; cdecl; external SDL_ImageLibName;
 function  IMG_LoadPNG_RW(rwop: PSDL_RWops): PSDL_Surface; cdecl; external SDL_ImageLibName;
 function  IMG_LoadTyped_RW(rwop: PSDL_RWops; freesrc: LongBool; type_: PChar): PSDL_Surface; cdecl; external SDL_ImageLibName;
+function IMG_SavePNG(surface: PSDL_Surface; const _file: PChar): LongInt; cdecl; external SDL_ImageLibName;
 
 (*  SDL_net  *)
 function  SDLNet_Init: LongInt; cdecl; external SDL_NetLibName;
--- a/hedgewars/avwrapper/avwrapper.c	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/avwrapper/avwrapper.c	Fri Aug 16 10:59:50 2019 -0600
@@ -367,6 +367,8 @@
         VideoTime = (double)g_pVFrame->pts * g_pVStream->time_base.num/g_pVStream->time_base.den;
         do
         {
+            if (!g_pAFrame)
+                return FatalError("Error while writing video frame: g_pAFrame does not exist");
             AudioTime = (double)g_pAFrame->pts * g_pAStream->time_base.num/g_pAStream->time_base.den;
             ret = WriteAudioFrame();
         }
--- a/hedgewars/hwengine.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/hwengine.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -36,6 +36,7 @@
      {$IFDEF USE_VIDEO_RECORDING}, uVideoRec {$ENDIF}
      {$IFDEF USE_TOUCH_INTERFACE}, uTouch {$ENDIF}
      {$IFDEF ANDROID}, GLUnit{$ENDIF}
+     {$IFDEF UNIX}, clocale{$ENDIF}
      {$IFDEF WINDOWS}, dynlibs{$ENDIF}
      ;
 
@@ -105,6 +106,7 @@
             PlayMusic;
             InitZoom(zoom);
             ScriptCall('onGameStart');
+            RandomizeHHAnim;
             for t:= 0 to Pred(TeamsCount) do
                 with TeamsArray[t]^ do
                     MaxTeamHealth:= TeamHealth;
@@ -228,11 +230,14 @@
                                 begin
                                 if GameState = gsSuspend then
                                     GameState:= previousGameState;
+                                cWindowedMaximized:= false;
 {$IFDEF ANDROID}
                                 //This call is used to reinitialize the glcontext and reload the textures
                                 ParseCommand('fullscr '+intToStr(LongInt(cFullScreen)), true);
 {$ENDIF}
                                 end;
+                        SDL_WINDOWEVENT_MAXIMIZED:
+                                cWindowedMaximized:= true;
                         SDL_WINDOWEVENT_RESIZED:
                                 begin
                                 cNewScreenWidth:= max(2 * (event.window.data1 div 2), cMinScreenWidth);
@@ -252,19 +257,21 @@
                 SDL_FINGERUP:
                     onTouchUp(event.tfinger.x, event.tfinger.y, event.tfinger.fingerId);
 {$ELSE}
+                SDL_MOUSEMOTION:
+                    ProcessMouseMotion(event.motion.xrel, event.motion.yrel);
+
                 SDL_MOUSEBUTTONDOWN:
                     if GameState = gsConfirm then
                         ParseCommand('quit', true)
                     else
-                        if (GameState >= gsGame) then ProcessMouse(event.button, true);
+                        if (GameState >= gsGame) then ProcessMouseButton(event.button, true);
 
                 SDL_MOUSEBUTTONUP:
-                    if (GameState >= gsGame) then ProcessMouse(event.button, false);
+                    if (GameState >= gsGame) then ProcessMouseButton(event.button, false);
 
                 SDL_MOUSEWHEEL:
                     begin
                     wheelEvent:= true;
-                    //ProcessMouseWheel(event.wheel.x, event.wheel.y);
                     ProcessMouseWheel(event.wheel.y);
                     end;
 {$ENDIF}
@@ -286,7 +293,7 @@
             ResetMouseWheel();
 
         if (CursorMovementX <> 0) or (CursorMovementY <> 0) then
-            handlePositionUpdate(CursorMovementX * cameraKeyboardSpeed, CursorMovementY * cameraKeyboardSpeed);
+            handlePositionUpdate(CursorMovementX, CursorMovementY);
 
         if (cScreenResizeDelay <> 0) and (cScreenResizeDelay < RealTicks) and
            ((cNewScreenWidth <> cScreenWidth) or (cNewScreenHeight <> cScreenHeight)) then
@@ -298,12 +305,18 @@
             cScreenHeight:= cWindowedHeight;
 
             ParseCommand('fullscr '+intToStr(LongInt(cFullScreen)), true);
-            WriteLnToConsole('window resize: ' + IntToStr(cScreenWidth) + ' x ' + IntToStr(cScreenHeight));
+            if cWindowedMaximized then
+                WriteLnToConsole('window resize: ' + IntToStr(cScreenWidth) + ' x ' + IntToStr(cScreenHeight) + ' (maximized)')
+            else
+                WriteLnToConsole('window resize: ' + IntToStr(cScreenWidth) + ' x ' + IntToStr(cScreenHeight));
             ScriptOnScreenResize();
             InitCameraBorders();
             InitTouchInterface();
             InitZoom(zoomValue);
-            SendIPC('W' + IntToStr(cScreenWidth) + 'x' + IntToStr(cScreenHeight));
+            if cWindowedMaximized then
+                SendIPC('W' + IntToStr(cScreenWidth) + 'x' + IntToStr(cScreenHeight) + 'M')
+            else
+                SendIPC('W' + IntToStr(cScreenWidth) + 'x' + IntToStr(cScreenHeight));
         end;
 
         CurrTime:= SDL_GetTicks();
@@ -327,6 +340,9 @@
     DoTimer(0); // gsLandGen -> gsStart
     DoTimer(0); // gsStart -> gsGame
 
+    newGameTicks:= 0;
+    newRealTicks:= 0;
+
     if not LoadNextCameraPosition(newRealTicks, newGameTicks) then
         exit;
     fastScrolling:= true;
@@ -354,7 +370,6 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 procedure GameRoutine;
-//var p: TPathType;
 var s: shortstring;
     i: LongInt;
 begin
@@ -380,9 +395,8 @@
         end;
 
     if not allOK then exit;
-    //SDL_StartTextInput();
-    SDL_ShowCursor(0);
 
+    SDL_ShowCursor(SDL_DISABLE);
 
 {$IFDEF USE_VIDEO_RECORDING}
     if GameType = gmtRecord then
@@ -402,16 +416,16 @@
     if not allOK then exit;
 
     LoadLocale(cPathz[ptLocale] + '/en.txt');  // Do an initial load with english
-    if cLocaleFName <> 'en.txt' then
+    if cLanguageFName <> 'en.txt' then
         begin
         // Try two letter locale first before trying specific locale overrides
-        if (Length(cLocale) > 3) and (Copy(cLocale, 1, 2) <> 'en') then
+        if (Length(cLanguage) > 3) and (Copy(cLanguage, 1, 2) <> 'en') then
             begin
-            LoadLocale(cPathz[ptLocale] + '/' + Copy(cLocale, 1, 2) + '.txt')
+            LoadLocale(cPathz[ptLocale] + '/' + Copy(cLanguage, 1, 2) + '.txt')
             end;
-        LoadLocale(cPathz[ptLocale] + '/' + cLocaleFName)
+        LoadLocale(cPathz[ptLocale] + '/' + cLanguageFName)
         end
-    else cLocale := 'en';
+    else cLanguage := 'en';
 
     if not allOK then exit;
     WriteLnToConsole(msgGettingConfig);
@@ -450,7 +464,6 @@
 
     isDeveloperMode:= false;
     if checkFails(InitStepsFlags = cifAllInited, 'Some parameters not set (flags = ' + inttostr(InitStepsFlags) + ')', true) then exit;
-    //ParseCommand('rotmask', true);
     if not allOK then exit;
 
 {$IFDEF USE_VIDEO_RECORDING}
@@ -659,7 +672,7 @@
     init(argc, argv);
 {$ENDIF}
 {$IFNDEF PAS2C}
-    // Custom procedure for unhandled exceptions; ExceptProc is used by sysutils module
+    // Custom procedure for unhandled exceptions; ExceptProc is used by SysUtils module
     ExceptProc:= @catchUnhandledException;
 {$ENDIF}
 
--- a/hedgewars/pas2cRedo.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/pas2cRedo.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -48,6 +48,8 @@
 
     Handle = integer;
 
+    TDateTime = double;
+
 var
     write, writeLn, read, readLn, flush, CreateDir: procedure;
 
@@ -84,7 +86,8 @@
 
      min, max:function:integer;
     assign, rewrite, rewrite_2, reset, reset_2, flush, BlockWrite, BlockRead, close : procedure;
-    FileExists, DirectoryExists, eof : function : boolean;
+    FileSize : function: Int64;
+    FileExists, DirectoryExists, eof, DeleteFile : function : boolean;
 
     ParamCount : function : integer;
     ParamStr : function : string;
@@ -114,3 +117,4 @@
 
     GetCurrentDir : function : PChar;
 
+    glShaderSource : procedure;
--- a/hedgewars/pas2cSystem.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/pas2cSystem.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -90,14 +90,15 @@
     glBindRenderbufferEXT, glRenderbufferStorageEXT,
     glFramebufferRenderbufferEXT, glFramebufferTexture2DEXT,
     glUniformMatrix4fv, glVertexAttribPointer, glCreateShader,
-    glShaderSource, glCompileShader, glGetShaderiv, glGetShaderInfoLog,
+    {glShaderSource, }glCompileShader, glGetShaderiv, glGetShaderInfoLog,
     glCreateProgram, glAttachShader, glBindAttribLocation, glLinkProgram,
     glDeleteShader, glGetProgramiv, glGetProgramInfoLog, glUseProgram,
     glUniform1i, glGetUniformLocation, glEnableVertexAttribArray,
     glGetError, glDeleteProgram, glDeleteBuffers,
     glGenBuffers, glBufferData, glBindBuffer, glewInit,
     glUniform4f, glDisableVertexAttribArray, glTexEnvi,
-    glLoadMatrixf, glMultMatrixf, glGetFloatv: procedure;
+    glLoadMatrixf, glMultMatrixf, glGetFloatv,
+    glDrawBuffer, glReadBuffer: procedure;
 
     GL_BGRA, GL_BLEND, GL_CLAMP_TO_EDGE, GL_COLOR_ARRAY,
     GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, GL_DEPTH_COMPONENT,
@@ -115,7 +116,7 @@
     GL_INFO_LOG_LENGTH, GL_LINK_STATUS, GL_VERTEX_SHADER, GL_FRAGMENT_SHADER,
     GL_NO_ERROR, GL_ARRAY_BUFFER, GL_STATIC_DRAW, GLEW_OK,
     GL_AUX_BUFFERS, GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE, GL_ADD,
-    GL_MODELVIEW_MATRIX: integer;
+    GL_MODELVIEW_MATRIX, GL_AUX0, GL_BACK: integer;
 
     TThreadId : function : integer;
 
--- a/hedgewars/uAI.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uAI.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -484,7 +484,7 @@
 
             // Hog has no idea what to do. Use tardis or skip
             if not bonuses.activity then
-                if (((GameFlags and gfInfAttack) <> 0) or (not isInMultiShoot)) and ((HHHasAmmo(Me^.Hedgehog^, amTardis) > 0)) and (CanUseTardis(Me^.Hedgehog^.Gear)) and (random(4) < 3) then
+                if (((GameFlags and gfInfAttack) <> 0) or (CurrentHedgehog^.MultiShootAttacks = 0)) and (HHHasAmmo(Me^.Hedgehog^, amTardis) > 0) and (CanUseTardis(Me^.Hedgehog^.Gear)) and (random(4) < 3) then
                     // Tardis brings hog to a random place. Perfect for clueless AI
                     begin
                     AddAction(BestActions, aia_Weapon, Longword(amTardis), 80, 0, 0);
--- a/hedgewars/uAIMisc.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uAIMisc.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -241,7 +241,7 @@
             gtMine: begin
                 if (Gear^.State and gstMoving) <> 0 then bonuses.activity:= true;
 
-                if ((Gear^.State and gstAttacking) = 0) and (((cMineDudPercent < 90) and (Gear^.Health <> 0))
+                if ((Gear^.State and gstAttacking) = 0) and (((cMineDudPercent < 90) or ((Gear^.State and gstWait) <> 0) and (Gear^.Health <> 0))
                 or (isAfterAttack and (Gear^.Health = 0) and (Gear^.Damage > 30))) then
                     AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 50, -50)
                 else if (Gear^.State and gstAttacking) <> 0 then
--- a/hedgewars/uAmmos.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uAmmos.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -126,21 +126,23 @@
             end;
         ammos[a]:= cnt;
 
-        if ((GameFlags and gfKing) <> 0) and ((GameFlags and gfPlaceHog) = 0)
-        and (Ammoz[a].SkipTurns = 0) and (a <> amTeleport) and (a <> amSkip) then
-            Ammoz[a].SkipTurns:= 1;
-
-        if ((GameFlags and gfPlaceHog) <> 0)
+        if (((GameFlags and gfPlaceHog) <> 0)
+        or (((GameFlags and gfKing) <> 0) and ((GameFlags and gfPlaceHog) = 0)))
         and (a <> amTeleport) and (a <> amSkip)
         and (Ammoz[a].SkipTurns < 10000) then
             inc(Ammoz[a].SkipTurns,10000);
-    if ((GameFlags and gfPlaceHog) <> 0) and (a = amTeleport) then
+    if (((GameFlags and gfPlaceHog) <> 0)
+    or (((GameFlags and gfKing) <> 0) and ((GameFlags and gfPlaceHog) = 0)))
+    and (a = amTeleport) then
         ammos[a]:= AMMO_INFINITE
         end
 
     else
         ammos[a]:= AMMO_INFINITE;
-    if ((GameFlags and gfPlaceHog) <> 0) and (a = amTeleport) then
+
+    if (((GameFlags and gfPlaceHog) <> 0)
+    or (((GameFlags and gfKing) <> 0) and ((GameFlags and gfPlaceHog) = 0)))
+    and (a = amTeleport) then
         begin
         InitialCountsLocal[Pred(StoreCnt)][a]:= cnt;
         InitialAmmoCounts[a]:= cnt;
@@ -402,7 +404,9 @@
     CurWeapon:= GetCurAmmoEntry(Hedgehog);
     OldWeapon:= GetCurAmmoEntry(Hedgehog);
 
-    if (CurWeapon^.Count = 0) then
+    if (Hedgehog.Gear^.State and gstHHDriven) = 0 then
+        Hedgehog.CurAmmoType:= amNothing
+    else if (CurWeapon^.Count = 0) then
         SwitchToFirstLegalAmmo(Hedgehog)
     else if CurWeapon^.AmmoType = amNothing then
         Hedgehog.CurAmmoType:= amNothing;
@@ -425,7 +429,8 @@
             s:= s + ansistring(' (' + IntToStr(Count) + ')');
         if (Propz and ammoprop_Timerable) <> 0 then
             s:= s + ansistring(', ' + IntToStr(Timer div 1000) + ' ') + trammo[sidSeconds];
-        AddCaption(s, Team^.Clan^.Color, capgrpAmmoinfo);
+        if (Hedgehog.Gear^.State and gstHHDriven) <> 0 then
+            AddCaption(s, Team^.Clan^.Color, capgrpAmmoinfo);
         if (Propz and ammoprop_NeedTarget) <> 0 then
             begin
             if Gear <> nil then Gear^.State:= Gear^.State or      gstChooseTarget;
@@ -496,7 +501,7 @@
     ammoReinforcement:= s;
 end;
 
-// Restore indefinitely disabled weapons and initial weapon counts.  Only used for hog placement right now
+// Restore indefinitely disabled weapons and initial weapon counts.
 procedure ResetWeapons;
 var i, t: Longword;
     a: TAmmoType;
--- a/hedgewars/uChat.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uChat.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -35,7 +35,8 @@
 procedure TextInput(var event: TSDL_TextInputEvent);
 
 implementation
-uses uInputHandler, uTypes, uVariables, uCommands, uUtils, uTextures, uRender, uIO, uScript, uRenderUtils, uLocale;
+uses uInputHandler, uTypes, uVariables, uCommands, uUtils, uTextures, uRender, uIO, uScript, uRenderUtils, uLocale
+     {$IFDEF USE_VIDEO_RECORDING}, uVideoRec{$ENDIF};
 
 const MaxStrIndex = 27;
       MaxInputStrLen = 200;
@@ -366,7 +367,7 @@
             // default to current hedgehog (if own) or first hedgehog
             if SpeechHogNumber = 0 then
                 begin
-                if not CurrentTeam^.ExtDriven then
+                if (not CurrentTeam^.ExtDriven) and (not CurrentHedgehog^.Unplaced) then
                     SpeechHogNumber:= CurrentTeam^.CurrHedgehog + 1
                 else
                     SpeechHogNumber:= 1;
@@ -548,7 +549,15 @@
 
     if (copy(s, 2, 3) = 'lua') then
         begin
+        LuaCmdUsed:= true;
         AddFileLog('/lua issued');
+{$IFDEF USE_VIDEO_RECORDING}
+        if flagPrerecording then
+            begin
+            AddFileLog('Force-stopping prerecording! Lua commands can not be recorded');
+            StopPreRecording;
+            end;
+{$ENDIF}
         if gameType <> gmtNet then
             begin
             liveLua:= (not liveLua);
@@ -589,6 +598,15 @@
         exit
         end;
 
+    if (copy(s, 2, 9) = 'help room') then
+        begin
+        if (gameType = gmtNet) then
+            SendConsoleCommand('/help')
+        else
+            AddChatString(#0 + shortstring(trcmd[sidCmdHelpRoomFail]));
+        exit;
+        end;
+
     if (copy(s, 2, 4) = 'help') then
         begin
         AddChatString(#3 + shortstring(trcmd[sidCmdHeaderBasic]));
@@ -608,6 +626,8 @@
         AddChatString(#3 + shortstring(trcmd[sidCmdHistory]));
         AddChatString(#3 + shortstring(trcmd[sidCmdHelp]));
         AddChatString(#3 + shortstring(trcmd[sidCmdHelpTaunts]));
+        if gameType = gmtNet then
+            AddChatString(#3 + shortstring(trcmd[sidCmdHelpRoom]));
         exit
         end;
 
--- a/hedgewars/uCollisions.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uCollisions.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -96,8 +96,10 @@
 function  CalcSlopeNearGear(Gear: PGear; dirX, dirY: LongInt): hwFloat;
 function  CalcSlopeTangent(Gear: PGear; collisionX, collisionY: LongInt; var outDeltaX, outDeltaY: LongInt; TestWord: LongWord): boolean;
 
+function CheckGearsUnderSprite(Sprite: TSprite; sprX, sprY, Frame: LongInt): boolean;
+
 implementation
-uses uConsts, uLandGraphics, uVariables;
+uses uConsts, uLandGraphics, uVariables, SDLh, uLandTexture, uDebug;
 
 type TCollisionEntry = record
     X, Y, Radius: LongInt;
@@ -501,7 +503,7 @@
             begin
             if Land[y, x] and Gear^.CollisionMask <> 0 then
                 begin
-                if ((Land[y, x] and Gear^.CollisionMask) and lfNotObjMask) <> 0 then
+                if ((Land[y, x] and Gear^.CollisionMask) and lfLandMask) <> 0 then
                     exit(Land[y, x] and Gear^.CollisionMask)
                 else
                     pixel:= Land[y, x] and Gear^.CollisionMask;
@@ -567,7 +569,7 @@
     if (x and LAND_WIDTH_MASK) = 0 then
         if Land[y, x] > 0 then
             begin
-            if ((Land[y, x] and Gear^.CollisionMask) and lfNotObjMask) <> 0 then
+            if ((Land[y, x] and Gear^.CollisionMask) and lfLandMask) <> 0 then
                 exit(Land[y, x] and Gear^.CollisionMask)
             else // if Land[y, x] <> 0 then
                 pixel:= Land[y, x] and Gear^.CollisionMask;
@@ -642,7 +644,7 @@
     i:= y + Gear^.Radius * 2 - 2;
     repeat
         if (y and LAND_HEIGHT_MASK) = 0 then
-            if ((Land[y, x] and Gear^.CollisionMask) and lfNotObjMask) <> 0 then
+            if ((Land[y, x] and Gear^.CollisionMask) and lfLandMask) <> 0 then
                 exit(Land[y, x] and Gear^.CollisionMask);
     inc(y)
     until (y > i);
@@ -665,7 +667,7 @@
     i:= x + Gear^.Radius * 2 - 2;
     repeat
         if (x and LAND_WIDTH_MASK) = 0 then
-            if ((Land[y, x] and Gear^.CollisionMask) and lfNotObjMask) <> 0 then
+            if ((Land[y, x] and Gear^.CollisionMask) and lfLandMask) <> 0 then
                 exit(Land[y, x] and Gear^.CollisionMask);
     inc(x)
     until (x > i);
@@ -981,7 +983,7 @@
     i:= x + Gear^.Radius * 2 - 2;
     repeat
     if (x and LAND_WIDTH_MASK) = 0 then
-        if (Land[y, x] and lfNotObjMask) <> 0 then
+        if (Land[y, x] and lfLandMask) <> 0 then
             if (not isColl) or (abs(x-gx) < abs(collX-gx)) then
                 begin
                 isColl:= true;
@@ -1020,6 +1022,66 @@
 CalcSlopeBelowGear := _0;
 end;
 
+function CheckGearsUnderSprite(Sprite: TSprite; sprX, sprY, Frame: LongInt): boolean;
+var x, y, bpp, h, w, row, col, gx, gy, r, numFramesFirstCol: LongInt;
+    p: PByteArray;
+    Image: PSDL_Surface;
+    Gear: PGear;
+begin
+    CheckGearsUnderSprite := false;
+    if checkFails(SpritesData[Sprite].Surface <> nil, 'Assert SpritesData[Sprite].Surface failed', true) then exit;
+
+    numFramesFirstCol:= SpritesData[Sprite].imageHeight div SpritesData[Sprite].Height;
+    Image:= SpritesData[Sprite].Surface;
+
+    if SDL_MustLock(Image) then
+        if SDLCheck(SDL_LockSurface(Image) >= 0, 'CheckGearsUnderSprite', true) then exit;
+
+    bpp:= Image^.format^.BytesPerPixel;
+
+    if checkFails(bpp = 4, 'It should be 32 bpp sprite', true) then
+        begin
+        if SDL_MustLock(Image) then
+            SDL_UnlockSurface(Image);
+        exit
+        end;
+
+    w:= SpritesData[Sprite].Width;
+    h:= SpritesData[Sprite].Height;
+
+    row:= Frame mod numFramesFirstCol;
+    col:= Frame div numFramesFirstCol;
+    p:= PByteArray(@(PByteArray(Image^.pixels)^[ Image^.pitch * row * h + col * w * 4 ]));
+    Gear:= GearsList;
+
+    while Gear <> nil do
+        begin
+        if (Gear^.Kind = gtAirMine) or
+            ((Gear^.Kind in [gtCase, gtExplosives, gtTarget, gtKnife, gtMine, gtHedgehog, gtSMine]) and (Gear^.CollisionIndex = -1)) then
+            begin
+            gx:= hwRound(Gear^.X);
+            gy:= hwRound(Gear^.Y);
+            r:= Gear^.Radius + 1;
+            if (gx + r >= sprX) and (gx - r < sprX + w) and (gy + r >= sprY) and (gy - r < sprY + h) then
+                for y := gy - r to gy + r do
+                    for x := gx - r to gx + r do
+                        begin
+                        if (x >= sprX) and (x < sprX + w) and (y >= sprY) and (y < sprY + h)
+                        and (Sqr(x - gx) + Sqr(y - gy) <= Sqr(r))
+                        and (((PLongword(@(p^[Image^.pitch * (y - sprY) + (x - sprX) * 4]))^) and AMask) <> 0) then
+                            begin
+                            CheckGearsUnderSprite := true;
+                            if SDL_MustLock(Image) then
+                                SDL_UnlockSurface(Image);
+                            exit
+                            end
+                        end
+            end;
+
+        Gear := Gear^.NextGear
+        end;
+end;
+
 procedure initModule;
 begin
     Count:= 0;
--- a/hedgewars/uCommandHandlers.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uCommandHandlers.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -73,6 +73,8 @@
     s:= s; // avoid compiler hint
     if GameState = gsConfirm then
         begin
+        if (luaCmdUsed) then
+            SendIPC(_S'm');
         SendIPC(_S'Q');
         GameState:= gsExit
         end
@@ -81,6 +83,8 @@
 procedure chHalt (var s: shortstring);
 begin
     s:= s; // avoid compiler hint
+    if (luaCmdUsed) then
+        SendIPC(_S'm');
     SendIPC(_S'H');
     GameState:= gsExit
 end;
@@ -125,53 +129,53 @@
 procedure chCurU_p(var s: shortstring);
 begin
 s:= s; // avoid compiler hint
-CursorMovementY:= -1;
+updateCursorMovementDelta((LocalMessage and gmPrecise) <> 0, -1, CursorMovementY);
 end;
 
 procedure chCurU_m(var s: shortstring);
 begin
 s:= s; // avoid compiler hint
 if CursorMovementY < 0 then
-    CursorMovementY:= 0;
+    updateCursorMovementDelta((LocalMessage and gmPrecise) <> 0, 0, CursorMovementY);
 end;
 
 procedure chCurD_p(var s: shortstring);
 begin
 s:= s; // avoid compiler hint
-CursorMovementY:= 1;
+updateCursorMovementDelta((LocalMessage and gmPrecise) <> 0, 1, CursorMovementY);
 end;
 
 procedure chCurD_m(var s: shortstring);
 begin
 s:= s; // avoid compiler hint
 if CursorMovementY > 0 then
-    CursorMovementY:= 0;
+    updateCursorMovementDelta((LocalMessage and gmPrecise) <> 0, 0, CursorMovementY);
 end;
 
 procedure chCurL_p(var s: shortstring);
 begin
 s:= s; // avoid compiler hint
-CursorMovementX:= -1;
+updateCursorMovementDelta((LocalMessage and gmPrecise) <> 0, -1, CursorMovementX);
 end;
 
 procedure chCurL_m(var s: shortstring);
 begin
 s:= s; // avoid compiler hint
 if CursorMovementX < 0 then
-    CursorMovementX:= 0;
+    updateCursorMovementDelta((LocalMessage and gmPrecise) <> 0, 0, CursorMovementX);
 end;
 
 procedure chCurR_p(var s: shortstring);
 begin
 s:= s; // avoid compiler hint
-CursorMovementX:= 1;
+updateCursorMovementDelta((LocalMessage and gmPrecise) <> 0, 1, CursorMovementX);
 end;
 
 procedure chCurR_m(var s: shortstring);
 begin
 s:= s; // avoid compiler hint
 if CursorMovementX > 0 then
-    CursorMovementX:= 0;
+    updateCursorMovementDelta((LocalMessage and gmPrecise) <> 0, 0, CursorMovementX);
 end;
 
 procedure chLeft_p(var s: shortstring);
@@ -478,6 +482,11 @@
     if CheckNoTeamOrHH then
         exit;
 
+    (* Use "~" (ASCII character 126) as synonym for NUL byte (=amNothing).
+    This is done to allow to add "setweap ~" in QTfrontend/binds.cpp because
+    the NUL byte would terminate the strings in C++ otherwise. *)
+    if (s[1] = '~') then
+        s[1]:= #0;
     if checkFails((s[0] = #1) and (s[1] <= char(High(TAmmoType))), 'Malformed /setweap', true) then exit;
 
     if not isExternalSource then
@@ -587,16 +596,32 @@
     end
 end;
 
-procedure chVol_p(var s: shortstring);
+procedure chVolUp_p(var s: shortstring);
+begin
+s:= s; // avoid compiler hint
+cVolumeUpKey:= true;
+updateVolumeDelta((LocalMessage and gmPrecise) <> 0);
+end;
+
+procedure chVolUp_m(var s: shortstring);
 begin
 s:= s; // avoid compiler hint
-inc(cVolumeDelta, 3)
+cVolumeUpKey:= false;
+updateVolumeDelta((LocalMessage and gmPrecise) <> 0);
 end;
 
-procedure chVol_m(var s: shortstring);
+procedure chVolDown_p(var s: shortstring);
 begin
 s:= s; // avoid compiler hint
-dec(cVolumeDelta, 3)
+cVolumeDownKey:= true;
+updateVolumeDelta((LocalMessage and gmPrecise) <> 0);
+end;
+
+procedure chVolDown_m(var s: shortstring);
+begin
+s:= s; // avoid compiler hint
+cVolumeDownKey:= false;
+updateVolumeDelta((LocalMessage and gmPrecise) <> 0);
 end;
 
 procedure chMute(var s: shortstring);
@@ -713,21 +738,32 @@
 procedure chZoomIn(var s: shortstring);
 begin
     s:= s; // avoid compiler hint
-    if ZoomValue < cMinZoomLevel then
+    if (LocalMessage and gmPrecise <> 0) then
+        ZoomValue:= ZoomValue + cZoomDeltaSmall
+    else
         ZoomValue:= ZoomValue + cZoomDelta;
+    if ZoomValue > cMinZoomLevel then
+        ZoomValue:= cMinZoomLevel;
 end;
 
 procedure chZoomOut(var s: shortstring);
 begin
     s:= s; // avoid compiler hint
-    if ZoomValue > cMaxZoomLevel then
+    if (LocalMessage and gmPrecise <> 0) then
+        ZoomValue:= ZoomValue - cZoomDeltaSmall
+    else
         ZoomValue:= ZoomValue - cZoomDelta;
+    if ZoomValue < cMaxZoomLevel then
+        ZoomValue:= cMaxZoomLevel;
 end;
 
 procedure chZoomReset(var s: shortstring);
 begin
     s:= s; // avoid compiler hint
-    ZoomValue:= cDefaultZoomLevel;
+    if (LocalMessage and gmPrecise <> 0) then
+        ZoomValue:= cDefaultZoomLevel
+    else
+        ZoomValue:= UserZoom;
 end;
 
 procedure chMapGen(var s: shortstring);
@@ -785,6 +821,11 @@
 cHealthDecrease:= StrToInt(s)
 end;
 
+procedure chInitHealth(var s: shortstring);
+begin
+cInitHealth:= StrToInt(s)
+end;
+
 procedure chDamagePercent(var s: shortstring);
 begin
 cDamagePercent:= StrToInt(s)
@@ -853,6 +894,11 @@
   CampaignVariable := s;
 end;
 
+procedure chMissVar(var s:shortstring);
+begin
+  MissionVariable := s;
+end;
+
 procedure chWorldEdge(var s: shortstring);
 begin
 WorldEdge:= TWorldEdge(StrToInt(s))
@@ -878,6 +924,12 @@
     HideMission();
 end;
 
+procedure chGearInfo(var s: shortstring);
+begin
+  s:= s; // avoid compiler hint
+  isShowGearInfo:= not isShowGearInfo;
+end;
+
 procedure initModule;
 begin
 //////// Begin top sorted by freq analysis not including chatmsg
@@ -921,6 +973,7 @@
     RegisterVariable('sd_turns', @chSuddenDTurns  , false);
     RegisterVariable('waterrise', @chWaterRise    , false);
     RegisterVariable('healthdec', @chHealthDecrease, false);
+    RegisterVariable('inithealth',@chInitHealth, false);
     RegisterVariable('damagepct',@chDamagePercent , false);
     RegisterVariable('ropepct' , @chRopePercent   , false);
     RegisterVariable('getawaytime' , @chGetAwayTime , false);
@@ -947,10 +1000,10 @@
     RegisterVariable('timer'   , @chTimer        , false, true);
     RegisterVariable('taunt'   , @chTaunt        , false);
     RegisterVariable('put'     , @chPut          , false);
-    RegisterVariable('+volup'  , @chVol_p        , true );
-    RegisterVariable('-volup'  , @chVol_m        , true );
-    RegisterVariable('+voldown', @chVol_m        , true );
-    RegisterVariable('-voldown', @chVol_p        , true );
+    RegisterVariable('+volup'  , @chVolUp_p      , true );
+    RegisterVariable('-volup'  , @chVolUp_m      , true );
+    RegisterVariable('+voldown', @chVolDown_p    , true );
+    RegisterVariable('-voldown', @chVolDown_m    , true );
     RegisterVariable('mute'    , @chMute         , true );
     RegisterVariable('findhh'  , @chFindhh       , true );
     RegisterVariable('pause'   , @chPause        , true );
@@ -963,11 +1016,13 @@
     RegisterVariable('+cur_r'  , @chCurR_p       , true );
     RegisterVariable('-cur_r'  , @chCurR_m       , true );
     RegisterVariable('campvar' , @chCampVar      , true );
+    RegisterVariable('missvar' , @chMissVar      , true );
     RegisterVariable('record'  , @chRecord       , true );
     RegisterVariable('worldedge',@chWorldEdge    , false);
     RegisterVariable('advmapgen',@chAdvancedMapGenMode, false);
     RegisterVariable('+mission', @chShowMission_p, true);
     RegisterVariable('-mission', @chShowMission_m, true);
+    RegisterVariable('gearinfo', @chGearInfo     , true );
     RegisterVariable('timer_u' , @chTimerU       , true );
 end;
 
--- a/hedgewars/uConsts.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uConsts.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -37,7 +37,6 @@
     HaltFatalError      =  52; // Fatal internal error. See logs for more. Also reports error to frontend
     HaltStartupError    =  53; // Failure loading critical resources
     HaltFatalErrorNoIPC =  54; // Fatal internal error, IPC socket is not available
-    HaltVideoRec        =  55; // Failure while video recording
 
     // for automatic tests
     HaltTestSuccess     =  0;  // Test result: success
@@ -66,17 +65,21 @@
     msgGettingConfig     = 'Getting game config...';
 
     // camera movement multipliers
-    cameraKeyboardSpeed : ShortInt = 10;
+    cameraKeyboardSpeed     : LongInt = 10;
+    cameraKeyboardSpeedSlow : LongInt =  3;
 
     // color constants
     cWhiteColorChannels : TSDL_Color = (r:$FF; g:$FF; b:$FF; a:$FF);
     cNearBlackColorChannels : TSDL_Color = (r:$00; g:$00; b:$10; a:$FF);
+    cInvertTextColorAt    : Byte = 64;
 
     cWhiteColor           : Longword = $FFFFFFFF; // white
     cNearBlackColor       : Longword = $FF000010; // nearly black
 
     capcolDefault         : Longword = $FFFFFFFF; // default caption color
     capcolSetting         : Longword = $FFCCCCCC; // caption color for changing client setting like volume or auto camera
+    capcolDefaultLua      : Longword = $FFFFFFFF; // capcolDefault for Lua
+    capcolSettingLua      : Longword = $CCCCCCFF; // capcolSetting for Lua
 
     cCentralMessageColor  : Longword = $FFFFFF00; // color of message in center of screen like quit or pause
 
@@ -154,6 +157,7 @@
 
     MAXNAMELEN = 192;
     MAXROPEPOINTS = 3840;
+    MAXROPELAYERS = 16;
 
     {$IFNDEF PAS2C}
     // some opengl headers do not have these macros
@@ -165,6 +169,7 @@
 
     cVisibleWater       : LongInt = 128;
     cTeamHealthWidth    : LongInt = 128;
+    cGearContourThreshold : LongInt = 179; // if water opacity is higher than this, draw contour for some gears when in water
 
     cifRandomize = $00000001;
     cifTheme     = $00000002;
@@ -185,6 +190,9 @@
 
     cMaxEdgePoints = 32768;
 
+    cBorderWidth = 6; // width of indestructible border
+                      // width of 3 allowed hogs to be knocked through with grenade
+
     cHHRadius = 9; // hedgehog radius
     cHHStepTicks = 29;
 
@@ -212,11 +220,13 @@
     cFontPadding = 2 * HDPIScaleFactor;
 
     cDefaultBuildMaxDist = 256; // default max. building distance with girder/rubber
+    cResurrectorDist = 100; // effect distance of resurrector
+    cSeductionDist = 250; // effect distance of seduction
 
     ExtraTime = 30000; // amount of time (ms) given for using Extra Time
 
     // do not change this value
-    cDefaultZoomLevel = 2.0;
+    cDefaultZoomLevel = 2.0; // 100% zoom
 
     // game flags
     gfAny                = $FFFFFFFF; // mask for all possible gameflags
@@ -276,6 +286,7 @@
     gstSubmersible    = $00400000; // can survive in water
     gstFrozen         = $00800000; // frozen
     gstNoGravity      = $01000000; // ignores gravity
+    gstInBounceEdge   = $02000000; // spawned in bounce edge
 
     // gear messages
     gmLeft           = $00000001; // left
@@ -336,6 +347,8 @@
                           = $00100000; // doesn't stop timer while Attacking gear msg is set and inf. attack mode is on
     ammoprop_ForceTurnEnd = $00200000; // always ends turn after usage, ignoring inf. attack
     ammoprop_NoTargetAfter= $00400000; // disable target selection after attack
+    ammoprop_NoWrapTarget = $00800000; // allow to select target beyond wrap world edge limits
+    ammoprop_ShowSelIcon  = $01000000; // show icon when selected
     ammoprop_NoRoundEnd   = $10000000; // ammo doesn't end turn
 
     AMMO_INFINITE = 100;               // internal representation of infinite ammo count
--- a/hedgewars/uCursor.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uCursor.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -1,10 +1,14 @@
+{$INCLUDE "options.inc"}
+
 unit uCursor;
 
 interface
 
 procedure init;
 procedure resetPosition;
-procedure updatePosition;
+procedure resetPositionDelta();
+procedure updatePositionDelta(xrel, yrel: LongInt);
+procedure updatePosition();
 procedure handlePositionUpdate(x, y: LongInt);
 
 implementation
@@ -13,38 +17,37 @@
 
 procedure init;
 begin
+    SDL_ShowCursor(SDL_DISABLE);
     resetPosition();
+{$IFNDEF USE_TOUCH_INTERFACE}
+    SDL_SetRelativeMouseMode(SDL_TRUE);
+{$ENDIF}
 end;
 
 procedure resetPosition;
 begin
     if GameType = gmtRecord then
         exit;
-    // Move curser by 1px in case it's already centered.
-    // The game camera in the Alpha for 0.9.23 screwed up if
-    // the game started with the mouse already being centered.
-    // This fixes it, but we might have overlooked a related
-    // bug somewhere else.
-    // No big deal since this function is (so far) only called once.
-    SDL_WarpMouse((cScreenWidth div 2) + 1, cScreenHeight div 2);
     SDL_WarpMouse(cScreenWidth div 2, cScreenHeight div 2);
+    resetPositionDelta();
+end;
+
+procedure resetPositionDelta();
+begin
+    CursorPointDelta.X:= 0;
+    CursorPointDelta.Y:= 0;
 end;
 
-procedure updatePosition;
-var x, y: LongInt;
+procedure updatePositionDelta(xrel, yrel: LongInt);
 begin
-	x:= cScreenWidth div 2;
-	y:= cScreenHeight div 2;
-    if GameType <> gmtRecord then
-        SDL_GetMouseState(@x, @y);
+    CursorPointDelta.X:= CursorPointDelta.X + xrel;
+    CursorPointDelta.Y:= CursorPointDelta.Y + yrel;
+end;
 
-    if(x <> cScreenWidth div 2) or (y <> cScreenHeight div 2) then
-    begin
-        handlePositionUpdate(x - cScreenWidth div 2, y - cScreenHeight div 2);
-
-        if cHasFocus and (GameType <> gmtRecord) then
-            SDL_WarpMouse(cScreenWidth div 2, cScreenHeight div 2);
-    end
+procedure updatePosition();
+begin
+    handlePositionUpdate(CursorPointDelta.X, CursorPointDelta.Y);
+    resetPositionDelta();
 end;
 
 procedure handlePositionUpdate(x, y: LongInt);
--- a/hedgewars/uGears.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uGears.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -46,6 +46,7 @@
 procedure FreeGearsList;
 procedure AddMiscGears;
 procedure AssignHHCoords;
+procedure RandomizeHHAnim;
 procedure StartSuddenDeath;
 function  GearByUID(uid : Longword) : PGear;
 function  IsClockRunning() : boolean;
@@ -62,11 +63,19 @@
 
 var delay: LongWord;
     delay2: LongWord;
-    step: (stInit, stDelay, stChDmg, stSweep, stTurnStats, stChWin1,
-    stTurnReact, stAfterDelay, stChWin2, stWater, stChWin3,
-    stHealth, stSpawn, stNTurn);
+    step: (stInit, stDelay1, stChDmg, stSweep, stTurnStats, stChWin1,
+    stTurnReact, stDelay2, stChWin2, stWater, stChWin3,
+    stChKing, stSuddenDeath, stDelay3, stHealth, stSpawn, stDelay4,
+    stNTurn);
     NewTurnTick: LongWord;
-    //SDMusic: shortstring;
+
+const delayInit = 50;
+      delaySDStart = 1600;
+      delaySDWarning = 1000;
+      delayDamageTagFull = 1500;
+      delayDamageTagShort = 500;
+      delayTurnReact = 800;
+      delayFinal = 100;
 
 function CheckNoDamage: boolean; // returns TRUE in case of no damaged hhs
 var Gear: PGear;
@@ -86,7 +95,7 @@
             CheckNoDamage:= false;
 
             dmg:= Gear^.Damage;
-            if Gear^.Health < dmg then
+            if (Gear^.Health < dmg) then
                 begin
                 Gear^.Active:= true;
                 Gear^.Health:= 0
@@ -105,7 +114,15 @@
             RenderHealth(Gear^.Hedgehog^);
             RecountTeamHealth(Gear^.Hedgehog^.Team);
 
+            end
+        else if ((GameFlags and gfKing) <> 0) and (not Gear^.Hedgehog^.Team^.hasKing) then
+            begin
+            Gear^.Active:= true;
+            Gear^.Health:= 0;
+            RenderHealth(Gear^.Hedgehog^);
+            RecountTeamHealth(Gear^.Hedgehog^.Team);
             end;
+
         if (not isInMultiShoot) then
             Gear^.Karma:= 0;
         Gear^.Damage:= 0
@@ -114,6 +131,34 @@
     end;
 end;
 
+function DoDelay: boolean;
+begin
+if delay <= 0 then
+    delay:= 1
+else
+    dec(delay);
+DoDelay:= delay = 0;
+end;
+
+function CheckMinionsDie: boolean;
+var Gear: PGear;
+begin
+    CheckMinionsDie:= false;
+    if (GameFlags and gfKing) = 0 then
+        exit;
+
+    Gear:= GearsList;
+    while Gear <> nil do
+        begin
+        if (Gear^.Kind = gtHedgehog) and (not Gear^.Hedgehog^.King) and (not Gear^.Hedgehog^.Team^.hasKing) then
+            begin
+            CheckMinionsDie:= true;
+            exit;
+            end;
+        Gear:= Gear^.NextGear;
+        end;
+end;
+
 procedure HealthMachine;
 var Gear: PGear;
     team: PTeam;
@@ -178,8 +223,8 @@
 end;
 
 procedure ProcessGears;
-var t: PGear;
-    i, AliveCount: LongInt;
+var t, tmpGear: PGear;
+    i, j, AliveCount: LongInt;
     s: ansistring;
     prevtime: LongWord;
     stirFallers: boolean;
@@ -231,14 +276,35 @@
             end;
         if curHandledGear^.Active then
             begin
-            if curHandledGear^.RenderTimer and (curHandledGear^.Timer > 500) and ((curHandledGear^.Timer mod 1000) = 0) then
+            if curHandledGear^.RenderTimer then
                 begin
-                FreeAndNilTexture(curHandledGear^.Tex);
-                curHandledGear^.Tex:= RenderStringTex(ansistring(inttostr(curHandledGear^.Timer div 1000)), cWhiteColor, fntSmall);
+                // Mine timer
+                if (curHandledGear^.Kind in [gtMine, gtSMine, gtAirMine]) then
+                    begin
+                    if curHandledGear^.Tex = nil then
+                        if (curHandledGear^.Karma = 1) and (not (GameType in [gmtDemo, gmtRecord])) then
+                            // Secret mine timer
+                            curHandledGear^.Tex:= RenderStringTex(trmsg[sidUnknownGearValue], $ff808080, fntSmall)
+                        else
+                            begin
+                            // Display mine timer with up to 1 decimal point of precision (rounded down)
+                            i:= curHandledGear^.Timer div 1000;
+                            j:= (curHandledGear^.Timer mod 1000) div 100;
+                            if j = 0 then
+                                curHandledGear^.Tex:= RenderStringTex(ansistring(inttostr(i)), $ff808080, fntSmall)
+                            else
+                                curHandledGear^.Tex:= RenderStringTex(ansistring(inttostr(i) + lDecimalSeparator + inttostr(j)), $ff808080, fntSmall);
+                            end
+                    end
+                // Timer of other gears
+                else if ((curHandledGear^.Timer > 500) and ((curHandledGear^.Timer mod 1000) = 0)) then
+                    begin
+                    // Display time in seconds as whole number, rounded up
+                    FreeAndNilTexture(curHandledGear^.Tex);
+                    curHandledGear^.Tex:= RenderStringTex(ansistring(inttostr(curHandledGear^.Timer div 1000)), cWhiteColor, fntSmall);
+                    end;
                 end;
             curHandledGear^.doStep(curHandledGear);
-            // might be useful later
-            //ScriptCall('onGearStep', Gear^.uid);
             end
         end
     end;
@@ -267,24 +333,25 @@
         begin
         if (not bBetweenTurns) and (not isInMultiShoot) then
             ScriptCall('onEndTurn');
+        delay:= delayInit;
         inc(step)
         end;
-    stDelay:
+    stDelay1:
         begin
-        if delay = 0 then
-            delay:= cInactDelay
-        else
-            dec(delay);
-
-        if delay = 0 then
-            inc(step)
+        if DoDelay() then
+            inc(step);
         end;
-
     stChDmg:
     if CheckNoDamage then
         inc(step)
     else
-        step:= stDelay;
+        begin
+        if (not bBetweenTurns) and (not isInMultiShoot) then
+            delay:= delayDamageTagShort
+        else
+            delay:= delayDamageTagFull;
+        step:= stDelay1;
+        end;
 
     stSweep:
     if SweepDirty then
@@ -314,22 +381,16 @@
             begin
             uStats.TurnReaction;
             uStats.TurnStatsReset;
+            delay:= delayTurnReact;
             inc(step)
             end
         else
             inc(step, 2);
         end;
 
-    stAfterDelay:
-        begin
-        if delay = 0 then
-            delay:= cInactDelay
-        else
-            dec(delay);
-
-        if delay = 0 then
-            inc(step)
-            end;
+    stDelay2:
+        if DoDelay() then
+            inc(step);
     stChWin2:
         begin
         CheckForWin();
@@ -357,39 +418,83 @@
         inc(step)
         end;
 
-    stHealth:
+    stChKing:
+        begin
+        if (not isInMultiShoot) and (CheckMinionsDie) then
+            step:= stChDmg
+        else
+            inc(step);
+        end;
+    stSuddenDeath:
         begin
-        if (cWaterRise <> 0) or (cHealthDecrease <> 0) then
-             begin
-            if (TotalRoundsPre = cSuddenDTurns) and (not SuddenDeath) and (not isInMultiShoot) then
-                StartSuddenDeath()
-            else if (TotalRoundsPre < cSuddenDTurns) and (not isInMultiShoot) then
+        if ((cWaterRise <> 0) or (cHealthDecrease <> 0)) and (not (isInMultiShoot or bBetweenTurns)) then
+            begin
+            // Start Sudden Death
+            if (TotalRoundsPre = cSuddenDTurns) and (not SuddenDeath) then
+                begin
+                StartSuddenDeath();
+                delay:= delaySDStart;
+                inc(step);
+                end
+            // Show Sudden Death warning message
+            else if (TotalRoundsPre < cSuddenDTurns) and ((LastSuddenDWarn = -2) or (LastSuddenDWarn <> TotalRoundsPre)) then
                 begin
                 i:= cSuddenDTurns - TotalRoundsPre;
                 s:= ansistring(inttostr(i));
-                if i = 1 then
-                    AddCaption(trmsg[sidRoundSD], capcolDefault, capgrpGameState)
-                else if (i = 2) or ((i > 0) and ((i mod 50 = 0) or ((i <= 25) and (i mod 5 = 0)))) then
-                    AddCaption(FormatA(trmsg[sidRoundsSD], s), capcolDefault, capgrpGameState);
-                end;
+                // X rounds before SD. X = 1, 2, 3, 5, 7, 10, 15, 20, 25, 50, 100, ...
+                if (i > 0) and ((i <= 3) or (i = 7) or ((i mod 50 = 0) or ((i <= 25) and (i mod 5 = 0)))) then
+                    begin
+                    if i = 1 then
+                        AddCaption(trmsg[sidRoundSD], capcolDefault, capgrpGameState)
+                    else
+                        AddCaption(FormatA(trmsg[sidRoundsSD], s), capcolDefault, capgrpGameState);
+                    delay:= delaySDWarning;
+                    inc(step);
+                    LastSuddenDWarn:= TotalRoundsPre;
+                    end
+                else
+                    inc(step, 2);
+                end
+            else
+                inc(step, 2);
+            end
+        else
+            inc(step, 2);
+        end;
+    stDelay3:
+        if DoDelay() then
+            inc(step);
+    stHealth:
+        begin
+        if bBetweenTurns
+        or isInMultiShoot
+        or (TotalRoundsReal = -1) then
+            inc(step)
+        else
+            begin
+            bBetweenTurns:= true;
+            HealthMachine;
+            step:= stChDmg
             end;
-            if bBetweenTurns
-            or isInMultiShoot
-            or (TotalRoundsPre = -1) then
-                inc(step)
-            else
-                begin
-                bBetweenTurns:= true;
-                HealthMachine;
-                step:= stChDmg
-                end
-            end;
+        end;
     stSpawn:
         begin
-        if not isInMultiShoot then
-            SpawnBoxOfSmth;
-        inc(step)
+        if (not isInMultiShoot) then
+            begin
+            tmpGear:= SpawnBoxOfSmth;
+            if tmpGear <> nil then
+                ScriptCall('onCaseDrop', tmpGear^.uid)
+            else
+                ScriptCall('onCaseDrop');
+            delay:= delayFinal;
+            inc(step);
+            end
+        else
+            inc(step, 2)
         end;
+    stDelay4:
+        if DoDelay() then
+            inc(step);
     stNTurn:
         begin
         if isInMultiShoot then
@@ -464,13 +569,12 @@
 
 if TurnTimeLeft > 0 then
     if IsClockRunning() then
-        //(CurrentHedgehog^.CurAmmoType in [amShotgun, amDEagle, amSniperRifle])
         begin
-        if (cHedgehogTurnTime >= 10000)
+        if (cHedgehogTurnTime > TurnTimeLeft)
         and (CurrentHedgehog^.Gear <> nil)
         and ((CurrentHedgehog^.Gear^.State and gstAttacked) = 0)
         and (not isGetAwayTime) and (ReadyTimeLeft = 0) then
-            if TurnTimeLeft = 5000 then
+            if (TurnTimeLeft = 5000) and (cHedgehogTurnTime >= 10000) then
                 PlaySoundV(sndHurry, CurrentTeam^.voicepack)
             else if TurnTimeLeft = 4000 then
                 PlaySound(sndCountdown4)
@@ -482,7 +586,7 @@
                 PlaySound(sndCountdown1);
         if ReadyTimeLeft > 0 then
             begin
-            if (ReadyTimeLeft = 2000) and (LastVoice.snd = sndNone) and (not PlacingHogs) then
+            if (ReadyTimeLeft = 2000) and (LastVoice.snd = sndNone) and (not PlacingHogs) and (not CinematicScript) then
                 AddVoice(sndComeonthen, CurrentTeam^.voicepack);
             dec(ReadyTimeLeft)
             end
@@ -552,13 +656,6 @@
             for i:= 0 to cMaxHHIndex do
                 with Hedgehogs[i] do
                     begin
-(*
-                    if (SpeechGear <> nil) then
-                        begin
-                        DeleteVisualGear(SpeechGear);  // remove to restore persisting beyond end of turn. Tiy says was too much of a gameplay issue
-                        SpeechGear:= nil
-                        end;
-*)
 
                     if (Gear <> nil) then
                         begin
@@ -583,7 +680,7 @@
         t:= t^.NextGear
         end;
 
-    if ((GameFlags and gfResetWeps) <> 0) and (not PlacingHogs) then
+    if ((GameFlags and gfResetWeps) <> 0) and (not PlacingHogs) and (not PlacingKings) then
         ResetWeapons;
 
     if (GameFlags and gfResetHealth) <> 0 then
@@ -621,6 +718,9 @@
     begin
     x:= hwRound(Gear^.X) + WorldDx;
     y:= hwRound(Gear^.Y) + WorldDy;
+    if Gear^.Kind = gtAirMine then
+        RenderAirMineGuiExtras(Gear, x, y);
+    RenderGearHealth(Gear, x, y);
     RenderGearTimer(Gear, x, y);
     if Gear^.Kind = gtHedgehog then
         RenderHHGuiExtras(Gear, x, y);
@@ -635,6 +735,7 @@
     GearsList:= nil;
     while tt <> nil do
     begin
+        FreeAndNilTexture(tt^.Tex);
         t:= tt;
         tt:= tt^.NextGear;
         Dispose(t)
@@ -684,23 +785,21 @@
 
 i:= 0;
 j:= 0;
-p:= 0; // 0 searching, 1 bad position, 2 added.
+p:= 0; // 0: good position, 1: bad position.
 unplaced:= 0;
 if cAirMines > 0 then
     Gear:= AddGear(0, 0, gtAirMine, 0, _0, _0, 0);
     while (i < cAirMines) and (j < 1000*cAirMines) do
         begin
         p:= 0;
+        if (hasBorder) or (WorldEdge = weBounce) then
+            rx:= leftX+GetRandom(rightX-leftX-16)+8
+        else
+            rx:= leftX+GetRandom(rightX-leftX+400)-200;
         if hasBorder then
-            begin
-            rx:= leftX+GetRandom(rightX-leftX-16)+8;
             ry:= topY+GetRandom(LAND_HEIGHT-topY-16)+8
-            end
         else
-            begin
-            rx:= leftX+GetRandom(rightX-leftX+400)-200;
-            ry:= topY+GetRandom(LAND_HEIGHT-topY+400)-200
-            end;
+            ry:= topY+GetRandom(LAND_HEIGHT-topY+400)-200;
         Gear^.X:= int2hwFloat(CalcWorldWrap(rx,Gear^.Radius));
         Gear^.Y:= int2hwFloat(ry);
         if CheckLandValue(rx, ry, $FFFF) and
@@ -724,9 +823,6 @@
                                 ((rdx.Round+rdy.Round < Gear^.Angle) and
                                 (hwRound(hwSqr(rdx) + hwSqr(rdy)) < sqr(Gear^.Angle))) then
                                 begin
-    // Debug line. Remove later
-    // AddFileLog('Too Close to Hog @ (' + inttostr(rx) + ',' + inttostr(ry) + ')');
-
                                 p:= 1
                                 end
                             end;
@@ -741,7 +837,9 @@
                 if i < cAirMines then
                     Gear:= AddGear(0, 0, gtAirMine, 0, _0, _0, 0)
                 end
-            end;
+            end
+        else
+            p:= 1;
         inc(j)
         end;
 if p <> 0 then DeleteGear(Gear);
@@ -776,7 +874,7 @@
     rdx:= _90-(GetRandomf*_360);
     rdy:= _90-(GetRandomf*_360);
     Gear:= AddGear(rx, ry, gtGenericFaller, gstInvisible, rdx, rdy, $FFFFFFFF);
-    // Tag=1: This allows this generic faller to be displaced randomly by events
+    // This allows this generic faller to be displaced randomly by events
     Gear^.Tag:= 1;
     end;
 
@@ -864,13 +962,15 @@
 end;
 
 procedure AssignHHCoords;
-var i, t, p, j: LongInt;
+var i, t, p, j, x, y: LongInt;
     ar: array[0..Pred(cMaxHHs)] of PHedgehog;
     Count: Longword;
     divide, sectionDivide: boolean;
 begin
 if (GameFlags and gfPlaceHog) <> 0 then
-    PlacingHogs:= true;
+    PlacingHogs:= true
+else if (GameFlags and gfKing) <> 0 then
+    PlacingKings:= true;
 
 divide:= ((GameFlags and gfDivideTeams) <> 0);
 
@@ -907,9 +1007,10 @@
                                     Unplaced:= true
                                 else
                                     FindPlace(Gear, false, t, t + playWidth div ClansCount, true);// could make Gear == nil;
+                                if PlacingKings and King then
+                                    UnplacedKing:= true;
                                 if Gear <> nil then
                                     begin
-                                    //AddCI(Gear);  uncomment if new hogs should be able to spawn on top of old ones.
                                     Gear^.Pos:= GetRandom(49);
                                     // unless the world is wrapping, make outter teams face to map center
                                     if (WorldEdge <> weWrap) and ((p = 0) or (p = ClansCount - 1)) then
@@ -942,11 +1043,11 @@
             ar[i]^.Unplaced:= true
         else
             FindPlace(ar[i]^.Gear, false, leftX, rightX, true);
+        if PlacingKings and ar[i]^.King then
+            ar[i]^.UnplacedKing:= true;
         if ar[i]^.Gear <> nil then
             begin
-            //AddCI(ar[i]^.Gear); uncomment if new hogs should be able to spawn on top of old ones
             ar[i]^.Gear^.dX.isNegative:= hwRound(ar[i]^.Gear^.X) > leftX + playWidth div 2;
-            ar[i]^.Gear^.Pos:= GetRandom(19)
             end;
         ar[i]:= ar[Count - 1];
         dec(Count)
@@ -968,13 +1069,25 @@
             with Hedgehogs[i] do
                 if (Gear <> nil) and (Gear^.State and gsttmpFlag <> 0) then
                     begin
-                    ForcePlaceOnLand(hwRound(Gear^.X) - SpritesData[sprTargetBee].Width div 2, 
-                                     hwRound(Gear^.Y) - SpritesData[sprTargetBee].Height div 2, 
-                                     sprTargetBee, 0, lfBasic, $FFFFFFFF, false, false, false);
-                    Gear^.Y:= int2hwFloat(hwRound(Gear^.Y) - 16 - Gear^.Radius);
+                    // Get flower position
+                    x:= hwRound(Gear^.X) - SpritesData[sprTargetBee].Width div 2;
+                    y:= hwRound(Gear^.Y) - SpritesData[sprTargetBee].Height div 2;
+                    // Calculate offset from map boundaries and border
+                    if hasBorder then
+                        x:= max(min(x, RightX - SpritesData[sprTargetBee].Width - cBorderWidth), LeftX + cBorderWidth)
+                    else
+                        x:= max(min(x, RightX - SpritesData[sprTargetBee].Width), LeftX);
+                    y:= max(y, TopY);
+
+                    // Place flower
+                    ForcePlaceOnLand(x, y, sprTargetBee, 0, lfBasic, $FFFFFFFF, false, false, false);
+
+                    // Place hog
+                    Gear^.Y:= int2hwFloat(hwRound(Gear^.Y) - (SpritesData[sprTargetBee].Height div 2) - Gear^.Radius);
                     AddCI(Gear);
                     Gear^.State:= Gear^.State and (not gsttmpFlag);
-                    AddFileLog('Placed flower for hog at coordinates (' + inttostr(hwRound(Gear^.X)) + ',' + inttostr(hwRound(Gear^.Y)) + ')')
+
+                    AddFileLog('Placed flower for hog at coordinates (' + inttostr(x) + ',' + inttostr(y) + ')')
                     end;
 
 
@@ -983,6 +1096,18 @@
     SortHHsByClan();
 end;
 
+// Set random pos for all hogs so their animations have different starting points
+procedure RandomizeHHAnim;
+var i, j, p: LongInt;
+begin
+    for p:= 0 to (ClansCount - 1) do
+        with SpawnClansArray[p]^ do
+            for j:= 0 to Pred(TeamsNumber) do
+                with Teams[j]^ do
+                    for i:= 0 to cMaxHHIndex do
+                        if (Hedgehogs[i].Gear <> nil) then
+                            Hedgehogs[i].Gear^.Pos:= GetRandom(19);
+end;
 
 {procedure AmmoFlameWork(Ammo: PGear);
 var t: PGear;
@@ -1006,79 +1131,94 @@
 
 
 function SpawnCustomCrateAt(x, y: LongInt; crate: TCrateType; content, cnt: Longword): PGear;
+var gear: PGear;
 begin
-    FollowGear := AddGear(x, y, gtCase, 0, _0, _0, 0);
+    gear := AddGear(x, y, gtCase, 0, _0, _0, 0);
+    if(FinishedTurnsTotal > -1) then
+        FollowGear:= gear;
     cCaseFactor := 0;
 
     if (crate <> HealthCrate) and (content > ord(High(TAmmoType))) then
         content := ord(High(TAmmoType));
 
-    FollowGear^.Power:= cnt;
+    gear^.Power:= cnt;
 
     case crate of
         HealthCrate:
             begin
-            FollowGear^.Pos := posCaseHealth;
+            gear^.Pos := posCaseHealth;
+            gear^.RenderHealth:= true;
             // health crate is smaller than the other crates
-            FollowGear^.Radius := cCaseHealthRadius;
-            FollowGear^.Health := content;
-            AddCaption(GetEventString(eidNewHealthPack), capcolDefault, capgrpAmmoInfo);
+            gear^.Radius := cCaseHealthRadius;
+            gear^.Health := content;
+            if(FinishedTurnsTotal > -1) then
+                AddCaption(GetEventString(eidNewHealthPack), capcolDefault, capgrpAmmoInfo);
             end;
         AmmoCrate:
             begin
-            FollowGear^.Pos := posCaseAmmo;
-            FollowGear^.AmmoType := TAmmoType(content);
-            AddCaption(GetEventString(eidNewAmmoPack), capcolDefault, capgrpAmmoInfo);
+            gear^.Pos := posCaseAmmo;
+            gear^.AmmoType := TAmmoType(content);
+            if(FinishedTurnsTotal > -1) then
+                AddCaption(GetEventString(eidNewAmmoPack), capcolDefault, capgrpAmmoInfo);
             end;
         UtilityCrate:
             begin
-            FollowGear^.Pos := posCaseUtility;
-            FollowGear^.AmmoType := TAmmoType(content);
-            AddCaption(GetEventString(eidNewUtilityPack), capColDefault, capgrpAmmoInfo);
+            gear^.Pos := posCaseUtility;
+            gear^.AmmoType := TAmmoType(content);
+            if(FinishedTurnsTotal > -1) then
+                AddCaption(GetEventString(eidNewUtilityPack), capColDefault, capgrpAmmoInfo);
             end;
     end;
 
     if ( (x = 0) and (y = 0) ) then
-        FindPlace(FollowGear, true, 0, LAND_WIDTH);
+        FindPlace(gear, true, 0, LAND_WIDTH);
 
-    SpawnCustomCrateAt := FollowGear;
+    SpawnCustomCrateAt := gear;
 end;
 
 function SpawnFakeCrateAt(x, y: LongInt; crate: TCrateType; explode: boolean; poison: boolean): PGear;
+var gear: PGear;
 begin
-    FollowGear := AddGear(x, y, gtCase, 0, _0, _0, 0);
+    gear := AddGear(x, y, gtCase, 0, _0, _0, 0);
+    if(FinishedTurnsTotal > -1) then
+        FollowGear:= gear;
     cCaseFactor := 0;
-    FollowGear^.Pos := posCaseDummy;
+    gear^.Pos := posCaseDummy;
 
     if explode then
-        FollowGear^.Pos := FollowGear^.Pos + posCaseExplode;
+        gear^.Pos := gear^.Pos + posCaseExplode;
     if poison then
-        FollowGear^.Pos := FollowGear^.Pos + posCasePoison;
+        gear^.Pos := gear^.Pos + posCasePoison;
 
     case crate of
         HealthCrate:
             begin
-            FollowGear^.Pos := FollowGear^.Pos + posCaseHealth;
+            gear^.Pos := gear^.Pos + posCaseHealth;
+            gear^.RenderHealth:= true;
+            gear^.Karma:= 2;
             // health crate is smaller than the other crates
-            FollowGear^.Radius := cCaseHealthRadius;
-            AddCaption(GetEventString(eidNewHealthPack), capcolDefault, capgrpAmmoInfo);
+            gear^.Radius := cCaseHealthRadius;
+            if(FinishedTurnsTotal > -1) then
+                AddCaption(GetEventString(eidNewHealthPack), capcolDefault, capgrpAmmoInfo);
             end;
         AmmoCrate:
             begin
-            FollowGear^.Pos := FollowGear^.Pos + posCaseAmmo;
-            AddCaption(GetEventString(eidNewAmmoPack), capcolDefault, capgrpAmmoInfo);
+            gear^.Pos := gear^.Pos + posCaseAmmo;
+            if(FinishedTurnstotal > -1) then
+                AddCaption(GetEventString(eidNewAmmoPack), capcolDefault, capgrpAmmoInfo);
             end;
         UtilityCrate:
             begin
-            FollowGear^.Pos := FollowGear^.Pos + posCaseUtility;
-            AddCaption(GetEventString(eidNewUtilityPack), capcolDefault, capgrpAmmoInfo);
+            gear^.Pos := gear^.Pos + posCaseUtility;
+            if(FinishedTurnsTotal > -1) then
+                AddCaption(GetEventString(eidNewUtilityPack), capcolDefault, capgrpAmmoInfo);
             end;
     end;
 
     if ( (x = 0) and (y = 0) ) then
-        FindPlace(FollowGear, true, 0, LAND_WIDTH);
+        FindPlace(gear, true, 0, LAND_WIDTH);
 
-    SpawnFakeCrateAt := FollowGear;
+    SpawnFakeCrateAt := gear;
 end;
 
 procedure StartSuddenDeath();
@@ -1147,7 +1287,8 @@
     or (Ammoz[CurrentHedgehog^.CurAmmoType].Ammo.Propz and ammoprop_DoesntStopTimerWhileAttacking <> 0)
     or ((GameFlags and gfInfAttack) <> 0) and (Ammoz[CurrentHedgehog^.CurAmmoType].Ammo.Propz and ammoprop_DoesntStopTimerWhileAttackingInInfAttackMode <> 0)
     or (CurrentHedgehog^.CurAmmoType = amSniperRifle))
-    and (not(isInMultiShoot and ((Ammoz[CurrentHedgehog^.CurAmmoType].Ammo.Propz and ammoprop_DoesntStopTimerInMultiShoot) <> 0)));
+    and (not(isInMultiShoot and ((Ammoz[CurrentHedgehog^.CurAmmoType].Ammo.Propz and ammoprop_DoesntStopTimerInMultiShoot) <> 0)))
+    and (not LuaClockPaused);
 end;
 
 
@@ -1191,18 +1332,10 @@
 
     if text = '' then text:= '...';
 
-    (*
-    if CheckNoTeamOrHH then
-        begin
-        ParseCommand('say ' + text, true);
-        exit
-        end;
-    *)
-
     if (x < 4) and (TeamsArray[t] <> nil) then
         begin
             // if team matches current hedgehog team, default to current hedgehog
-            if (i = 0) and (CurrentHedgehog <> nil) and (CurrentHedgehog^.Team = TeamsArray[t]) then
+            if (i = 0) and (CurrentHedgehog <> nil) and (CurrentHedgehog^.Team = TeamsArray[t]) and (not CurrentHedgehog^.Unplaced) then
                 hh:= CurrentHedgehog
             else
                 begin
@@ -1211,7 +1344,7 @@
                 c:= 0;
                 while (j <= cMaxHHIndex) and (hh = nil) do
                     begin
-                    if (TeamsArray[t]^.Hedgehogs[j].Gear <> nil) then
+                    if (TeamsArray[t]^.Hedgehogs[j].Gear <> nil) and (not TeamsArray[t]^.Hedgehogs[j].Unplaced) then
                         begin
                         inc(c);
                         if (i=0) or (i=c) then
@@ -1332,10 +1465,9 @@
     //typed const
     delay:= 0;
     delay2:= 0;
-    step:= stDelay;
+    step:= stDelay1;
     upd:= 0;
 
-    //SDMusic:= 'hell.ogg';
     NewTurnTick:= $FFFFFFFF;
 end;
 
--- a/hedgewars/uGearsHandlersMess.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uGearsHandlersMess.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -115,6 +115,7 @@
 procedure doStepMovingPortal(Gear: PGear);
 procedure doStepPortalShot(newPortal: PGear);
 procedure doStepPiano(Gear: PGear);
+procedure doStepPianoWork(Gear: PGear);
 procedure doStepSineGunShotWork(Gear: PGear);
 procedure doStepSineGunShot(Gear: PGear);
 procedure doStepFlamethrowerWork(Gear: PGear);
@@ -348,8 +349,21 @@
     DeleteGear(Gear);
     exit;
     end;
-// Delete normally if gear is outside of visible range
-if (hwRound(Gear^.Y) > Gear^.Radius + cWaterLine + cVisibleWater) then
+// Delete gear normally if it is outside of visible range.
+// But first determine size tolerance for big gears to make sure the gear is REALLY out of range.
+if Gear^.Kind = gtPiano then
+    d:= SpritesData[sprPiano].height
+else if Gear^.Kind = gtRCPlane then
+    d:= SpritesData[sprPlane].width
+else if Gear^.Kind = gtKnife then
+    d:= SpritesData[sprKnife].height
+else if Gear^.Kind = gtDynamite then
+    d:= SpritesData[sprDynamite].height
+else if Gear^.Kind = gtSnowball then
+    d:= SpritesData[sprSnowball].height
+else
+    d:= Gear^.Radius * 2;
+if (hwRound(Gear^.Y) > d + cWaterLine + cVisibleWater) then
     DeleteGear(Gear);
 end;
 
@@ -357,7 +371,6 @@
 procedure doStepFallingGear(Gear: PGear);
 var
     isFalling: boolean;
-    //tmp: QWord;
     tX, tdX, tdY: hwFloat;
     collV, collH, gX, gY: LongInt;
     land, xland: word;
@@ -478,10 +491,8 @@
         xland:= TestCollisionXwithGear(Gear, -hwSign(Gear^.dX));
         if xland <> 0 then collH := -hwSign(Gear^.dX)
         end;
-    //if Gear^.AdvBounce and (collV <>0) and (collH <> 0) and (hwSqr(tdX) + hwSqr(tdY) > _0_08) then
     if (collV <> 0) and (collH <> 0) and
        (((Gear^.AdvBounce=1) and ((collV=-1) or ((tdX.QWordValue + tdY.QWordValue) > _0_2.QWordValue)))) then
- //or ((xland or land) and lfBouncy <> 0)) then
         begin
         if (xland or land) and lfBouncy = 0 then
             begin
@@ -534,7 +545,6 @@
     Gear^.X := Gear^.X + Gear^.dX;
     Gear^.Y := Gear^.Y + Gear^.dY;
     CheckGearDrowning(Gear);
-    //if (hwSqr(Gear^.dX) + hwSqr(Gear^.dY) < _0_0002) and
     if (not isFalling) and ((Gear^.dX.QWordValue + Gear^.dY.QWordValue) < _0_02.QWordValue) then
         Gear^.State := Gear^.State and (not gstMoving)
     else
@@ -543,7 +553,7 @@
     if ((xland or land) and lfBouncy <> 0) and (Gear^.dX.QWordValue < _0_15.QWordValue) and (Gear^.dY.QWordValue < _0_15.QWordValue) then
         Gear^.State := Gear^.State or gstCollision;
 
-    if ((xland or land) and lfBouncy <> 0) and (Gear^.Radius >= 3) and
+    if ((xland or land) and lfBouncy <> 0) and
        ((Gear^.dX.QWordValue > _0_15.QWordValue) or (Gear^.dY.QWordValue > _0_15.QWordValue)) then
         begin
         AddBounceEffectForGear(Gear);
@@ -712,25 +722,14 @@
         gY := hwRound(Gear^.Y);
         for i:= 0 to 4 do
             begin
-            (*glass:= AddVisualGear(gx+random(7)-3, gy+random(5)-2, vgtEgg);
-            if glass <> nil then
-                begin
-                glass^.Frame:= 2;
-                glass^.Tint:= $41B83ED0 - i * $10081000;
-                glass^.dX:= 1/(10*(random(11)-5));
-                glass^.dY:= -1/(random(4)+5);
-                end;*)
-            glass:= AddVisualGear(gx+random(7)-3, gy+random(7)-3, vgtStraightShot);
+            glass:= AddVisualGear(gx+random(7)-3, gy+random(7)-3, vgtEgg);
             if glass <> nil then
                 with glass^ do
                     begin
                     Frame:= 2;
                     Tint:= $41B83ED0 - i * $10081000;
+                    dX:= dX + hwFloat2Float(Gear^.dX) / 2;
                     Angle:= random(360);
-                    dx:= 0.0000001;
-                    dy:= 0;
-                    if random(2) = 0 then
-                        dx := -dx;
                     FrameTicks:= 750;
                     State:= ord(sprEgg)
                     end;
@@ -867,17 +866,6 @@
             else if 360 < DirAngle then
                 DirAngle := DirAngle - 360;
             end;
-(*
-We aren't using frametick right now, so just a waste of cycles.
-        inc(Health, 8);
-        if longword(Health) > vobFrameTicks then
-            begin
-            dec(Health, vobFrameTicks);
-            inc(Timer);
-            if Timer = vobFramesCount then
-                Timer:= 0
-            end;
-*)
     // move back to cloud layer
         if CheckCoordInWater(xx, yy) then
             move:= true
@@ -1046,11 +1034,14 @@
 var
     t: hwFloat;
     gX,gY,i: LongInt;
-    uw, nuw: boolean;
+    uw, nuw, wrapped: boolean;
     flower: PVisualGear;
 
 begin
-    WorldWrap(Gear);
+    wrapped:= WorldWrap(Gear);
+    if wrapped then
+        HomingWrap(Gear);
+
     AllInactive := false;
     gX := hwRound(Gear^.X);
     gY := hwRound(Gear^.Y);
@@ -1145,11 +1136,14 @@
 end;
 
 procedure doStepBee(Gear: PGear);
+var wrapped: boolean;
 begin
     AllInactive := false;
     Gear^.X := Gear^.X + Gear^.dX;
     Gear^.Y := Gear^.Y + Gear^.dY;
-    WorldWrap(Gear);
+    wrapped:= WorldWrap(Gear);
+    if wrapped then
+        HomingWrap(Gear);
     Gear^.dY := Gear^.dY + cGravity;
     CheckGearDrowning(Gear);
     CheckCollision(Gear);
@@ -1188,9 +1182,7 @@
             end
         end
     else
-        begin
         DeleteGear(Gear);
-        end
 end;
 
 procedure CreateShellForGear(Gear: PGear; startFrame: Longword);
@@ -1709,6 +1701,8 @@
         if Gear^.Timer = 0 then
             begin
             SendIPC(_S'N');
+            if (luaCmdUsed) then
+                SendIPC(_S'm');
             SendIPC(_S'q');
             GameState := gsExit
             end
@@ -1972,6 +1966,7 @@
     dmg: LongWord;
 begin
     if Gear^.Health = 0 then dxdy:= hwAbs(Gear^.dX)+hwAbs(Gear^.dY);
+    Gear^.RenderTimer:= ((Gear^.State and gstFrozen) = 0) and ((Gear^.State and gstAttacking) = 0) and (Gear^.Health <> 0);
     if (Gear^.State and gstMoving) <> 0 then
         begin
         DeleteCI(Gear);
@@ -2038,7 +2033,8 @@
                 or (getRandom(100) > cMineDudPercent) then
                     begin
                     doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
-                    DeleteGear(Gear)
+                    DeleteGear(Gear);
+                    exit   // redundant but we've had too many delete gear bugs
                     end
                 else
                     begin
@@ -2069,6 +2065,7 @@
     sparkle: PVisualGear;
 begin
     targ:= nil;
+    Gear^.RenderTimer:= ((Gear^.State and gstFrozen) = 0) and ((Gear^.State and gstAttacking) = 0);
     if (Gear^.State and gstFrozen) <> 0 then
         begin
         if Gear^.Damage > 0 then
@@ -2084,7 +2081,8 @@
             DeleteGear(Gear);
             exit
             end;
-        doStepFallingGear(Gear);
+        if ((Gear^.dX.QWordValue + Gear^.dY.QWordValue) > _0_02.QWordValue) or ((GameTicks and $3F) = 15) then
+            doStepFallingGear(Gear);
         exit
         end;
     isUnderwater:= CheckCoordInWater(hwRound(Gear^.X), hwRound(Gear^.Y) + Gear^.Radius);
@@ -2098,24 +2096,43 @@
         Gear^.dX:= Gear^.dX*airFriction;
         Gear^.dY:= Gear^.dY*airFriction
         end;
-    doStepFallingGear(Gear);
+    if ((Gear^.dX.QWordValue + Gear^.dY.QWordValue) > _0_02.QWordValue) or ((GameTicks and $3F) = 15) then
+        doStepFallingGear(Gear);
     if (TurnTimeLeft = 0) and ((Gear^.dX.QWordValue + Gear^.dY.QWordValue) > _0_02.QWordValue) then
         AllInactive := false;
 
+    // Disable targeting if airmine is not active yet
+    if ((Gear^.State and gsttmpFlag) = 0) then
+        begin
+        if (TurnTimeLeft = 0)
+        or ((GameFlags and gfInfAttack <> 0) and (GameTicks > Gear^.FlightTime))
+        or (CurrentHedgehog^.Gear = nil) then
+        begin
+        Gear^.FlightTime:= GameTicks;
+        Gear^.State := Gear^.State or gsttmpFlag;
+        Gear^.Hedgehog := nil;
+        end;
+        exit;
+        end;
+
     //Disable targeting while the airmine is stunned
     if Gear^.Tag <> 0 then
         begin
         if ((Gear^.FlightTime and $FF) = 0) then
-            begin
-            sparkle:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtDust, 1);
-            if sparkle <> nil then
+            // spawn lots of particles when stunned (sparkles or bubbles)
+            if CheckCoordInWater(hwRound(Gear^.X), hwRound(Gear^.Y)) = false then
                 begin
-                    sparkle^.dX:= 0.004 * (random(100) - 50);
-                    sparkle^.dY:= -0.05 + 0.004 * (random(100) - 50);
-                    sparkle^.Tint:= $D5CD8CFF;
-                    sparkle^.Angle:= random(360);
-                end;
-            end;
+                sparkle:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtDust, 1);
+                if sparkle <> nil then
+                    begin
+                        sparkle^.dX:= 0.004 * (random(100) - 50);
+                        sparkle^.dY:= -0.05 + 0.004 * (random(100) - 50);
+                        sparkle^.Tint:= $D5CD8CFF;
+                        sparkle^.Angle:= random(360);
+                    end;
+                end
+            else
+                AddVisualGear(hwRound(Gear^.X) - 8 + random(16), hwRound(Gear^.Y) + 16 + random(8), vgtBubble);
 
         dec(Gear^.FlightTime);
         if Gear^.FlightTime = 0 then
@@ -2148,11 +2165,9 @@
         end;
 
     // If in ready timer, or after turn, or in first 5 seconds of turn (really a window due to extra time utility)
-    // or mine is inactive due to lack of gsttmpflag or hunting is disabled due to seek radius of 0
-    // then we aren't hunting
+    // or hunting is disabled due to seek radius of 0 then we aren't hunting
     if (ReadyTimeLeft > 0) or (TurnTimeLeft = 0) or 
         ((TurnTimeLeft < cHedgehogTurnTime) and (cHedgehogTurnTime-TurnTimeLeft < 5000)) or
-        (Gear^.State and gsttmpFlag = 0) or
         (Gear^.Angle = 0) then
         gear^.State:= gear^.State and (not gstChooseTarget)
     else if
@@ -2168,7 +2183,7 @@
         for t:= 0 to Pred(TeamsCount) do
             with TeamsArray[t]^ do
                 for i:= 0 to cMaxHHIndex do
-                    if Hedgehogs[i].Gear <> nil then
+                    if (Hedgehogs[i].Gear <> nil) and (Hedgehogs[i].Effects[heFrozen] = 0) then
                         begin
                         tmpG:= Hedgehogs[i].Gear;
                         tX:=Gear^.X-tmpG^.X;
@@ -2213,68 +2228,57 @@
         end
     else Gear^.Hedgehog:= nil;
 
-    if ((Gear^.State and gsttmpFlag) <> 0) and (Gear^.Health <> 0) then
-        begin
-        if ((Gear^.State and gstAttacking) = 0) then
-            begin
-            if ((GameTicks and $1F) = 0) then
+    if ((Gear^.State and gstAttacking) = 0) then
+        begin
+        if (((GameTicks+Gear^.Uid) and $1F) = 0) then
+            begin
+            if targ <> nil then
                 begin
-                if targ <> nil then
-                    begin
-                    tX:=Gear^.X-targ^.X;
-                    tY:=Gear^.Y-targ^.Y;
-                    if (tX.Round+tY.Round < Gear^.Boom) and
-                       (hwRound(hwSqr(tX) + hwSqr(tY)) < sqr(Gear^.Boom)) then
-                    Gear^.State := Gear^.State or gstAttacking
-                    end
-                else if (Gear^.Angle > 0) and (CheckGearNear(Gear, gtHedgehog, Gear^.Boom, Gear^.Boom) <> nil) then
-                    Gear^.State := Gear^.State or gstAttacking
+                tX:=Gear^.X-targ^.X;
+                tY:=Gear^.Y-targ^.Y;
+                if (tX.Round+tY.Round < Gear^.Boom) and
+                   (hwRound(hwSqr(tX) + hwSqr(tY)) < sqr(Gear^.Boom)) then
+                Gear^.State := Gear^.State or gstAttacking
                 end
+            else if (Gear^.Angle > 0) and (CheckGearNear(Gear, gtHedgehog, Gear^.Boom, Gear^.Boom) <> nil) then
+                Gear^.State := Gear^.State or gstAttacking
             end
-        else // gstAttacking <> 0
-            begin
-            AllInactive := false;
-            if (Gear^.Timer and $FF) = 0 then
-                PlaySound(sndMineTick);
-            if Gear^.Timer = 0 then
+        end
+    else // gstAttacking <> 0
+        begin
+        AllInactive := false;
+        if (Gear^.Timer and $FF) = 0 then
+            PlaySound(sndMineTick);
+        if Gear^.Timer = 0 then
+            begin
+            // recheck
+            if targ <> nil then
                 begin
-                // recheck
-                if targ <> nil then
-                    begin
-                    tX:=Gear^.X-targ^.X;
-                    tY:=Gear^.Y-targ^.Y;
-                    if (tX.Round+tY.Round < Gear^.Boom) and
-                       (hwRound(hwSqr(tX) + hwSqr(tY)) < sqr(Gear^.Boom)) then
-                        begin
-                        Gear^.Hedgehog:= CurrentHedgehog;
-                        tmpG:= FollowGear;
-                        doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
-                        FollowGear:= tmpG;
-                        DeleteGear(Gear);
-                        exit
-                        end
-                    end
-                else if (Gear^.Angle > 0) and (CheckGearNear(Gear, gtHedgehog, Gear^.Boom, Gear^.Boom) <> nil) then
+                tX:=Gear^.X-targ^.X;
+                tY:=Gear^.Y-targ^.Y;
+                if (tX.Round+tY.Round < Gear^.Boom) and
+                   (hwRound(hwSqr(tX) + hwSqr(tY)) < sqr(Gear^.Boom)) then
                     begin
                     Gear^.Hedgehog:= CurrentHedgehog;
+                    tmpG:= FollowGear;
                     doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
+                    FollowGear:= tmpG;
                     DeleteGear(Gear);
                     exit
-                    end;
-                Gear^.State:= Gear^.State and (not gstAttacking);
-                Gear^.Timer:= Gear^.WDTimer
+                    end
+                end
+            else if (Gear^.Angle > 0) and (CheckGearNear(Gear, gtHedgehog, Gear^.Boom, Gear^.Boom) <> nil) then
+                begin
+                Gear^.Hedgehog:= CurrentHedgehog;
+                doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
+                DeleteGear(Gear);
+                exit
                 end;
-            if Gear^.Timer > 0 then
-                dec(Gear^.Timer);
-            end
-        end
-    else // gsttmpFlag = 0
-        if (TurnTimeLeft = 0)
-        or ((GameFlags and gfInfAttack <> 0) and (GameTicks > Gear^.FlightTime))
-        or (CurrentHedgehog^.Gear = nil) then
-        begin
-        Gear^.FlightTime:= GameTicks;
-        Gear^.State := Gear^.State or gsttmpFlag
+            Gear^.State:= Gear^.State and (not gstAttacking);
+            Gear^.Timer:= Gear^.WDTimer
+            end;
+        if Gear^.Timer > 0 then
+            dec(Gear^.Timer);
         end
 end;
 
@@ -2307,6 +2311,7 @@
         CalcRotationDirAngle(Gear);
         end;
 
+    Gear^.RenderTimer:= (Gear^.State and (gstFrozen or gstAttacking or gstDrowning) = 0);
     if ((Gear^.State and gsttmpFlag) <> 0) and (Gear^.Health <> 0) then
         begin
         if ((Gear^.State and gstAttacking) = 0) and ((Gear^.State and gstFrozen) = 0) then
@@ -2393,7 +2398,6 @@
             ScriptCall('onGearDamage', Gear^.UID, dmg)
             end;
         CalcRotationDirAngle(Gear);
-        //CheckGearDrowning(Gear)
         end
     else
         begin
@@ -2401,22 +2405,6 @@
         AddCI(Gear)
         end;
 
-(*
-Attempt to make a barrel knock itself over an edge.  Would need more checks to avoid issues like burn damage
-    begin
-    x:= hwRound(Gear^.X);
-    y:= hwRound(Gear^.Y);
-    if (((y+1) and LAND_HEIGHT_MASK) = 0) and ((x and LAND_WIDTH_MASK) = 0) then
-        if (Land[y+1, x] = 0) then
-            begin
-            if (((y+1) and LAND_HEIGHT_MASK) = 0) and (((x+Gear^.Radius-2) and LAND_WIDTH_MASK) = 0) and (Land[y+1, x+Gear^.Radius-2] = 0) then
-                Gear^.dX:= -_0_08
-            else if (((y+1 and LAND_HEIGHT_MASK)) = 0) and (((x-(Gear^.Radius-2)) and LAND_WIDTH_MASK) = 0) and (Land[y+1, x-(Gear^.Radius-2)] = 0) then
-                Gear^.dX:= _0_08;
-            end;
-    if Gear^.dX.QWordValue = 0 then AddCI(Gear)
-    end; *)
-
     if not Gear^.dY.isNegative and (Gear^.dY < _0_001) and (TestCollisionYwithGear(Gear, 1) <> 0) then
         Gear^.dY := _0;
     if hwAbs(Gear^.dX) < _0_001 then
@@ -2427,16 +2415,24 @@
             AddVisualGear(hwRound(Gear^.X) - 16 + Random(32), hwRound(Gear^.Y) - 2, vgtSmoke)
     else
         AddVisualGear(hwRound(Gear^.X) - 16 + Random(32), hwRound(Gear^.Y) - 2, vgtSmokeWhite);
+
     dec(Gear^.Health, Gear^.Damage);
     Gear^.Damage := 0;
     if Gear^.Health <= 0 then
-        doStepCase(Gear);
+        doStepCase(Gear)
+    else
+        // health texture (FlightTime = health when the last texture was generated)
+        if (Gear^.Health <> Gear^.FlightTime) or (Gear^.Tex = nil) then
+            begin
+            Gear^.FlightTime:= Gear^.Health;
+            FreeAndNilTexture(Gear^.Tex);
+            Gear^.Tex := RenderStringTex(ansistring(inttostr(Gear^.Health)), $ff808080, fnt16);
+            end;
 end;
 
 procedure doStepCase(Gear: PGear);
 var
     i, x, y: LongInt;
-    Boom: LongWord;
     k: TGearType;
     dX, dY: HWFloat;
     hog: PHedgehog;
@@ -2462,35 +2458,32 @@
         x := hwRound(Gear^.X);
         y := hwRound(Gear^.Y);
         hog:= Gear^.Hedgehog;
-        Boom:= Gear^.Boom;
-        DeleteGear(Gear);
-        // <-- delete gear!
 
         if k = gtCase then
             begin
-            doMakeExplosion(x, y, Boom, hog, EXPLAutoSound);
+            doMakeExplosion(x, y, Gear^.Boom, hog, EXPLAutoSound);
             for i:= 0 to 63 do
                 AddGear(x, y, gtFlame, 0, _0, _0, 0);
             end
         else if k = gtTarget then
             uStats.TargetHit()
         else if k = gtExplosives then
+            begin
+            doMakeExplosion(x, y, Gear^.Boom, hog, EXPLAutoSound);
+            for i:= 0 to 31 do
                 begin
-                doMakeExplosion(x, y, Boom, hog, EXPLAutoSound);
-                for i:= 0 to 31 do
-                    begin
-                    dX := AngleCos(i * 64) * _0_5 * (getrandomf + _1);
-                    dY := AngleSin(i * 64) * _0_5 * (getrandomf + _1);
-                    AddGear(x, y, gtFlame, 0, dX, dY, 0);
-                    AddGear(x, y, gtFlame, gstTmpFlag, -dX, -dY, 0);
-                    end
-                end;
-            exit
+                dX := AngleCos(i * 64) * _0_5 * (getrandomf + _1);
+                dY := AngleSin(i * 64) * _0_5 * (getrandomf + _1);
+                AddGear(x, y, gtFlame, 0, dX, dY, 0);
+                AddGear(x, y, gtFlame, gstTmpFlag, -dX, -dY, 0);
+                end
+            end;
+        DeleteGear(Gear);
+        exit
         end;
 
     if k = gtExplosives then
         begin
-        //if V > _0_03 then Gear^.State:= Gear^.State or gstAnimation;
         if (hwAbs(Gear^.dX) > _0_15) or ((hwAbs(Gear^.dY) > _0_15) and (hwAbs(Gear^.dX) > _0_02)) then
             begin
             Gear^.doStep := @doStepRollingBarrel;
@@ -2503,11 +2496,56 @@
                 AddVisualGear(hwRound(Gear^.X) - 16 + Random(32), hwRound(Gear^.Y) - 2, vgtSmoke)
             else
                 AddVisualGear(hwRound(Gear^.X) - 16 + Random(32), hwRound(Gear^.Y) - 2, vgtSmokeWhite);
+
         dec(Gear^.Health, Gear^.Damage);
         Gear^.Damage := 0;
+        // health texture (FlightTime = health when the last texture was generated)
+        if (Gear^.Health <> Gear^.FlightTime) or (Gear^.Tex = nil) then
+            begin
+            Gear^.FlightTime:= Gear^.Health;
+            FreeAndNilTexture(Gear^.Tex);
+            Gear^.Tex := RenderStringTex(ansistring(inttostr(Gear^.Health)), $ff808080, fnt16);
+            end;
         end
     else
         begin
+        // health texture for health crate
+        if (k = gtCase) and ((Gear^.Pos and posCaseHealth) <> 0) then
+            begin
+            if ((Gear^.State and gstFrozen) = 0) then
+                begin
+                // Karma=2: Always hide health
+                if (Gear^.Karma = 2) then
+                    i:= 0
+                // Karma=1: Hide health in game, but show in demo
+                else if (Gear^.Karma = 1) then
+                    if (GameType in [gmtDemo, gmtRecord]) then
+                        i:= 1
+                    else
+                        i:= 0
+                // Always show health (default)
+                else
+                    i:= 1;
+                if i = 1 then
+                    begin
+                    if (Gear^.Health <> Gear^.FlightTime) or (Gear^.Tex = nil) then
+                        begin
+                        Gear^.FlightTime:= Gear^.Health;
+                        FreeAndNilTexture(Gear^.Tex);
+                        Gear^.Tex := RenderStringTex(ansistring(inttostr(Gear^.Health)), $ff80ff80, fnt16)
+                        end
+                    end
+                else
+                    begin
+                    if (Gear^.FlightTime <> $ffffffff) or (Gear^.Tex = nil) then
+                        begin
+                        Gear^.FlightTime:= $ffffffff;
+                        FreeAndNilTexture(Gear^.Tex);
+                        Gear^.Tex := RenderStringTex(trmsg[sidUnknownGearValue], $ff80ff80, fnt16)
+                        end
+                    end
+                end;
+            end;
         if Gear^.Timer = 500 then
             begin
 (* Can't make sparkles team coloured without working out what the next team is going to be. This should be solved, really, since it also screws up
@@ -2570,8 +2608,9 @@
             else if Gear^.dY < - _0_03 then
                 PlaySound(Gear^.ImpactSound);
             end;
-        //if Gear^.dY > - _0_001 then Gear^.dY:= _0
         CheckGearDrowning(Gear);
+        if ((Gear^.State and gstDrowning) <> 0) then
+            Gear^.RenderHealth:= false;
         end;
 
     if (Gear^.dY.QWordValue = 0) then
@@ -2693,14 +2732,19 @@
 begin
     WorldWrap(Gear);
     if Gear^.FlightTime > 0 then dec(Gear^.FlightTime);
+    // There are 2 flame types: normal and sticky
     sticky:= (Gear^.State and gsttmpFlag) <> 0;
     if not sticky then AllInactive := false;
 
     landPixel:= TestCollisionYwithGear(Gear, 1);
+    // Flame is in mid-air
     if landPixel = 0 then
         begin
         AllInactive := false;
 
+        // Deals damage in mid-air if FlightTime = 0.
+        // Otherwise, flame is harmless in mid-air.
+        // Intended for use with scripts.
         if (GameTicks and $F = 0) and (Gear^.FlightTime = 0) then
             begin
             Gear^.Radius := 7;
@@ -2737,23 +2781,34 @@
             Gear^.dY:= Gear^.dY * f;
         end
         else begin
+            // Gravity and wind
             if Gear^.dX.QWordValue > _0_01.QWordValue then
                     Gear^.dX := Gear^.dX * _0_995;
 
             Gear^.dY := Gear^.dY + cGravity;
-            // if sticky then Gear^.dY := Gear^.dY + cGravity;
 
             if Gear^.dY.QWordValue > _0_2.QWordValue then
                 Gear^.dY := Gear^.dY * _0_995;
 
-            //if sticky then Gear^.X := Gear^.X + Gear^.dX else
-            Gear^.X := Gear^.X + Gear^.dX + cWindSpeed * 640;
+            // Apply speed changes
+
+            tdX:= Gear^.dX + cWindSpeed * 640;
+            // Don't apply wind speed if moving against bounce world edge
+            if (WorldEdge = weBounce) and
+                (((hwRound(Gear^.X + tdX) - Gear^.Radius < leftX) and (hwSign(tdX) = -1)) or
+                ((hwRound(Gear^.X + tdX) + Gear^.Radius > rightX) and (hwSign(tdX) = 1))) then
+                    Gear^.X := Gear^.X + Gear^.dX
+            else
+                // Apply dX and wind speed
+                Gear^.X := Gear^.X + tdX;
+
             Gear^.Y := Gear^.Y + Gear^.dY;
         end;
 
         gX := hwRound(Gear^.X);
         gY := hwRound(Gear^.Y);
 
+        // Extinguish in water
         if CheckCoordInWater(gX, gY) then
             begin
             for i:= 0 to 3 do
@@ -2763,11 +2818,13 @@
             exit
             end
         end
+    // Flame is on terrain
     else
         begin
         if (Gear^.Timer = 1) and (GameTicks and $3 = 0) then
             begin
             Gear^.Y:= Gear^.Y+_6;
+            // Extinguish on ice
             if (landPixel and lfIce <> 0) or (TestCollisionYwithGear(Gear, 1) and lfIce <> 0) then
                 begin
                 gX := hwRound(Gear^.X);
@@ -2780,6 +2837,7 @@
                 end;
             Gear^.Y:= Gear^.Y-_6
             end;
+        // Sticky flame damage
         if sticky and (GameTicks and $F = 0) then
             begin
             Gear^.Radius := 7;
@@ -2800,12 +2858,14 @@
             inc(Gear^.Damage)
             end
         else
+            // Flame burn-down handling
             begin
             gX := hwRound(Gear^.X);
             gY := hwRound(Gear^.Y);
-            // Standard fire
+            // Normal flame: Burns down quickly and must be destroyed before the turn ends
             if not sticky then
                 begin
+                // Deal damage
                 if ((GameTicks and $1) = 0) then
                     begin
                     Gear^.Radius := 7;
@@ -2821,19 +2881,23 @@
                     Gear^.Radius := 1;
                     end
                 else if ((GameTicks and $3) = 3) then
-                    doMakeExplosion(gX, gY, Gear^.Boom * 4, Gear^.Hedgehog, 0);//, EXPLNoDamage);
+                    doMakeExplosion(gX, gY, Gear^.Boom * 4, Gear^.Hedgehog, 0);
 
                 if ((GameTicks and $7) = 0) and (Random(2) = 0) then
                     for i:= Random(2) downto 0 do
                         AddVisualGear(gX - 3 + Random(6), gY - 2, vgtSmoke);
 
+                // Flame burn-out due to time
                 if Gear^.Health > 0 then
                     dec(Gear^.Health);
+
+                // Calculate time for next flame update with a bit of random jitter
                 Gear^.Timer := 450 - Gear^.Tag * 8 + LongInt(GetRandom(2))
                 end
+            // Sticky flame: Burns down slowly and persists between turns
             else
                 begin
-                // Modified fire
+                // Destroy land very slowly (low chance this gets called)
                 if ((GameTicks and $7FF) = 0) and ((GameFlags and gfSolidLand) = 0) then
                     begin
                     doMakeExplosion(gX, gY, 4, Gear^.Hedgehog, EXPLNoDamage or EXPLDoNotTouchAny or EXPLNoGfx);
@@ -2842,13 +2906,16 @@
                         AddVisualGear(gX - 3 + Random(6), gY - 2, vgtSmoke);
                     end;
 
-// This one is interesting.  I think I understand the purpose, but I wonder if a bit more fuzzy of kicking could be done with getrandom.
+                // Calculate time for next flame update with a bit of random jitter
                 Gear^.Timer := 100 - Gear^.Tag * 3 + LongInt(GetRandom(2));
+
+                // Flame burn-out due to time
                 if (Gear^.Damage > 3000+Gear^.Tag*1500) then
                     Gear^.Health := 0
                 end
             end
         end;
+    // This kills the flame
     if Gear^.Health = 0 then
         begin
         gX := hwRound(Gear^.X);
@@ -2864,7 +2931,7 @@
                 AddVisualGear(gX - 3 + Random(6), gY - 2, vgtSmoke);
 
         DeleteGear(Gear)
-        end;
+        end
 end;
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -2918,7 +2985,6 @@
     AllInactive := false;
     HHGear := Gear^.Hedgehog^.Gear;
     DeleteCI(HHGear);
-    //HHGear^.X := int2hwFloat(hwRound(HHGear^.X)) - _0_5; WTF?
     HHGear^.dX := SignAs(cLittle, Gear^.dX);
 
     HHGear^.dY := - _0_3;
@@ -2940,6 +3006,7 @@
 procedure doStepParachuteWork(Gear: PGear);
 var
     HHGear: PGear;
+    deltaX, deltaY: hwFloat;
 begin
     HHGear := Gear^.Hedgehog^.Gear;
 
@@ -2953,36 +3020,51 @@
         with HHGear^ do
             begin
             Message := 0;
+            if Gear^.Tag = 1 then
+                dX := _1
+            else
+                dX := - _1;
             SetLittle(dX);
             dY := _0;
             State := State or gstMoving;
             end;
-        DeleteGear(Gear);
         if (GetAmmoEntry(HHGear^.Hedgehog^, amParachute)^.Count >= 1) and ((Ammoz[HHGear^.Hedgehog^.CurAmmoType].Ammo.Propz and ammoprop_AltUse) <> 0) and (HHGear^.Hedgehog^.MultiShootAttacks = 0) then
             HHGear^.Hedgehog^.CurAmmoType:= amParachute;
         isCursorVisible := false;
         ApplyAmmoChanges(HHGear^.Hedgehog^);
+        DeleteGear(Gear);
         exit
         end;
 
-    HHGear^.X := HHGear^.X + cWindSpeed * 200;
+    deltaX:= _0;
+    deltaX:= deltaX + cWindSpeed * 200;
+    deltaY:= _0;
 
     if (Gear^.Message and gmLeft) <> 0 then
-        HHGear^.X := HHGear^.X - cMaxWindSpeed * 80
+        deltaX := deltaX - cMaxWindSpeed * 80
 
     else if (Gear^.Message and gmRight) <> 0 then
-        HHGear^.X := HHGear^.X + cMaxWindSpeed * 80;
+        deltaX := deltaX + cMaxWindSpeed * 80;
 
     if (Gear^.Message and gmUp) <> 0 then
-        HHGear^.Y := HHGear^.Y - cGravity * 40
+        deltaY := deltaY - cGravity * 40
 
     else if (Gear^.Message and gmDown) <> 0 then
-        HHGear^.Y := HHGear^.Y + cGravity * 40;
-
+        deltaY := deltaY + cGravity * 40;
+
+    HHGear^.X := HHGear^.X + deltaX;
     // don't drift into obstacles
-    if TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) <> 0 then
-        HHGear^.X := HHGear^.X - int2hwFloat(hwSign(HHGear^.dX));
-    HHGear^.Y := HHGear^.Y + cGravity * 100;
+    if TestCollisionXwithGear(HHGear, hwSign(deltaX)) <> 0 then
+        begin
+        HHGear^.X := HHGear^.X - int2hwFloat(hwSign(deltaX));
+        deltaX:= _0;
+        end;
+    deltaY := deltaY + cGravity * 100;
+    HHGear^.Y := HHGear^.Y + deltaY;
+
+    HHGear^.dX := deltaX;
+    HHGear^.dY := deltaY;
+
     Gear^.X := HHGear^.X;
     Gear^.Y := HHGear^.Y
 end;
@@ -3012,54 +3094,141 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 procedure doStepAirAttackWork(Gear: PGear);
+var uw, nuw: boolean;
+    tmpFloat: hwFloat;
+    i: LongInt;
 begin
     AllInactive := false;
+    if (WorldEdge = weWrap) then
+        if (WorldWrap(Gear)) then
+            inc(Gear^.Power);
     Gear^.X := Gear^.X + cAirPlaneSpeed * Gear^.Tag;
-
-    if (Gear^.Health > 0) and (not (Gear^.X < Gear^.dX)) and (Gear^.X < Gear^.dX + cAirPlaneSpeed) then
+    if (Gear^.Health > 0) and (Gear^.Power >= Gear^.WDTimer) and (((Gear^.Tag = 1) and (not (Gear^.X < Gear^.dX))) or ((Gear^.Tag = -1) and (not (Gear^.X > Gear^.dX)))) then
         begin
         dec(Gear^.Health);
-            case Gear^.State of
-                0: FollowGear := AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtAirBomb, 0, cBombsSpeed * Gear^.Tag, _0, 0);
-                1: FollowGear := AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtMine,    0, cBombsSpeed * Gear^.Tag, _0, 0);
-                2: FollowGear := AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtNapalmBomb, 0, cBombsSpeed * Gear^.Tag, _0, 0);
-                3: FollowGear := AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtDrill, gsttmpFlag, cBombsSpeed * Gear^.Tag, _0, Gear^.Timer + 1);
-            //4: FollowGear := AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtWaterMelon, 0, cBombsSpeed *
-            //                 Gear^.Tag, _0, 5000);
+        Gear^.FlightTime:= 0;
+        // Spawn missile
+        case Gear^.State of
+            0: FollowGear := AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtAirBomb, 0, cBombsSpeed * Gear^.Tag, _0, 0);
+            1: FollowGear := AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtMine,    0, cBombsSpeed * Gear^.Tag, _0, 0);
+            2: FollowGear := AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtNapalmBomb, 0, cBombsSpeed * Gear^.Tag, _0, 0);
+            3: FollowGear := AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtDrill, gsttmpFlag, cBombsSpeed * Gear^.Tag, _0, Gear^.Timer + 1);
+        end;
+        Gear^.dX := Gear^.X + int2hwFloat(Gear^.Damage * Gear^.Tag);
+        if (WorldEdge = weWrap) then
+            begin
+            Gear^.dX := int2hwFloat(CalcWorldWrap(hwRound(Gear^.dX), 0));
+            if (((Gear^.Tag = 1) and (not (Gear^.X < Gear^.dX))) or ((Gear^.Tag = -1) and (not (Gear^.X > Gear^.dX)))) then
+                inc(Gear^.WDTimer);
             end;
-        Gear^.dX := Gear^.dX + int2hwFloat(Gear^.Damage * Gear^.Tag);
+
         if CheckCoordInWater(hwRound(Gear^.X), hwRound(Gear^.Y)) then
             FollowGear^.State:= FollowGear^.State or gstSubmersible;
+        end;
+
+    if (Gear^.Health = 0) then
+        inc(Gear^.FlightTime);
+
+    if (Gear^.SoundChannel <> -1) and (WorldEdge <> weSea) and (Gear^.FlightTime > 20) then
+        begin
         StopSoundChan(Gear^.SoundChannel, 4000);
-        end;
-
+        Gear^.SoundChannel := -1;
+        end;
+
+    // Particles
     if (GameTicks and $3F) = 0 then
-        AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtSmokeTrace);
-
-    if (hwRound(Gear^.X) > (max(LAND_WIDTH,4096)+2048)) or (hwRound(Gear^.X) < -2048) then
-        begin
-        // avoid to play forever (is this necessary?)
+        if CheckCoordInWater(hwRound(Gear^.X), hwRound(Gear^.Y)) then
+            begin
+            // air plane bubbles
+            for i:=1 to 3 do
+                AddVisualGear(hwRound(Gear^.X) - 8 + Random(16), hwRound(Gear^.Y) - 8 + Random(16), vgtBubble);
+            // pilot's snorkel bubbles
+            if random(2) = 0 then
+                AddVisualGear(hwRound(Gear^.X) + 10, hwRound(Gear^.Y) - 50, vgtBubble);
+            end
+        else
+            // smoke
+            AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtSmokeTrace);
+
+    // Get rid of gear and cleanup
+    if ((WorldEdge = weWrap) and (Gear^.FlightTime >= 4000)) or
+        ((WorldEdge <> weWrap) and (((hwRound(Gear^.X) - Gear^.Radius > (max(LAND_WIDTH,4096)+2048)) or (hwRound(Gear^.X) + Gear^.Radius < -2048) or ((Gear^.Message and gmDestroy) > 0)))) then
+        begin
+        // fail-safe: instanly stop sound if it wasn't disabled before
+        if (Gear^.SoundChannel <> -1) then
+            begin
+            StopSoundChan(Gear^.SoundChannel);
+            Gear^.SoundChannel := -1;
+            end;
+        if (WorldEdge = weWrap) then
+            AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtBigExplosion);
+        DeleteGear(Gear);
+        exit;
+        end;
+
+    uw := (Gear^.Karma <> 0); // Was plane underwater last tick?
+    nuw := CheckCoordInWater(hwRound(Gear^.X) + Gear^.Radius * Gear^.Tag, hwRound(Gear^.Y)); // Is plane underwater now?
+
+    // if water entered or left
+    if nuw <> uw then
+        begin
+        tmpFloat:= Gear^.dX;
+        Gear^.dX := cAirPlaneSpeed * Gear^.Tag;
+        AddSplashForGear(Gear, false);
+        Gear^.dX := tmpFloat;
         StopSoundChan(Gear^.SoundChannel);
-        DeleteGear(Gear)
-        end;
+        if nuw then
+            begin
+            Gear^.SoundChannel := LoopSound(sndPlaneWater);
+            StopSoundChan(Gear^.SoundChannel, 4000);
+            Gear^.SoundChannel := -1;
+            Gear^.Karma := 1;
+            end
+        else
+            begin
+            Gear^.SoundChannel := LoopSound(sndPlane);
+            Gear^.Karma := 0;
+            end;
+        end;
+
 end;
 
 procedure doStepAirAttack(Gear: PGear);
+var HHGear: PGear;
 begin
     AllInactive := false;
 
+    if (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.Gear <> nil) then
+        HHGear:= Gear^.Hedgehog^.Gear;
+
+    if (HHGear <> nil) then
+        PlaySoundV(sndIncoming, Gear^.Hedgehog^.Team^.voicepack);
+    AfterAttack;
+    CurAmmoGear := nil;
+
     if Gear^.X.QWordValue = 0 then
         begin
         Gear^.Tag :=  1;
-        Gear^.X := -_2048;
+        if (WorldEdge = weWrap) then
+            Gear^.X := int2hwFloat(CalcWorldWrap(Gear^.Target.X + max(384, LAND_WIDTH shr 2), 0))
+        else
+            Gear^.X := -_2048;
         end
     else
         begin
         Gear^.Tag := -1;
-        Gear^.X := int2hwFloat(max(LAND_WIDTH,4096) + 2048);
-        end;
-
-    Gear^.Y := int2hwFloat(topY-300);
+        if (WorldEdge = weWrap) then
+            Gear^.X := int2hwFloat(CalcWorldWrap(Gear^.Target.X - max(384, LAND_WIDTH shr 2), 0))
+        else
+            Gear^.X := int2hwFloat(max(LAND_WIDTH,4096) + 2048);
+        end;
+
+    Gear^.Y := int2hwFloat(topY - 300);
+
+    // Appear out of nowhere in wrap
+    if (WorldEdge = weWrap) then
+        AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtBigExplosion);
+
     Gear^.dX := int2hwFloat(Gear^.Target.X) - int2hwFloat(Gear^.Tag * (Gear^.Health-1) * Gear^.Damage) / 2;
 
     // calcs for Napalm Strike, so that it will hit the target (without wind at least :P)
@@ -3070,8 +3239,30 @@
             Gear^.dX := Gear^.dX - cBombsSpeed * hwSqrt((int2hwFloat(Gear^.Target.Y) - Gear^.Y) * 2 /
                 cGravity) * Gear^.Tag;
 
+    if (WorldEdge = weWrap) then
+        begin
+        Gear^.dX := int2hwFloat(CalcWorldWrap(hwRound(Gear^.dX), 0));
+        if (((Gear^.Tag = 1) and (not (Gear^.X < Gear^.dX))) or ((Gear^.Tag = -1) and (not (Gear^.X > Gear^.dX)))) then
+            Gear^.WDTimer:= 1;
+        end;
+
     Gear^.doStep := @doStepAirAttackWork;
-    Gear^.SoundChannel := LoopSound(sndPlane, 4000);
+
+    if (WorldEdge = weSea) then
+        begin
+        Gear^.SoundChannel := LoopSound(sndPlaneWater, 4000);
+        Gear^.Karma := 1;
+        end
+    else if  (WorldEdge = weWrap) then
+        begin
+        Gear^.SoundChannel := LoopSound(sndPlane, 500);
+        Gear^.Karma := 0;
+        end
+    else
+        begin
+        Gear^.SoundChannel := LoopSound(sndPlane, 4000);
+        Gear^.Karma := 0;
+        end;
 
 end;
 
@@ -3084,12 +3275,12 @@
     if (Gear^.State and gstCollision) <> 0 then
         begin
         doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound);
-        DeleteGear(Gear);
         {$IFNDEF PAS2C}
         with mobileRecord do
             if (performRumble <> nil) and (not fastUntilLag) then
                 performRumble(kSystemSoundID_Vibrate);
         {$ENDIF}
+        DeleteGear(Gear);
         exit
         end;
     if (GameTicks and $3F) = 0 then
@@ -3126,6 +3317,7 @@
             (hwRound(Distance(tx - int2hwFloat(leftX-(rightX-rx)), ty - y)) > cBuildMaxDist)
             )));
     if distFail
+    or CheckGearsUnderSprite(Ammoz[Gear^.AmmoType].PosSprite, Gear^.Target.X - SpritesData[Ammoz[Gear^.AmmoType].PosSprite].Width div 2, Gear^.Target.Y - SpritesData[Ammoz[Gear^.AmmoType].PosSprite].Height div 2, Gear^.State)
     or (not TryPlaceOnLand(Gear^.Target.X - SpritesData[Ammoz[Gear^.AmmoType].PosSprite].Width div 2, Gear^.Target.Y - SpritesData[Ammoz[Gear^.AmmoType].PosSprite].Height div 2, Ammoz[Gear^.AmmoType].PosSprite, Gear^.State, true, LandFlags)) then
         begin
         PlaySound(sndDenied);
@@ -3145,7 +3337,7 @@
         begin
         PlaySound(sndPlaced);
         DeleteGear(Gear);
-        AfterAttack;
+        AfterAttack
         end;
 
     HHGear^.State := HHGear^.State and (not (gstAttacking or gstAttacked));
@@ -3164,7 +3356,7 @@
     or (HHGear = nil)
     or ((HHGear^.State and gstMoving) = 0)
     or (HHGear^.Damage > 0)
-    or ((HHGear^.State and gstDrowning) = 1) then
+    or ((HHGear^.State and gstDrowning) <> 0) then
         begin
         DeleteGear(Gear);
         AfterAttack
@@ -3177,6 +3369,7 @@
         begin
         DeleteGear(Gear);
         AfterAttack;
+        exit
         end;
     inc(Gear^.Timer);
     if Gear^.Timer = 65 then
@@ -3273,25 +3466,26 @@
     hedgehog: PHedgehog;
     State: Longword;
     switchDir: Longword;
+    oldUid: Longword;
 begin
     AllInactive := false;
 
     if ((Gear^.Message and (not (gmSwitch or gmPrecise))) <> 0) or (TurnTimeLeft = 0) then
         begin
         hedgehog := Gear^.Hedgehog;
-        //Msg := Gear^.Message and (not gmSwitch);
-        DeleteGear(Gear);
         ApplyAmmoChanges(hedgehog^);
 
         HHGear := CurrentHedgehog^.Gear;
         ApplyAmmoChanges(HHGear^.Hedgehog^);
-        //HHGear^.Message := Msg;
+        DeleteGear(Gear);
+        bShowSwitcher:= false;
         exit
         end;
 
+    HHGear := CurrentHedgehog^.Gear;
     if (Gear^.Message and gmSwitch) <> 0 then
         begin
-        HHGear := CurrentHedgehog^.Gear;
+        oldUid:= HHGear^.uid;
         HHGear^.Message := HHGear^.Message and (not gmSwitch);
         Gear^.Message := Gear^.Message and (not gmSwitch);
 
@@ -3305,9 +3499,10 @@
             switchDir:=  1;
 
         State := HHGear^.State;
-        HHGear^.State := 0;
+        if (HHGear^.State and gstMoving) = 0 then
+            HHGear^.Active := false;
+        HHGear^.State := HHGear^.State and gstMoving;
         HHGear^.Z := cHHZ;
-        HHGear^.Active := false;
         HHGear^.Message:= HHGear^.Message or gmRemoveFromList or gmAddToList;
 
         PlaySound(sndSwitchHog);
@@ -3324,6 +3519,7 @@
         AmmoMenuInvalidated:= true;
 
         HHGear := CurrentHedgehog^.Gear;
+        ScriptCall('onHogSwitch', oldUid);
         HHGear^.State := State;
         HHGear^.Active := true;
         FollowGear := HHGear;
@@ -3332,9 +3528,10 @@
         if (switchDir <> 1) then
             HHGear^.Message:= HHGear^.Message or gmPrecise;
         HHGear^.Message:= HHGear^.Message or gmRemoveFromList or gmAddToList;
-        Gear^.X := HHGear^.X;
-        Gear^.Y := HHGear^.Y
-        end;
+        end;
+    doStepHedgehogMoving(HHGear);
+    Gear^.X := HHGear^.X;
+    Gear^.Y := HHGear^.Y
 end;
 
 procedure doStepSwitcher(Gear: PGear);
@@ -3343,6 +3540,9 @@
 begin
     Gear^.doStep := @doStepSwitcherWork;
 
+    // Note: The game assumes there's at most only one gtSwitcher gear in the game.
+    bShowSwitcher:= true;
+
     HHGear := Gear^.Hedgehog^.Gear;
     OnUsedAmmo(HHGear^.Hedgehog^);
     with HHGear^ do
@@ -3382,6 +3582,7 @@
         exit
         end;
 
+    // particles
     if (GameTicks and $3F) = 0 then
         AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtSmokeTrace);
 end;
@@ -3444,9 +3645,6 @@
 
         inc(Gear^.Damage, 2);
 
-        //  if TestCollisionXwithGear(HHGear, hwSign(Gear^.dX))
-        //      or TestCollisionYwithGear(HHGear, hwSign(Gear^.dY)) then inc(Gear^.Damage, 3);
-
         dec(i)
     until (i = 0)
     or (Gear^.Damage > Gear^.Health);
@@ -3516,9 +3714,20 @@
 end;
 
 procedure doStepKamikazeIdle(Gear: PGear);
+var HHGear: PGear;
 begin
     AllInactive := false;
     dec(Gear^.Timer);
+    HHGear := Gear^.Hedgehog^.Gear;
+    if (HHGear = nil) or (HHGear^.Damage <> 0) then
+        begin
+        if (HHGear <> nil) then
+            AfterAttack;
+        ClearHitOrder();
+        ClearProximityCache();
+        DeleteGear(Gear);
+        exit;
+        end;
     if Gear^.Timer = 0 then
         begin
         Gear^.Pos := 1;
@@ -3590,10 +3799,6 @@
     if Gear^.Pos = 0 then
         begin
 ///////////// adapted from doMakeExplosion ///////////////////////////
-        //fX:= Gear^.X;
-        //fY:= Gear^.Y;
-        //fX.QWordValue:= fX.QWordValue and $FFFFFFFF00000000;
-        //fY.QWordValue:= fY.QWordValue and $FFFFFFFF00000000;
         fX:= int2hwFloat(hwRound(Gear^.X));
         fY:= int2hwFloat(hwRound(Gear^.Y));
         dmgBase:= Gear^.Boom shl 1 + cHHRadius div 2;
@@ -3723,7 +3928,7 @@
         Gear^.Angle := (LongInt(Gear^.Angle) + 2) and 3;
 
         // Bounce effect
-        if (Gear^.Karma = 2) and (Gear^.Radius > 2) then
+        if (Gear^.Karma = 2) then
             AddBounceEffectForGear(Gear, 0.55);
 
         Gear^.Tag:= 0;
@@ -3865,30 +4070,6 @@
         end ;
     AfterAttack;
     DeleteGear(Gear);
-
-(*
-    Gear^.X := Gear^.X + Gear^.dX;
-    Gear^.Y := Gear^.Y + Gear^.dY;
-    x := hwRound(Gear^.X);
-    y := hwRound(Gear^.Y);
-
-    if ((y and LAND_HEIGHT_MASK) = 0) and ((x and LAND_WIDTH_MASK) = 0) then
-        if (Land[y, x] <> 0) then
-            begin
-            Gear^.dX.isNegative := not Gear^.dX.isNegative;
-            Gear^.dY.isNegative := not Gear^.dY.isNegative;
-            Gear^.dX := Gear^.dX * _1_5;
-            Gear^.dY := Gear^.dY * _1_5 - _0_3;
-            AmmoShove(Gear, 0, 40);
-            AfterAttack;
-            DeleteGear(Gear)
-            end
-        else
-    else
-        begin
-        AfterAttack;
-        DeleteGear(Gear)
-        end*)
 end;
 
 procedure doStepSeductionWear(Gear: PGear);
@@ -3913,6 +4094,8 @@
         inc(Gear^.Pos);
         if Gear^.Pos = 5 then
             PlaySound(sndYoohoo);
+        if Gear^.Pos = 14 then
+            PlaySound(sndKiss);
         end;
 
 
@@ -3923,14 +4106,6 @@
         if heart <> nil then
             with heart^ do
                 begin
-                { // old calcs
-                dx:= 0.001 * (random(200));
-                dy:= 0.001 * (random(200));
-                if random(2) = 0 then
-                    dx := -dx;
-                if random(2) = 0 then
-                    dy := -dy;
-                }
 
                 // randomize speed in both directions
                 dx:= 0.001 * (random(201));
@@ -3968,7 +4143,6 @@
 procedure doStepSeduction(Gear: PGear);
 begin
     AllInactive := false;
-    //DeleteCI(Gear^.Hedgehog^.Gear);
     Gear^.doStep := @doStepSeductionWear
 end;
 
@@ -4123,6 +4297,7 @@
         Gear^.X:= Gear^.X+Gear^.dX*4;
         Gear^.Y:= Gear^.Y+Gear^.dY*4;
         Gear^.SoundChannel := LoopSound(sndDrillRocket);
+        Gear^.Pos:= 1;
         Gear^.doStep := @doStepDrillDrilling;
 
         if (Gear^.State and gsttmpFlag) <> 0 then
@@ -4368,14 +4543,8 @@
         dec(Gear^.Pos);
     AllInactive := false;
     HHGear := Gear^.Hedgehog^.Gear;
-    //dec(Gear^.Timer);
     move := _0_2;
     fuel := 50;
-(*if (HHGear^.Message and gmPrecise) <> 0 then
-    begin
-    move:= _0_02;
-    fuel:= 5;
-    end;*)
     if HHGear^.Message and gmPrecise <> 0 then
         HedgehogChAngle(HHGear)
     else if (Gear^.Health > 0) or (Gear^.Health = JETPACK_FUEL_INFINITE) then
@@ -4455,8 +4624,12 @@
         end;
 
     if (HHGear^.Message and (gmAttack or gmUp or gmLeft or gmRight) <> 0) and
-       (HHGear^.Message and gmPrecise = 0) then
+       (HHGear^.Message and gmPrecise = 0) and
+       ((Gear^.State and gsttmpFlag) <> 0) then
+        begin
         Gear^.State := Gear^.State and (not gsttmpFlag);
+        HHGear^.dX := Gear^.dX;
+        end;
 
     if HHGear^.Message and gmPrecise = 0 then
         HHGear^.Message := HHGear^.Message and (not (gmUp or gmLeft or gmRight));
@@ -4471,11 +4644,12 @@
 
     if ((Gear^.State and gsttmpFlag) = 0)
     or (HHGear^.dY < _0) then
-        doStepHedgehogMoving(HHGear);
-
-    if // (Gear^.Health = 0)
+        doStepHedgehogMoving(HHGear)
+    else
+        HHGear^.dX:= SignAs(_0, HHGear^.dX);
+
+    if
         (HHGear^.Damage <> 0)
-        //or CheckGearDrowning(HHGear)
         // drown if too deep under water
         or (cWaterLine + cVisibleWater * 4 < hwRound(HHGear^.Y))
         or (TurnTimeLeft = 0)
@@ -4489,16 +4663,11 @@
                 Active := true;
                 State := State or gstMoving
                 end;
-            DeleteGear(Gear);
             if (GetAmmoEntry(HHGear^.Hedgehog^, amJetpack)^.Count >= 1) and ((Ammoz[HHGear^.Hedgehog^.CurAmmoType].Ammo.Propz and ammoprop_AltUse) <> 0) and (HHGear^.Hedgehog^.MultiShootAttacks = 0) then
                 HHGear^.Hedgehog^.CurAmmoType:= amJetpack;
             isCursorVisible := false;
             ApplyAmmoChanges(HHGear^.Hedgehog^);
-        //    if Gear^.Tex <> nil then FreeTexture(Gear^.Tex);
-
-//    Gear^.Tex:= RenderStringTex(trmsg[sidFuel] + ': ' + inttostr(round(Gear^.Health / 20)) + '%', cWhiteColor, fntSmall)
-
-//AddCaption(trmsg[sidFuel]+': '+inttostr(round(Gear^.Health/20))+'%', cWhiteColor, capgrpAmmostate);
+            DeleteGear(Gear);
             end
 end;
 
@@ -4522,8 +4691,8 @@
         if (dY < _0_1) and (dY > -_0_1) then
             begin
             Gear^.State := Gear^.State or gsttmpFlag;
-            dX := SignAs(_0, dX);
-            dY := dY - _0_2
+            dY := dY - _0_2;
+            Gear^.dX:= dX;
             end
         end
 end;
@@ -4536,9 +4705,7 @@
     if Gear^.Timer < 2000 then
         inc(Gear^.Timer, 1)
     else
-        begin
-        DeleteGear(Gear);
-        end;
+        DeleteGear(Gear)
 end;
 
 procedure doStepBirdyFly(Gear: PGear);
@@ -4744,7 +4911,6 @@
     AllInactive := false;
     Gear^.dX := Gear^.dX;
     doStepFallingGear(Gear);
-    //    CheckGearDrowning(Gear); // already checked for in doStepFallingGear
     CalcRotationDirAngle(Gear);
 
     if (Gear^.State and gstCollision) <> 0 then
@@ -5299,8 +5465,51 @@
     newPortal^.doStep := @doStepMovingPortal;
 end;
 
+procedure doStepPiano(Gear: PGear);
+var valid: boolean;
+    HHGear: PGear;
+begin
+    AllInactive := false;
+    valid := true;
+
+    if (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.Gear <> nil) then
+        HHGear := Gear^.Hedgehog^.Gear;
+
+    if (WorldEdge = weBounce) then
+        if (hwRound(Gear^.X) - Gear^.Radius < leftX) then
+            valid := false
+        else if (hwRound(Gear^.X) + Gear^.Radius > rightX) then
+            valid := false;
+
+    if (not valid) then
+        begin
+        if (HHGear <> nil) then
+            begin
+            HHGear^.Message := HHGear^.Message and (not gmAttack);
+            HHGear^.State := HHGear^.State and (not gstAttacking);
+            HHGear^.State := HHGear^.State or gstChooseTarget;
+            isCursorVisible := true;
+            end;
+        DeleteGear(Gear);
+        PlaySound(sndDenied);
+        exit;
+        end;
+
+    isCursorVisible := false;
+    if (HHGear <> nil) then
+        begin
+        PlaySoundV(sndIncoming, Gear^.Hedgehog^.Team^.voicepack);
+        // Tuck the hedgehog away until the piano attack is completed
+        Gear^.Hedgehog^.Unplaced:= true;
+        HHGear^.X:= _0;
+        HHGear^.Y:= _0;
+        end;
+
+    PauseMusic;
+    Gear^.doStep:= @doStepPianoWork;
+end;
 ////////////////////////////////////////////////////////////////////////////////
-procedure doStepPiano(Gear: PGear);
+procedure doStepPianoWork(Gear: PGear);
 var
     r0, r1: LongInt;
     odY: hwFloat;
@@ -5327,7 +5536,7 @@
         CurrentHedgehog^.Gear^.Message := CurrentHedgehog^.Gear^.Message and (not gmSlot);
         end;
 
-    if (*((Gear^.Pos = 3) and ((GameFlags and gfSolidLand) <> 0)) or*) (Gear^.Pos = 5) then
+    if (Gear^.Pos = 5) then
         begin
         Gear^.dY := Gear^.dY + cGravity * 2;
         Gear^.Y := Gear^.Y + Gear^.dY;
@@ -5655,7 +5864,6 @@
                     SignAs(AngleSin(HHGear^.Angle) * speed, HHGear^.dX) + rx,
                     AngleCos(HHGear^.Angle) * ( - speed) + ry, 0);
             flame^.CollisionMask:= lfNotCurHogCrate;
-            //flame^.FlightTime:= 500;  use the default huge value to avoid sticky flame suddenly being damaging as opposed to other flames
 
             if (Gear^.Health mod 30) = 0 then
                 begin
@@ -5663,7 +5871,6 @@
                         SignAs(AngleSin(HHGear^.Angle) * speed, HHGear^.dX) + rx,
                         AngleCos(HHGear^.Angle) * ( - speed) + ry, 0);
                 flame^.CollisionMask:= lfNotCurHogCrate;
-        //flame^.FlightTime:= 500;
                 end
             end;
         Gear^.Timer:= Gear^.Tag
@@ -5697,7 +5904,12 @@
     HHGear := Gear^.Hedgehog^.Gear;
     HHGear^.Message := HHGear^.Message and (not (gmUp or gmDown or gmLeft or gmRight));
     HHGear^.State := HHGear^.State or gstNotKickable;
-    Gear^.SoundChannel := LoopSound(sndFlamethrower);
+    (* NOTE: Flamethrower sound is supposed to start instantly (no fade in),
+    but this would cause the game volume to screw up because of a bug in SDL_mixer:
+    https://bugzilla.libsdl.org/show_bug.cgi?id=4205
+    As workaround, a tiny fade-in delay was added.
+    FIXME: Remove the fade-in delay argument when the SDL bug has been fixed. *)
+    Gear^.SoundChannel := LoopSound(sndFlamethrower, 20);
     Gear^.doStep := @doStepFlamethrowerWork
 end;
 
@@ -5836,7 +6048,6 @@
         if (tmp^.Kind = gtHedgehog) or (tmp^.Kind = gtMine) or (tmp^.Kind = gtExplosives) then
             begin
             dmg:= 0;
-            //tmp^.State:= tmp^.State or gstFlatened;
             if (tmp^.Kind <> gtHedgehog) or (tmp^.Hedgehog^.Effects[heInvulnerable] = 0) then
                 begin
                 // base damage on remaining health
@@ -5854,7 +6065,6 @@
 
             if (tmp^.Kind <> gtHedgehog) or (dmg > 0) or (tmp^.Health > tmp^.Damage) then
                 begin
-                //DrawTunnel(tmp^.X, tmp^.Y - _1, _0, _0_5, cHHRadius * 6, cHHRadius * 3);
                 tmp2:= AddGear(hwRound(tmp^.X), hwRound(tmp^.Y), gtHammerHit, 0, _0, _0, 0);
                 tmp2^.LinkedGear:= tmp;
                 SetAllToActive
@@ -5898,7 +6108,6 @@
         if CheckLandValue(hwRound(Gear^.X + Gear^.dX + SignAs(_6,Gear^.dX)), hwRound(Gear^.Y + _1_9)
            , lfIndestructible) then
             begin
-            //Gear^.X := Gear^.X + Gear^.dX;
             Gear^.Y := Gear^.Y + _1_9
             end;
         end;
@@ -5910,13 +6119,10 @@
         end
     else
         begin
-        //Gear^.dY := Gear^.dY + cGravity;
-        //Gear^.Y := Gear^.Y + Gear^.dY;
         if CheckCoordInWater(hwRound(Gear^.X), hwRound(Gear^.Y)) then
             Gear^.Timer := 1
         end;
 
-    //Gear^.X := Gear^.X + HitGear^.dX;
     HitGear^.X := Gear^.X;
     HitGear^.Y := Gear^.Y;
     SetLittle(HitGear^.dY);
@@ -5961,13 +6167,6 @@
     AllInactive := false;
     hh := Gear^.Hedgehog;
 
-    // no, you can't do that here
-    {DrawCentered(hwRound(hh^.Gear^.X) + WorldDx, hwRound(hh^.Gear^.Y) + WorldDy -
-            cHHRadius - 14 - hh^.HealthTagTex^.h, hh^.HealthTagTex);
-    }
-    (*DrawCircle(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Radius, 1.5, 0, 0, $FF,
-            $FF);*)
-
     if ((Gear^.Message and gmUp) <> 0) then
         begin
         if (GameTicks and $F) <> 0 then
@@ -6003,12 +6202,6 @@
         RecountTeamHealth(hh^.Team);
         inc(graves.ar^[Gear^.Tag]^.Health);
         inc(Gear^.Tag)
-{-for i:= 0 to High(graves) do begin
-            if hh^.Gear^.Health > 0 then begin
-                dec(hh^.Gear^.Health);
-                inc(graves[i]^.Health);
-            end;
-        end; -}
         end
     else
         begin
@@ -6025,8 +6218,12 @@
                 RenderHealth(resgear^.Hedgehog^);
                 RecountTeamHealth(resgear^.Hedgehog^.Team);
                 resgear^.Hedgehog^.Effects[heResurrected]:= 1;
+                if resgear^.Hedgehog^.King then
+                    resgear^.Hedgehog^.Team^.hasKing:= true;
                 { Reviving a hog implies its clan is now alive, too. }
                 resgear^.Hedgehog^.Team^.Clan^.DeathLogged:= false;
+                if (not resgear^.Hedgehog^.Team^.Passive) then
+                    resgear^.Hedgehog^.Team^.Clan^.Passive:= false;
                 s:= ansistring(resgear^.Hedgehog^.Name);
                 AddCaption(FormatA(GetEventString(eidResurrected), s), capcolDefault, capgrpMessage);
                 // only make hat-less hedgehogs look like zombies, preserve existing hats
@@ -6042,7 +6239,6 @@
         Gear^.Timer := 250;
         Gear^.doStep := @doStepIdle;
         end
-    //if hh^.Gear^.Health = 0 then doStepHedgehogFree(hh^.Gear);
 end;
 
 procedure doStepResurrector(Gear: PGear);
@@ -6141,6 +6337,25 @@
     s: ansistring;
 begin
 HH:= Gear^.Hedgehog;
+if Gear^.Tag = 0 then
+    begin
+    if HH^.Gear <> nil then
+        begin
+        if (HH^.Gear^.Damage <> 0) or (HH^.Gear^.Health = 0) or
+        ((HH^.Gear^.State and (gstMoving or gstHHDeath or gstHHGone or gstDrowning)) <> 0) then
+            begin
+            Gear^.Tag:= 1;
+            HH^.Gear^.State:= HH^.Gear^.State and (not gstAttacking);
+            HH^.Gear^.Message:= HH^.Gear^.Message and (not gmAttack);
+            AfterAttack;
+            end;
+        end
+    else if HH^.GearHidden = nil then
+        Gear^.Tag:= 1;
+    if (Gear^.Tag = 1) and (Gear = CurAmmoGear) then
+        CurAmmoGear:= nil;
+    end;
+
 if Gear^.Pos = 2 then
     begin
     StopSoundChan(Gear^.SoundChannel);
@@ -6149,14 +6364,14 @@
         begin
         if (HH^.Gear <> nil) and (HH^.Gear^.State and gstInvisible = 0) then
             begin
-            AfterAttack;
-            if Gear = CurAmmoGear then CurAmmoGear := nil;
-            if (HH^.Gear^.Damage = 0) and  (HH^.Gear^.Health > 0) and
-            ((Gear^.State and (gstMoving or gstHHDeath or gstHHGone)) = 0) then
-                HideHog(HH)
+            if Gear^.Tag = 0 then
+                AfterAttack;
+            if Gear = CurAmmoGear then
+                CurAmmoGear:= nil;
+            if Gear^.Tag = 0 then
+                HideHog(HH);
             end
-        //else if (HH^.Gear <> nil) and (HH^.Gear^.State and gstInvisible <> 0) then
-        else if (HH^.GearHidden <> nil) then// and (HH^.Gear^.State and gstInvisible <> 0) then
+        else if (HH^.GearHidden <> nil) then
             begin
             RestoreHog(HH);
             s:= ansistring(HH^.Name);
@@ -6176,8 +6391,7 @@
     begin
     inc(Gear^.Power);
     if (Gear^.Power = 172) and (HH^.Gear <> nil) and
-        (HH^.Gear^.Damage = 0) and (HH^.Gear^.Health > 0) and
-        ((HH^.Gear^.State and (gstMoving or gstHHDeath or gstHHGone)) = 0) then
+        (Gear^.Tag = 0) then
             with HH^.Gear^ do
                 begin
                 State:= State or gstAnimation;
@@ -6262,9 +6476,8 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 (*
-WIP. The ice gun will have the following effects.  It has been proposed by sheepluva that it take the appearance of a large freezer
-spewing ice cubes.  The cubes will be visual gears only.  The scatter from them and the impact snow dust should help hide imprecisions in things like the GearsNear effect.
-For now we assume a "ray" like a deagle projected out from the gun.
+The ice gun has the following effects:
+A "ray" like a deagle is projected out from the gun.
 All these effects assume the ray's angle is not changed and that the target type was unchanged over a number of ticks.  This is a simplifying assumption for "gun was applying freezing effect to the same target".
   * When fired at water a layer of ice textured land is added above the water.
   * When fired at non-ice land (land and lfLandMask and not lfIce) the land is overlaid with a thin layer of ice textured land around that point (say, 1 or 2px into land, 1px above). For attractiveness, a slope would probably be needed.
@@ -6272,10 +6485,8 @@
     As long as the gun is on the hog, a frozen hog sprite creeps up from the feet to the head.
     If the effect is interrupted before reaching the top, the freezing state is cleared.
 A frozen hog will animate differently.
-    To be decided, but possibly in a similar fashion to a grave when it comes to explosions.
-    The hog might (possibly) not be damaged by explosions.
+    Frozen hogs take less damage and are harder to push.
     This might make freezing potentially useful for friendlies in a bad position.
-    It might be better to allow damage though.
 A frozen hog stays frozen for a certain number of turns.
     Each turn the frozen overlay becomes fainter, until it fades and the hog animates normally again.
 *)
@@ -6317,8 +6528,6 @@
 
 
 procedure updateTarget(Gear:PGear; newX, newY:HWFloat);
-//    var
-//    iter:PGear;
 begin
   with Gear^ do
   begin
@@ -6335,10 +6544,7 @@
 procedure doStepIceGun(Gear: PGear);
 const iceWaitCollision = 0;
 const iceCollideWithGround = 1;
-//const iceWaitNextTarget:Longint = 2;
-//const iceCollideWithHog:Longint = 4;
 const iceCollideWithWater = 5;
-//const waterFreezingTime:Longint = 500;
 const groundFreezingTime = 1000;
 const iceRadius = 32;
 const iceHeight = 40;
@@ -6359,9 +6565,10 @@
         exit
         end;
     updateFuel(Gear);
-    if WorldWrap(Gear) and (WorldEdge = weWrap) and (Gear^.Target.X = NoPointX) then
-        // Use FlightTime to count number of times the gear has world-wrapped
-        inc(Gear^.FlightTime);
+    if (WorldEdge <> weBounce) then
+        if WorldWrap(Gear) and (WorldEdge = weWrap) and (Gear^.Target.X = NoPointX) then
+            // Use FlightTime to count number of times the gear has world-wrapped
+            inc(Gear^.FlightTime);
 
     with Gear^ do
         begin
@@ -6371,13 +6578,18 @@
         if (ndX <> dX) or (ndY <> dY) or (Gear^.Message and (gmUp or gmDown) <> 0) or
            (((Target.X <> NoPointX) and (Target.X and LAND_WIDTH_MASK = 0) and
              (Target.Y and LAND_HEIGHT_MASK = 0) and ((Land[Target.Y, Target.X] = 0)) and
-             (not CheckCoordInWater(Target.X, Target.Y))) and (CheckGearNear(gtAirMine, int2hwFloat(Target.X),int2hwFloat(Target.Y), Gear^.Radius*3, Gear^.Radius*3) = nil)) then
+             (not CheckCoordInWater(Target.X, Target.Y))) and (CheckGearNear(gtAirMine, int2hwFloat(Target.X),int2hwFloat(Target.Y), Gear^.Radius*3, Gear^.Radius*3) = nil) and
+             (not ((WorldEdge = weBounce) and ((Target.X > rightX) or (Target.X < leftX))))) then
             begin
             updateTarget(Gear, ndX, ndY);
             Timer := iceWaitCollision;
             FlightTime := 0;
             end
-        else
+        // Extend ice beam, unless it is far outside he map boundaries
+        else if (not ((hwRound(X + dX) > max(LAND_WIDTH,4096)*2) or
+            (hwRound(X + dX) < -max(LAND_WIDTH,4096)*2) or
+            (hwRound(Y + dY) < -max(LAND_HEIGHT,4096)*2) or
+            (hwRound(Y + dY) > max(LAND_HEIGHT,4096)+512))) then
             begin
             X:= X + dX;
             Y:= Y + dY;
@@ -6508,7 +6720,6 @@
                         iter:= iter^.NextGear
                         end;
 
-                    // FillRoundInLandWithIce(Target.X, Target.Y, iceRadius);
                     SetAllHHToActive;
                     Timer := iceWaitCollision;
                     Power:= GameTicks
@@ -6528,22 +6739,6 @@
                     SetAllHHToActive;
                     Timer := iceWaitCollision;
                     end;
-(*
- Any ideas for something that would look good here?
-                if (Target.X <> NoPointX) and ((Timer = iceCollideWithGround) or (Timer = iceCollideWithWater)) and (GameTicks mod max((groundFreezingTime-((GameTicks - Power)*2)),2) = 0) then //and CheckLandValue(Target.X, Target.Y, lfIce) then
-                    begin
-                        vg:= AddVisualGear(Target.X+random(20)-10, Target.Y+random(40)-10, vgtDust, 1);
-                        if vg <> nil then
-                            begin
-                            i:= random(100) + 155;
-                            vg^.Tint:= IceColor or $FF;
-                            vg^.Angle:= random(360);
-                            vg^.dx:= 0.001 * random(80);
-                            vg^.dy:= 0.001 * random(80)
-                            end
-                    end;
-*)
-
 // freeze nearby hogs
                 hogs := GearsNear(int2hwFloat(Target.X), int2hwFloat(Target.Y), gtHedgehog, Gear^.Radius*2);
                 if hogs.size > 0 then
@@ -6571,6 +6766,13 @@
                 X:= HHGear^.X;
                 Y:= HHGear^.Y
                 end
+            else if (WorldEdge = weBounce) and ((gX > rightX) or (gX < leftX)) then
+                begin
+                Target.X:= gX;
+                Target.Y:= gY;
+                X:= HHGear^.X;
+                Y:= HHGear^.Y
+                end
             else
                 begin
                 iter:= CheckGearNear(Gear, gtAirMine, Gear^.Radius*2, Gear^.Radius*2);
@@ -6582,16 +6784,6 @@
                     Y:= HHGear^.Y
                     end 
                 end;
-            if (gX > max(LAND_WIDTH,4096)*2) or
-                    (gX < -max(LAND_WIDTH,4096)) or
-                    (gY < -max(LAND_HEIGHT,4096)) or
-                    (gY > max(LAND_HEIGHT,4096)+512) then
-                begin
-                //X:= HHGear^.X;
-                //Y:= HHGear^.Y
-                Target.X:= gX;
-                Target.Y:= gY;
-                end
         end
     end;
 end;
@@ -6814,8 +7006,6 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 procedure doStepKnife(Gear: PGear);
-//var ox, oy: LongInt;
-//    la: hwFloat;
 var   a: real;
 begin
     // Gear is shrunk so it can actually escape the hog without carving into the terrain
@@ -6839,29 +7029,12 @@
         end
     else if (Gear^.CollisionIndex = -1) and (Gear^.Timer = 0) then
         begin
-        (*ox:= 0; oy:= 0;
-        if TestCollisionYwithGear(Gear, -1) <> 0 then oy:= -1;
-        if TestCollisionXwithGear(Gear, 1)  <> 0 then ox:=  1;
-        if TestCollisionXwithGear(Gear, -1) <> 0 then ox:= -1;
-        if TestCollisionYwithGear(Gear, 1)  <> 0 then oy:=  1;
-
-        la:= _10000;
-        if (ox <> 0) or (oy <> 0) then
-            la:= CalcSlopeNearGear(Gear, ox, oy);
-        if la = _10000 then
-            begin
-            // debug for when we couldn't get an angle
-            //AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtSmokeWhite);
-*)
         if Gear^.Health > 0 then
             PlaySound(Gear^.ImpactSound);
 
             Gear^.DirAngle:= DxDy2Angle(Gear^.dX, Gear^.dY) + (random(30)-15);
             if (Gear^.dX.isNegative and Gear^.dY.isNegative) or
              ((not Gear^.dX.isNegative) and (not Gear^.dY.isNegative)) then Gear^.DirAngle:= Gear^.DirAngle-90;
- //           end
- //       else Gear^.DirAngle:= hwFloat2Float(la)*90; // sheepluva's comment claims 45deg = 0.5 - yet orientation doesn't seem consistent?
- //       AddFileLog('la: '+floattostr(la)+' DirAngle: '+inttostr(round(Gear^.DirAngle)));
         Gear^.dX:= _0;
         Gear^.dY:= _0;
         Gear^.State:= Gear^.State and (not gstMoving) or gstCollision;
@@ -6963,137 +7136,4 @@
     Gear^.doStep := @doStepBulletWork
 end;
 
-(*
- This didn't end up getting used, but, who knows, might be reasonable for javellin or something
-// Make the knife initial angle based on the hog attack angle, or is that too hard?
-procedure doStepKnife(Gear: PGear);
-var t,
-    gx, gy, ga,  // gear x,y,angle
-    lx, ly, la, // land x,y,angle
-    ox, oy, // x,y offset
-    w, h,   // wXh of clip area
-    tx, ty  // tip position in sprite
-    : LongInt;
-    surf: PSDL_Surface;
-    s: hwFloat;
-
-begin
-    Gear^.dY := Gear^.dY + cGravity;
-    if (GameFlags and gfMoreWind) <> 0 then
-        Gear^.dX := Gear^.dX + cWindSpeed / Gear^.Density;
-    Gear^.X := Gear^.X + Gear^.dX;
-    Gear^.Y := Gear^.Y + Gear^.dY;
-    CheckGearDrowning(Gear);
-    gx:= hwRound(Gear^.X);
-    gy:= hwRound(Gear^.Y);
-    if Gear^.State and gstDrowning <> 0 then exit;
-    with Gear^ do
-        begin
-        if CheckLandValue(gx, gy, lfLandMask) then
-            begin
-            t:= Angle + hwRound((hwAbs(dX)+hwAbs(dY)) * _10);
-
-            if t < 0 then inc(t, 4096)
-            else if 4095 < t then dec(t, 4096);
-            Angle:= t;
-
-            DirAngle:= Angle / 4096 * 360
-            end
-        else
-            begin
-//This is the set of postions for the knife.
-//Using FlipSurface and copyToXY the knife can be written to the LandPixels at 32 positions, and an appropriate line drawn in Land.
-            t:= Angle mod 1024;
-            case t div 128 of
-                0:  begin
-                    ox:=   2; oy:= 5;
-                    w :=  25;  h:= 5;
-                    tx:=   0; ty:= 2
-                    end;
-                1:  begin
-                    ox:=   2; oy:= 15;
-                     w:=  24;  h:=  8;
-                    tx:=   0; ty:=  7
-                    end;
-                2:  begin
-                    ox:=   2; oy:= 27;
-                     w:=  23;  h:= 12;
-                    tx:= -12; ty:= -5
-                    end;
-                3:  begin
-                    ox:=   2; oy:= 43;
-                     w:=  21;  h:= 15;
-                    tx:=   0; ty:= 14
-                    end;
-                4:  begin
-                    ox:= 29; oy:=  8;
-                     w:= 19;  h:= 19;
-                    tx:=  0; ty:= 17
-                    end;
-                5:  begin
-                    ox:= 29; oy:=  32;
-                     w:= 15;  h:=  21;
-                    tx:=  0; ty:=  20
-                    end;
-                6:  begin
-                    ox:= 51; oy:=   3;
-                     w:= 11;  h:=  23;
-                    tx:=  0; ty:=  22
-                    end;
-                7:  begin
-                    ox:= 51; oy:=  34;
-                     w:=  7;  h:=  24;
-                    tx:=  0; ty:=  23
-                    end
-                end;
-
-            surf:= SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 32, RMask, GMask, BMask, AMask);
-            copyToXYFromRect(SpritesData[sprKnife].Surface, surf, ox, oy, w, h, 0, 0);
-            // try to make the knife hit point first
-            lx := 0;
-            ly := 0;
-            if CalcSlopeTangent(Gear, gx, gy, lx, ly, 255) then
-                begin
-                la:= vector2Angle(int2hwFloat(lx), int2hwFloat(ly));
-                ga:= vector2Angle(dX, dY);
-                AddFileLog('la: '+inttostr(la)+' ga: '+inttostr(ga)+' Angle: '+inttostr(Angle));
-                // change  to 0 to 4096 forced by LongWord in Gear
-                if la < 0 then la:= 4096+la;
-                if ga < 0 then ga:= 4096+ga;
-                if ((Angle > ga) and (Angle < la)) or ((Angle < ga) and (Angle > la)) then
-                    begin
-                    if Angle >= 2048 then dec(Angle, 2048)
-                    else if Angle < 2048 then inc(Angle, 2048)
-                    end;
-                AddFileLog('la: '+inttostr(la)+' ga: '+inttostr(ga)+' Angle: '+inttostr(Angle))
-                end;
-            case Angle div 1024 of
-                0:  begin
-                    flipSurface(surf, true);
-                    flipSurface(surf, true);
-                    BlitImageAndGenerateCollisionInfo(gx-(w-tx), gy-(h-ty), w, surf)
-                    end;
-                1:  begin
-                    flipSurface(surf, false);
-                    BlitImageAndGenerateCollisionInfo(gx-(w-tx), gy-ty, w, surf)
-                    end;
-                2:  begin // knife was actually drawn facing this way...
-                    BlitImageAndGenerateCollisionInfo(gx-tx, gy-ty, w, surf)
-                    end;
-                3:  begin
-                    flipSurface(surf, true);
-                    BlitImageAndGenerateCollisionInfo(gx-tx, gy-(h-ty), w, surf)
-                    end
-                end;
-            SDL_FreeSurface(surf);
-            // this needs to calculate actual width/height + land clipping since update texture doesn't.
-            // i.e. this will crash if you fire near sides of map, but until I get the blit right, not going to put real values
-            UpdateLandTexture(hwRound(X)-32, 64, hwRound(Y)-32, 64, true);
-            DeleteGear(Gear);
-            exit
-            end
-        end;
-end;
-*)
-
 end.
--- a/hedgewars/uGearsHandlersRope.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uGearsHandlersRope.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -417,9 +417,9 @@
     if (Gear^.State and gstAttacked) = 0 then
         begin
         OnUsedAmmo(HHGear^.Hedgehog^);
-        Gear^.State := Gear^.State or gstAttacked
+        Gear^.State := Gear^.State or gstAttacked;
+        ApplyAmmoChanges(HHGear^.Hedgehog^);
         end;
-    ApplyAmmoChanges(HHGear^.Hedgehog^)
 end;
 
 procedure doStepRopeAttach(Gear: PGear);
--- a/hedgewars/uGearsHedgehog.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uGearsHedgehog.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -147,14 +147,6 @@
 
 HHGear^.Message:= HHGear^.Message and (not gmWeapon);
 
-// Special case: amNothing unselects weapon
-if weap = amNothing then
-    begin
-    HHGear^.Hedgehog^.CurAmmoType:= amNothing;
-    ApplyAmmoChanges(HHGear^.Hedgehog^);
-    exit
-    end;
-
 if Hedgehog^.Team^.Clan^.TurnNumber <= Ammoz[weap].SkipTurns then
     exit; // weapon is not activated yet
 
@@ -278,7 +270,7 @@
     newGear:  PGear;
     CurWeapon: PAmmo;
     usedAmmoType: TAmmoType;
-    altUse: boolean;
+    altUse, faceLeft: boolean;
     elastic: hwFloat;
 begin
 newGear:= nil;
@@ -422,7 +414,10 @@
                                  PlaySound(sndBaseballBat) // TODO: Only play if something is hit?
                                  end;
                     amParachute: begin
+                                 faceLeft:= IsHogFacingLeft(Gear);
                                  newGear:= AddGear(hwRound(lx), hwRound(ly), gtParachute, 0, _0, _0, 0);
+                                 if faceLeft then
+                                     newGear^.Tag:= -1;
                                  PlaySound(sndParachute)
                                  end;
                     // we save CurWeapon^.Pos (in this case: cursor direction) by using it as (otherwise irrelevant) X value of the new gear.
@@ -487,14 +482,7 @@
                                  PlaySoundV(sndOw1, Team^.voicepack);
                                  cVampiric:= true;
                                  end;
-                        amPiano: begin
-                                 // Tuck the hedgehog away until the piano attack is completed
-                                 Unplaced:= true;
-                                 X:= _0;
-                                 Y:= _0;
-                                 newGear:= AddGear(TargetPoint.X, -1024, gtPiano, 0, _0, _0, 0);
-                                 PauseMusic
-                                 end;
+                        amPiano: newGear:= AddGear(TargetPoint.X, -1024, gtPiano, 0, _0, _0, 0);
                  amFlamethrower: newGear:= AddGear(hwRound(X), hwRound(Y), gtFlamethrower,  0, xx * _0_5, yy * _0_5, 0);
                       amLandGun: newGear:= AddGear(hwRound(X), hwRound(Y), gtLandGun,  0, xx * _0_5, yy * _0_5, 0);
                   amResurrector: begin
@@ -537,10 +525,11 @@
                 amFlamethrower, amLandGun,
                  amResurrector, amTardis,
                        amPiano, amIceGun,
+                   amAirAttack, amNapalm,
+                  amMineStrike, amDrillStrike,
                       amRubber, amMinigun: CurAmmoGear:= newGear;
             end;
             if CurAmmoType = amCake then FollowGear:= newGear;
-            if CurAmmoType = amAirMine then newGear^.Hedgehog:= nil;
 
             if ((CurAmmoType = amMine) or (CurAmmoType = amSMine) or (CurAmmoType = amAirMine)) and (GameFlags and gfInfAttack <> 0) then
                 newGear^.FlightTime:= GameTicks + min(TurnTimeLeft,1000)
@@ -799,6 +788,7 @@
     healthBoost: LongInt;
 begin
 if Gear^.State and gstFrozen <> 0 then exit;
+if Gear^.Message and gmDestroy <> 0 then exit;
 
 Gear^.Message:= gmDestroy;
 if (Gear^.Pos and posCaseExplode) <> 0 then
@@ -863,19 +853,20 @@
         with Gear^.Hedgehog^ do
             with CurWeapon^ do
                 begin
-                if (Gear^.Message and gmLeft  ) <> 0 then
+                if Ammoz[AmmoType].PosCount < 2 then
+                    exit
+                else if (Gear^.Message and gmLeft  ) <> 0 then
                     Pos:= (Pos - 1 + Ammoz[AmmoType].PosCount) mod Ammoz[AmmoType].PosCount
+                else if (Gear^.Message and gmRight ) <> 0 then
+                    Pos:= (Pos + 1) mod Ammoz[AmmoType].PosCount
                 else
-                    if (Gear^.Message and gmRight ) <> 0 then
-                        Pos:= (Pos + 1) mod Ammoz[AmmoType].PosCount
-    else
+                    exit;
+                GHStepTicks:= 200;
+                exit
+                end;
+
+    if (Gear^.Hedgehog^.Unplaced) then
         exit;
-    GHStepTicks:= 200;
-    exit
-    end;
-
-if (Gear^.Hedgehog^.Unplaced) then
-    exit;
 
     if ((Gear^.Message and gmAnimate) <> 0) then
         begin
@@ -1225,7 +1216,8 @@
 if (not isFalling)
   and (hwAbs(Gear^.dX) + hwAbs(Gear^.dY) < _0_03) then
     begin
-    Gear^.State:= Gear^.State and (not gstWinner);
+    if (not GameOver) then
+        Gear^.State:= Gear^.State and (not gstWinner);
     Gear^.State:= Gear^.State and (not gstMoving);
     cnt:= 0;
     while (cnt < 6) and (not CheckGearDrowning(Gear)) and (Gear <> nil) and (TestCollisionYWithGear(Gear,1) = 0) do
@@ -1278,7 +1270,7 @@
         begin
         Gear^.FlightTime:= 0;
         s:= ansistring(CurrentHedgehog^.Name);
-        AddCaption(FormatA(GetEventString(eidHomerun), s), capcolDefault, capgrpMessage);
+        AddCaption(FormatA(GetEventString(eidHomerun), s), capcolDefault, capgrpMessage2);
         PlaySound(sndHomerun)
         end;
     end
@@ -1287,6 +1279,11 @@
     uStats.hedgehogFlight(Gear, Gear^.FlightTime);
     Gear^.FlightTime:= 0;
     end;
+if (WorldEdge = weNone) and (not Gear^.Hedgehog^.FlownOffMap) and (not isZero(Gear^.dX)) and (not isUnderwater) and ((Gear^.State and gstHHDriven) = 0) and (hwRound(Gear^.Y) < cWaterLine-300) and ((hwRound(Gear^.X) < leftX-2048) or (hwRound(Gear^.X) > rightX+2048)) then
+    begin
+    PlaySoundV(sndFlyAway, Gear^.Hedgehog^.Team^.voicepack);
+    Gear^.Hedgehog^.FlownOffMap:= true;
+    end;
 
 end;
 
@@ -1307,14 +1304,14 @@
 else if not isInMultiShoot then
     AllInactive:= false;
 
-if (TurnTimeLeft = 0) or (HHGear^.Damage > 0) or (LuaEndTurnRequested = true) then
+if (TurnTimeLeft = 0) or (HHGear^.Damage > 0) or (HHGear^.Health = 0) or (((GameFlags and gfKing) <> 0) and (not Hedgehog^.Team^.hasKing)) or (LuaEndTurnRequested = true) then
     begin
     if (Hedgehog^.CurAmmoType = amKnife) then
        LoadHedgehogHat(Hedgehog^, Hedgehog^.Hat);
     if TagTurnTimeLeft = 0 then
         TagTurnTimeLeft:= TurnTimeLeft;
     TurnTimeLeft:= 0;
-    if (GameOver = false) and ((GameFlags and gfInfAttack) = 0) and ((HHGear^.State and gstAttacked) = 0) and (HHGear^.Damage = 0) and (LuaNoEndTurnTaunts = false) then
+    if (GameOver = false) and ((GameFlags and gfInfAttack) = 0) and ((HHGear^.State and gstAttacked) = 0) and (HHGear^.Damage = 0) and (HHGear^.Health > 0) and (LuaNoEndTurnTaunts = false) and (uStats.getIsTurnSkipped() = false) then
         begin
         AddVoice(sndBoring, Hedgehog^.Team^.voicepack);
         if (GameFlags and gfInfAttack = 0) then
@@ -1329,7 +1326,7 @@
     StopSound(sndThrowPowerUp);
     LuaEndTurnRequested:= false;
     LuaNoEndTurnTaunts:= false;
-    if HHGear^.Damage > 0 then
+    if (HHGear^.Damage > 0) or (HHGear^.Health = 0) then
         HHGear^.State:= HHGear^.State and (not (gstHHJumping or gstHHHJump));
     exit
     end;
@@ -1517,7 +1514,9 @@
     begin
     if Gear^.Timer = 0 then
         begin
-        Gear^.State:= Gear^.State and (not (gstWait or gstLoser or gstWinner or gstAttacked or gstNotKickable or gstChooseTarget));
+        Gear^.State:= Gear^.State and (not (gstWait or gstLoser or gstAttacked or gstNotKickable or gstChooseTarget));
+        if (not GameOver) then
+            Gear^.State:= Gear^.State and (not gstWinner);
         if Gear^.Hedgehog^.Effects[heFrozen] = 0 then Gear^.Active:= false;
         AddCI(Gear);
         exit
--- a/hedgewars/uGearsList.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uGearsList.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -219,6 +219,54 @@
     gear^.Z:= cHHZ+1
 else gear^.Z:= cUsualZ;
 
+// set gstInBounceEdge if gear spawned inside the bounce world edge
+if WorldEdge = weBounce then
+    if (hwRound(gear^.X) - Gear^.Radius < leftX) or (hwRound(gear^.X) + Gear^.Radius > rightX) then
+        case gear^.Kind of
+            // list all gears here that could collide with the bounce world edge
+            gtHedgehog,
+            gtFlame,
+            gtMine,
+            gtAirBomb,
+            gtDrill,
+            gtNapalmBomb,
+            gtCase,
+            gtAirMine,
+            gtExplosives,
+            gtGrenade,
+            gtShell,
+            gtBee,
+            gtDynamite,
+            gtClusterBomb,
+            gtMelonPiece,
+            gtCluster,
+            gtMortar,
+            gtKamikaze,
+            gtCake,
+            gtWatermelon,
+            gtGasBomb,
+            gtHellishBomb,
+            gtBall,
+            gtRCPlane,
+            gtSniperRifleShot,
+            gtShotgunShot,
+            gtDEagleShot,
+            gtSineGunShot,
+            gtMinigunBullet,
+            gtEgg,
+            gtPiano,
+            gtSMine,
+            gtSnowball,
+            gtKnife,
+            gtCreeper,
+            gtMolotov,
+            gtFlake,
+            gtGrave,
+            gtPortal,
+            gtTarget:
+            gear^.State := gear^.State or gstInBounceEdge;
+        end;
+
 case Kind of
           gtFlame: Gear^.Boom := 2;  // some additional expl in there are x3, x4 this
        gtHedgehog: Gear^.Boom := 30;
@@ -330,6 +378,10 @@
                              ((GetRandom(90)+128) shl 16) or
                              (($d5+c) shl 8) or $ff}
                 end;
+   gtParachute: begin
+                gear^.Tag:= 1; // hog face dir. 1 = right, -1 = left
+                gear^.Z:= cCurrHHZ;
+                end;
        gtShell: begin
                 gear^.Elasticity:= _0_8;
                 gear^.Friction:= _0_8;
@@ -395,7 +447,7 @@
                 gear^.State:= Gear^.State or gstSubmersible
                 end;
    gtSeduction: begin
-                gear^.Radius:= 250;
+                gear^.Radius:= cSeductionDist;
                 end;
  gtShotgunShot: begin
                 if gear^.Timer = 0 then gear^.Timer:= 900;
@@ -429,10 +481,14 @@
                 if gear^.Timer = 0 then
                     begin
                     if cMinesTime < 0 then
-                        gear^.Timer:= getrandom(51)*100
+                        begin
+                        gear^.Timer:= getrandom(51)*100;
+                        gear^.Karma:= 1;
+                        end
                     else
-                        gear^.Timer:= cMinesTime
-                    end
+                        gear^.Timer:= cMinesTime;
+                    end;
+                gear^.RenderTimer:= true;
                 end;
      gtAirMine: begin
                 gear^.AdvBounce:= 1;
@@ -451,10 +507,14 @@
                 if gear^.Timer = 0 then
                     begin
                     if cMinesTime < 0 then
-                        gear^.Timer:= getrandom(13)*100
+                        begin
+                        gear^.Timer:= getrandom(13)*100;
+                        gear^.Karma:= 1;
+                        end
                     else
-                        gear^.Timer:= cMinesTime div 4
+                        gear^.Timer:= cMinesTime div 4;
                     end;
+                gear^.RenderTimer:= true;
                 gear^.WDTimer:= gear^.Timer
                 end;
        gtSMine: begin
@@ -467,6 +527,7 @@
                 gear^.AdvBounce:= 1;
                 gear^.Sticky:= true;
                 if gear^.Timer = 0 then gear^.Timer:= 500;
+                gear^.RenderTimer:= true;
                 end;
        gtKnife: begin
                 gear^.ImpactSound:= sndKnifeImpact;
@@ -486,6 +547,8 @@
                 end;
   gtExplosives: begin
                 gear^.AdvBounce:= 1;
+                if GameType in [gmtDemo, gmtRecord] then
+                    gear^.RenderHealth:= true;
                 gear^.ImpactSound:= sndGrenadeImpact;
                 gear^.nImpactSounds:= 1;
                 gear^.Radius:= 16;
@@ -544,6 +607,12 @@
                 gear^.Health:= 6;
                 gear^.Damage:= 30;
                 gear^.Z:= cHHZ+2;
+                gear^.Karma:= 0; // for sound effect: 0 = normal, 1 = underwater
+                gear^.Radius:= 150;
+                gear^.FlightTime:= 0; // for timeout in weWrap
+                gear^.Power:= 0; // count number of wraps in weWrap
+                gear^.WDTimer:= 0; // number of required wraps
+                gear^.Density:= _19;
                 gear^.Tint:= gear^.Hedgehog^.Team^.Clan^.Color shl 8 or $FF
                 end;
      gtAirBomb: begin
@@ -567,7 +636,8 @@
                 gear^.Elasticity:= _0_3;
                 end;
       gtTardis: begin
-                gear^.Pos:= 1;
+                gear^.Pos:= 1; // tardis phase
+                gear^.Tag:= 0; // 1 = hedgehog died, disappeared, took damage or moved
                 gear^.Z:= cCurrHHZ+1;
                 end;
       gtMortar: begin
@@ -617,6 +687,8 @@
                     gear^.Timer:= 5000;
                 // Tag for drill strike. if 1 then first impact occured already
                 gear^.Tag := 0;
+                // Pos for state. If 1, drill is drilling
+                gear^.Pos := 0;
                 gear^.Radius:= 4;
                 gear^.Density:= _1;
                 end;
@@ -655,7 +727,8 @@
        gtBirdy: begin
                 gear^.Radius:= 16; // todo: check
                 gear^.Health := 2000;
-                gear^.FlightTime := 2
+                gear^.FlightTime := 2;
+                gear^.Z:= cCurrHHZ;
                 end;
          gtEgg: begin
                 gear^.AdvBounce:= 1;
@@ -703,7 +776,7 @@
                 gear^.Tint:= $C0C000C0
                 end;
  gtResurrector: begin
-                gear^.Radius := 100;
+                gear^.Radius := cResurrectorDist;
                 gear^.Tag := 0;
                 gear^.Tint:= $F5DB35FF
                 end;
@@ -771,7 +844,6 @@
 procedure DeleteGear(Gear: PGear);
 var team: PTeam;
     t,i: Longword;
-    k: boolean;
     cakeData: PCakeData;
     iterator: PGear;
 begin
@@ -856,20 +928,36 @@
         Gear^.Hedgehog^.Gear:= nil;
 
         if Gear^.Hedgehog^.King then
+            // If king died, kill the rest of the team
             begin
-            // are there any other kings left? Just doing nil check.  Presumably a mortally wounded king will get reaped soon enough
-            k:= false;
+            with Gear^.Hedgehog^.Team^ do
+                begin
+                Gear^.Hedgehog^.Team^.hasKing:= false;
+                for t:= 0 to cMaxHHIndex do
+                    if Hedgehogs[t].Gear <> nil then
+                        Hedgehogs[t].Gear^.Health:= 0
+                    else if (Hedgehogs[t].GearHidden <> nil) then
+                        Hedgehogs[t].GearHidden^.Health:= 0  // Hog is still hidden. If tardis should return though, Lua, eh ...
+                end;
+            end;
+
+        // Update passive status of clan
+        if (not Gear^.Hedgehog^.Team^.Clan^.Passive) then
+            begin
+            Gear^.Hedgehog^.Team^.Clan^.Passive:= true;
             for i:= 0 to Pred(team^.Clan^.TeamsNumber) do
-                if (team^.Clan^.Teams[i]^.Hedgehogs[0].Gear <> nil) then
-                    k:= true;
-            if not k then
-                for i:= 0 to Pred(team^.Clan^.TeamsNumber) do
-                    with team^.Clan^.Teams[i]^ do
+                begin
+                with team^.Clan^.Teams[i]^ do
+                    if (not Passive) then
                         for t:= 0 to cMaxHHIndex do
-                            if Hedgehogs[t].Gear <> nil then
-                                Hedgehogs[t].Gear^.Health:= 0
-                            else if (Hedgehogs[t].GearHidden <> nil) then
-                                Hedgehogs[t].GearHidden^.Health:= 0  // hog is still hidden. if tardis should return though, lua, eh...
+                            if (Hedgehogs[t].Gear <> nil) or (Hedgehogs[t].GearHidden <> nil) then
+                                begin
+                                Gear^.Hedgehog^.Team^.Clan^.Passive:= false;
+                                break;
+                                end;
+                if (not Gear^.Hedgehog^.Team^.Clan^.Passive) then
+                    break;
+                end;
             end;
 
         // should be not CurrentHedgehog, but hedgehog of the last gear which caused damage to this hog
--- a/hedgewars/uGearsRender.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uGearsRender.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -6,7 +6,7 @@
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; version 2 of the License
  *
-	 * This program is distributed in the hope that it will be useful,
+     * This program 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.
@@ -37,7 +37,9 @@
          end;
 procedure RenderGear(Gear: PGear; x, y: LongInt);
 procedure RenderGearTimer(Gear: PGear; x, y: LongInt);
+procedure RenderGearHealth(Gear: PGear; x, y: LongInt);
 procedure RenderHHGuiExtras(Gear: PGear; ox, oy: LongInt);
+procedure RenderAirMineGuiExtras(Gear: PGear; ox, oy: LongInt);
 procedure DrawHHOrder();
 
 var RopePoints: record
@@ -53,7 +55,7 @@
                 end;
 
 implementation
-uses uRender, uUtils, uVariables, uAmmos, Math, uVisualGearsList;
+uses uRender, uRenderUtils, uGearsUtils, uUtils, uVariables, uAmmos, Math, uVisualGearsList;
 
 procedure DrawRopeLinesRQ(Gear: PGear);
 var n: LongInt;
@@ -69,8 +71,6 @@
 if (RopePoints.Count > 0) or (Gear^.Elasticity.QWordValue > 0) then
     begin
     EnableTexture(false);
-    //glEnable(GL_LINE_SMOOTH);
-
     
     Tint(Gear^.Tint shr 24 div 3, Gear^.Tint shr 16 and $FF div 3, Gear^.Tint shr 8 and $FF div 3, Gear^.Tint and $FF);
 
@@ -92,112 +92,79 @@
     openglPopMatrix();
 
     EnableTexture(true);
-    //glDisable(GL_LINE_SMOOTH)
     end
 end;
 
 
-function DrawRopeLine(X1, Y1, X2, Y2, roplen: LongInt): LongInt;
-var  eX, eY, dX, dY: LongInt;
-    i, sX, sY, x, y, d: LongInt;
-    b: boolean;
+procedure DrawRopeLine(X1, Y1, X2, Y2: Real; LayerIndex: Longword; var linesLength, ropeLength: Real);
+var dX, dY, angle, lineLength: Real;
+    FrameIndex: LongWord;
 begin
     if (X1 = X2) and (Y1 = Y2) then
-        begin
-        //OutError('WARNING: zero length rope line!', false);
-        DrawRopeLine:= 0;
-        exit
-        end;
-    eX:= 0;
-    eY:= 0;
+        exit;
+
     dX:= X2 - X1;
     dY:= Y2 - Y1;
+    lineLength:= sqrt(sqr(dX) + sqr(dY));
+    angle:= arctan2(dY, dX) * 180 / PI - 90;
 
-    if (dX > 0) then
-        sX:= 1
-    else
-        if (dX < 0) then
-            begin
-            sX:= -1;
-            dX:= -dX
-            end
-        else sX:= dX;
+    dX:= dX / lineLength;
+    dY:= dY / lineLength;
 
-    if (dY > 0) then
-        sY:= 1
-    else
-        if (dY < 0) then
-            begin
-            sY:= -1;
-            dY:= -dY
-            end
-        else
-            sY:= dY;
-
-    if (dX > dY) then
-        d:= dX
-    else
-        d:= dY;
+    while (ropeLength - linesLength) <= lineLength do
+    begin
+        FrameIndex:= round(ropeLength / cRopeNodeStep);
+        if (FrameIndex mod cRopeLayers) = LayerIndex then
+            DrawSpriteRotatedFReal(sprRopeNode,
+                X1 + (ropeLength - linesLength) * dX,
+                Y1 + (ropeLength - linesLength) * dY,
+                FrameIndex, 1, angle);
+        ropeLength:= ropeLength + cRopeNodeStep;
+    end;
+    linesLength:= linesLength + lineLength
+end;
 
-    x:= X1;
-    y:= Y1;
-
-    for i:= 0 to d do
+procedure DrawRopeLayer(Gear: PGear; LayerIndex: LongWord);
+var i: LongInt;
+    linesLength, ropeLength: Real;
+begin
+    linesLength:= 0;
+    ropeLength:= cRopeNodeStep;
+    if RopePoints.Count > 0 then
+    begin
+        i:= 0;
+        while i < Pred(RopePoints.Count) do
         begin
-        inc(eX, dX);
-        inc(eY, dY);
-        b:= false;
-        if (eX > d) then
-            begin
-            dec(eX, d);
-            inc(x, sX);
-            b:= true
-            end;
-        if (eY > d) then
-            begin
-            dec(eY, d);
-            inc(y, sY);
-            b:= true
-            end;
-        if b then
-            begin
-            inc(roplen);
-            if (roplen mod 4) = 0 then
-                DrawSprite(sprRopeNode, x - 2, y - 2, 0)
-            end
-    end;
-    DrawRopeLine:= roplen;
+            DrawRopeLine(hwFloat2Float(RopePoints.ar[i].X) + WorldDx, hwFloat2Float(RopePoints.ar[i].Y) + WorldDy,
+                         hwFloat2Float(RopePoints.ar[Succ(i)].X) + WorldDx, hwFloat2Float(RopePoints.ar[Succ(i)].Y) + WorldDy,
+                         LayerIndex, linesLength, ropeLength);
+            inc(i)
+        end;
+
+        DrawRopeLine(hwFloat2Float(RopePoints.ar[i].X) + WorldDx, hwFloat2Float(RopePoints.ar[i].Y) + WorldDy,
+                     hwFloat2Float(Gear^.X) + WorldDx, hwFloat2Float(Gear^.Y) + WorldDy,
+                     LayerIndex, linesLength, ropeLength);
+
+        DrawRopeLine(hwFloat2Float(Gear^.X) + WorldDx, hwFloat2Float(Gear^.Y) + WorldDy,
+                     hwFloat2Float(Gear^.Hedgehog^.Gear^.X) + WorldDx, hwFloat2Float(Gear^.Hedgehog^.Gear^.Y) + WorldDy,
+                     LayerIndex, linesLength, ropeLength);
+    end
+    else
+        if Gear^.Elasticity.QWordValue > 0 then
+            DrawRopeLine(hwFloat2Float(Gear^.X) + WorldDx, hwFloat2Float(Gear^.Y) + WorldDy,
+                         hwFloat2Float(Gear^.Hedgehog^.Gear^.X) + WorldDx, hwFloat2Float(Gear^.Hedgehog^.Gear^.Y) + WorldDy,
+                         LayerIndex, linesLength, ropeLength);
 end;
 
 procedure DrawRope(Gear: PGear);
-var roplen, i: LongInt;
+var i: LongInt;
 begin
     if Gear^.Hedgehog^.Gear = nil then exit;
     if (Gear^.Tag = 1) or ((cReducedQuality and rqSimpleRope) <> 0) then
         DrawRopeLinesRQ(Gear)
     else
-        begin
-        roplen:= 0;
-        if RopePoints.Count > 0 then
-            begin
-            i:= 0;
-            while i < Pred(RopePoints.Count) do
-                    begin
-                    roplen:= DrawRopeLine(hwRound(RopePoints.ar[i].X) + WorldDx, hwRound(RopePoints.ar[i].Y) + WorldDy,
-                                hwRound(RopePoints.ar[Succ(i)].X) + WorldDx, hwRound(RopePoints.ar[Succ(i)].Y) + WorldDy, roplen);
-                    inc(i)
-                    end;
-            roplen:= DrawRopeLine(hwRound(RopePoints.ar[i].X) + WorldDx, hwRound(RopePoints.ar[i].Y) + WorldDy,
-                        hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, roplen);
-            roplen:= DrawRopeLine(hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy,
-                        hwRound(Gear^.Hedgehog^.Gear^.X) + WorldDx, hwRound(Gear^.Hedgehog^.Gear^.Y) + WorldDy, roplen);
-            end
-        else
-            if Gear^.Elasticity.QWordValue > 0 then
-            roplen:= DrawRopeLine(hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy,
-                        hwRound(Gear^.Hedgehog^.Gear^.X) + WorldDx, hwRound(Gear^.Hedgehog^.Gear^.Y) + WorldDy, roplen);
-        end;
-
+        for i := 0 to cRopeLayers - 1 do
+            DrawRopeLayer(Gear, i);
 
 if RopePoints.Count > 0 then
     DrawSpriteRotated(sprRopeHook, hwRound(RopePoints.ar[0].X) + WorldDx, hwRound(RopePoints.ar[0].Y) + WorldDy, 1, RopePoints.HookAngle)
@@ -207,12 +174,23 @@
 end;
 
 
-procedure DrawAltWeapon(Gear: PGear; sx, sy: LongInt);
+procedure DrawSelectedWeapon(Gear: PGear; sx, sy: LongInt; isAltWeapon: boolean);
 begin
 with Gear^.Hedgehog^ do
     begin
-    if not (((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_AltUse) <> 0) and ((Gear^.State and gstAttacked) = 0)) then
+    if ((Gear^.State and gstAttacked) <> 0) then
+        exit;
+    if (isAltWeapon and ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_AltUse) = 0)) then
+        exit;
+    if (not isAltWeapon) and (((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_ShowSelIcon) = 0) or (
+            (((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_AttackInMove) = 0) and ((Gear^.State and gstMoving) <> 0)))) then
         exit;
+    if (not isAltWeapon) then
+        begin
+        sy:= sy - 64;
+        if (IsHogFacingLeft(Gear)) then
+            sx:= sx - 61;
+        end;
     DrawTexture(sx + 16, sy + 16, ropeIconTex);
     DrawTextureF(SpritesData[sprAMAmmos].Texture, 0.75, sx + 30, sy + 30, ord(CurAmmoType) - 1, 1, 32, 32);
     end;
@@ -243,7 +221,7 @@
         repeat
         hh:= @TeamsArray[t]^.Hedgehogs[i];
         inc(i);
-        if (hh <> nil) and (hh^.Gear <> nil) then
+        if (hh <> nil) and (hh^.Gear <> nil) and (not hh^.Unplaced) then
             begin
             inc(c);
             HHGear:= hh^.Gear;
@@ -263,7 +241,8 @@
 // Render some informational GUI next to hedgehog, like fuel and alternate weapon
 procedure RenderHHGuiExtras(Gear: PGear; ox, oy: LongInt);
 var HH: PHedgehog;
-    sx, sy: LongInt;
+    sx, sy, tx, ty, t, hogLR: LongInt;
+    dAngle: real;
 begin
     HH:= Gear^.Hedgehog;
     sx:= ox + 1; // this offset is very common
@@ -274,17 +253,79 @@
         exit;
     if (Gear^.State and gstHHGone) <> 0 then
         exit;
+    if (CinematicScript) then
+        exit;
 
+    // render finger (pointing arrow)
+    if bShowFinger and ((Gear^.State and gstHHDriven) <> 0) then
+        begin
+        ty := oy - 32;
+        // move finger higher up if tags or switching arrows are above hog
+        if (cTagsMask and htTeamName) <> 0 then
+            ty := ty - HH^.Team^.NameTagTex^.h - 2;
+        if (cTagsMask and htName) <> 0 then
+            ty := ty - HH^.NameTagTex^.h - 2;
+        if (cTagsMask and htHealth) <> 0 then
+            ty := ty - HH^.HealthTagTex^.h - 2;
+        if bShowSwitcher then
+            ty := ty - SpritesData[sprSwitch].Height - 4;
+        tx := ox;
+
+        // don't go offscreen
+        t:= 32;
+        tx := min(max(tx, ViewLeftX + t), ViewRightX - t);
+        ty := min(ty, ViewBottomY - 96);
+        // don't overlap with HH or HH tags
+        if ty < ViewTopY + t then
+            begin
+            if abs(tx - ox) < abs(ty - oy)  then
+                ty:= max(ViewTopY + t, oy + t)
+            else
+                ty:= max(ViewTopY + t, ty);
+            end;
+
+        dAngle := DxDy2Angle(int2hwfloat(ty - oy), int2hwfloat(tx - ox)) + 90;
+
+        if (IsTooDarkToRead(HH^.Team^.Clan^.Color)) then
+            DrawSpriteRotatedF(sprFingerBackInv, tx, ty, RealTicks div 32 mod 16, 1, dAngle)
+        else
+            DrawSpriteRotatedF(sprFingerBack, tx, ty, RealTicks div 32 mod 16, 1, dAngle);
+        Tint(HH^.Team^.Clan^.Color shl 8 or $FF);
+        DrawSpriteRotatedF(sprFinger, tx, ty, RealTicks div 32 mod 16, 1, dAngle);
+        untint;
+        end;
+
+    // render crosshair
+    if (CrosshairGear <> nil) and (Gear = CrosshairGear) then
+        begin
+        hogLR:= 1;
+        if IsHogFacingLeft(Gear) then
+            hogLR:= -1;
+        setTintAdd(true);
+        Tint(HH^.Team^.Clan^.Color shl 8 or $FF);
+        DrawTextureRotated(CrosshairTexture,
+                12, 12, CrosshairX + WorldDx, CrosshairY + WorldDy, 0,
+                hogLR * (Gear^.Angle * 180.0) / cMaxAngle);
+        untint;
+        setTintAdd(false);
+        end;
+
+    // render gear-related extras: alt weapon, fuel, other
     if ((Gear^.State and gstHHDriven) <> 0) and (CurAmmoGear <> nil) then
         begin
         case CurAmmoGear^.Kind of
             gtJetpack:      begin
+                            // render jetpack contour if underwater
+                            if (((not SuddenDeathDmg) and (WaterOpacity > cGearContourThreshold)) or (SuddenDeathDmg and (SDWaterOpacity > cGearContourThreshold))) and
+                                    ((cWaterLine < (hwRound(Gear^.Y) + Gear^.Radius - 16)) or
+                                    ((WorldEdge = weSea) and ((hwRound(Gear^.X) < LeftX) or (hwRound(Gear^.X) > RightX)))) then
+                                DrawSprite(sprJetpack, sx-32, sy-32, 4);
                             if CurAmmoGear^.Tex <> nil then
                                 DrawTextureCentered(sx, sy - 40, CurAmmoGear^.Tex);
-                            DrawAltWeapon(Gear, sx, sy);
+                            DrawSelectedWeapon(Gear, sx, sy, true);
                             end;
-            gtRope:         DrawAltWeapon(Gear, sx, sy);
-            gtParachute:    DrawAltWeapon(Gear, sx, sy);
+            gtRope:         DrawSelectedWeapon(Gear, sx, sy, true);
+            gtParachute:    DrawSelectedWeapon(Gear, sx, sy, true);
             gtLandGun:      if CurAmmoGear^.Tex <> nil then
                                 DrawTextureCentered(sx, sy - 40, CurAmmoGear^.Tex);
             gtFlamethrower: if CurAmmoGear^.Tex <> nil then
@@ -292,13 +333,49 @@
             gtIceGun:       if CurAmmoGear^.Tex <> nil then
                                 DrawTextureCentered(sx, sy - 40, CurAmmoGear^.Tex);
         end;
+        end
+    else if ((Gear^.State and gstHHDriven) <> 0) then
+        begin
+        DrawSelectedWeapon(Gear, sx, sy, false);
+        end
+end;
+
+procedure RenderAirMineGuiExtras(Gear: PGear; ox, oy: LongInt);
+var tinted: boolean;
+begin
+// render air mine contour, if underwater
+    if (((not SuddenDeathDmg) and (WaterOpacity > cGearContourThreshold)) or (SuddenDeathDmg and (SDWaterOpacity > cGearContourThreshold))) and
+        ((cWaterLine < (hwRound(Gear^.Y) + Gear^.Radius + 16)) or
+        ((WorldEdge = weSea) and ((hwRound(Gear^.X) < LeftX + 24) or (hwRound(Gear^.X) > RightX - 24)))) then
+        begin
+        tinted:= true;
+        // tint contour based on air mine state:
+        // not seeking or chasing (frozen, stunned or just launched)
+        if ((Gear^.State and gstFrozen) <> 0) or ((Gear^.State and gstTmpFlag) = 0) or (Gear^.Tag <> 0) then
+            // more transparent
+            Tint($FF, $FF, $FF, $80)
+        // chasing hog
+        else if (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.Gear <> nil) then
+            // reddish
+            Tint($FF, $30, $30, $FF)
+        // not seeking or chasing (no target)
+        else if (Gear^.State and gstChooseTarget) = 0 then
+            // more transparent
+            Tint($FF, $FF, $FF, $80)
+        // seeking
+        else
+            // default color
+            tinted:= false;
+        DrawSprite(sprAirMine, ox-16, oy-16, 32);
+        if tinted then
+            untint;
         end;
 end;
 
 procedure DrawHH(Gear: PGear; ox, oy: LongInt);
 var i, t: LongInt;
     amt: TAmmoType;
-    sign, hx, hy, tx, ty, sx, sy, m: LongInt;  // hedgehog, crosshair, temp, sprite, direction
+    sign, hx, hy, tx, ty, sx, sy, hogLR: LongInt;  // hedgehog, crosshair, temp, sprite, direction
     dx, dy, ax, ay, aAngle, dAngle, hAngle, lx, ly: real;  // laser, change
     wraps: LongWord; // numbe of wraps for laser in world wrap
     defaultPos, HatVisible, inWorldBounds: boolean;
@@ -309,17 +386,19 @@
     curhat: PTexture;
 begin
     HH:= Gear^.Hedgehog;
+    CrosshairGear:= nil;
     if HH^.Unplaced then
         exit;
     if (HH^.CurAmmoType = amKnife) and (HH = CurrentHedgehog) then
          curhat:= ChefHatTexture
     else curhat:= HH^.HatTex;
-    m:= 1;
-    if ((Gear^.State and gstHHHJump) <> 0) and (HH^.Effects[heArtillery] = 0) then
-        m:= -1;
     sx:= ox + 1; // this offset is very common
     sy:= oy - 3;
     sign:= hwSign(Gear^.dX);
+    if IsHogFacingLeft(Gear) then
+        hogLR:= -1
+    else
+        hogLR:= 1;
 
     if (Gear^.State and gstHHDeath) <> 0 then
         begin
@@ -404,7 +483,7 @@
         begin
         if ((Gear^.State and (gstHHThinking or gstAnimation)) = 0) and
 /// If current ammo is active, and current ammo has alt attack and uses a crosshair  (rope, basically, right now, with no crosshair for parachute/saucer
-            (((CurAmmoGear <> nil) and //((Ammoz[CurAmmoGear^.AmmoType].Ammo.Propz and ammoprop_AltAttack) <> 0) and
+            (((CurAmmoGear <> nil) and
             // don't render crosshair/laser during kamikaze
             ((CurAmmoGear^.AmmoType <> amKamikaze) or ((Gear^.State and gstAttacking) = 0)) and
              ((Ammoz[CurAmmoGear^.AmmoType].Ammo.Propz and ammoprop_NoCrossHair) = 0)) or
@@ -417,11 +496,11 @@
     3: I need to extend the beam beyond land.
     This routine perhaps should be pushed into uStore or somesuch instead of continuuing the increase in size of this function.
     *)
-            dx:= sign * m * Sin(Gear^.Angle * pi / cMaxAngle);
+            dx:= hogLR * Sin(Gear^.Angle * pi / cMaxAngle);
             dy:= -Cos(Gear^.Angle * pi / cMaxAngle);
             if cLaserSighting or cLaserSightingSniper then
                 begin
-                lx:= GetLaunchX(HH^.CurAmmoType, sign * m, Gear^.Angle);
+                lx:= GetLaunchX(HH^.CurAmmoType, hogLR, Gear^.Angle);
                 ly:= GetLaunchY(HH^.CurAmmoType, Gear^.Angle);
 
                 // ensure we start outside the hedgehog (he's solid after all)
@@ -445,7 +524,7 @@
                 hy:= ty;
                 wraps:= 0;
                 inWorldBounds := ((ty and LAND_HEIGHT_MASK) or (tx and LAND_WIDTH_MASK)) = 0;
-                while inWorldBounds and ((Land[ty, tx] and lfAll) = 0) do
+                while (inWorldBounds and ((Land[ty, tx] and lfAll) = 0)) or (not inWorldBounds) do
                     begin
                     if wraps > cMaxLaserSightWraps then
                         break;
@@ -454,7 +533,7 @@
                     tx:= round(lx);
                     ty:= round(ly);
                     // reached edge of land.
-                    if ((ty and LAND_HEIGHT_MASK) <> 0) then
+                    if ((ty and LAND_HEIGHT_MASK) <> 0) and (((ty < LAND_HEIGHT) and (ay < 0)) or ((ty >= TopY) and (ay > 0))) then
                         begin
                         // assume infinite beam. Extend it way out past camera
                         tx:= round(lx + ax * (max(LAND_WIDTH,4096) div 2));
@@ -462,11 +541,11 @@
                         break;
                         end;
 
-                    if ((sign*m < 0) and (tx < LeftX)) or ((sign*m > 0) and (tx >= RightX)) then
+                    if ((hogLR < 0) and (tx < LeftX)) or ((hogLR > 0) and (tx >= RightX)) then
                         if (WorldEdge = weWrap) then
                             // wrap beam
                             begin
-                            if (sign*m) < 0 then
+                            if hogLR < 0 then
                                 lx:= RightX - (ax - (lx - LeftX))
                             else
                                 lx:= LeftX + (ax - (RightX - lx));
@@ -477,7 +556,7 @@
                             // just stop
                             break;
 
-                    if ((tx and LAND_WIDTH_MASK) <> 0) then
+                    if ((tx and LAND_WIDTH_MASK) <> 0) and (((ax > 0) and (tx >= RightX)) or ((ax < 0) and (tx <= LeftX))) then
                         begin
                         if (WorldEdge <> weWrap) and (WorldEdge <> weBounce) then
                             // assume infinite beam. Extend it way out past camera
@@ -487,21 +566,17 @@
                             end;
                         break;
                         end;
+                    inWorldBounds := ((ty and LAND_HEIGHT_MASK) or (tx and LAND_WIDTH_MASK)) = 0;
                     end;
 
-                DrawLineWrapped(hx, hy, tx, ty, 1.0, (sign*m) < 0, wraps, $FF, $00, $00, $C0);
+                DrawLineWrapped(hx, hy, tx, ty, 1.0, hogLR < 0, wraps, $FF, $00, $00, $C0);
                 end;
-            // draw crosshair
-            CrosshairX := Round(hwRound(Gear^.X) + dx * 80 + GetLaunchX(HH^.CurAmmoType, sign * m, Gear^.Angle));
-            CrosshairY := Round(hwRound(Gear^.Y) + dy * 80 + GetLaunchY(HH^.CurAmmoType, Gear^.Angle));
 
-            setTintAdd(true);
-            Tint(HH^.Team^.Clan^.Color shl 8 or $FF);
-            DrawTextureRotated(CrosshairTexture,
-                    12, 12, CrosshairX + WorldDx, CrosshairY + WorldDy, 0,
-                    sign * m * (Gear^.Angle * 180.0) / cMaxAngle);
-            untint;
-            setTintAdd(false);
+            // calculate crosshair position
+            CrosshairX := Round(hwRound(Gear^.X) + dx * 80 + GetLaunchX(HH^.CurAmmoType, hogLR, Gear^.Angle));
+            CrosshairY := Round(hwRound(Gear^.Y) + dy * 80 + GetLaunchY(HH^.CurAmmoType, Gear^.Angle));
+            // crosshair will be rendered in RenderHHGuiExtras
+            CrosshairGear := Gear;
             end;
 
         hx:= ox + 8 * sign;
@@ -525,7 +600,7 @@
                     end;
                 gtBallgun: DrawSpriteRotated(sprHandBallgun, hx, hy, sign, aangle);
                 gtRCPlane: begin
-                    DrawSpriteRotated(sprHandPlane, hx, hy, sign, 0);
+                    DrawSpriteRotated(sprHandPlane, hx + 1, hy, sign, 0);
                     defaultPos:= false
                     end;
                 gtRope: begin
@@ -622,6 +697,17 @@
                     dec(sy,20);
                     end;
                 gtTeleport: defaultPos:= false;
+                gtParachute:
+                    begin
+                    DrawSpriteRotatedF(sprHHIdle,
+                            sx,
+                            sy,
+                            0,
+                            CurAmmoGear^.Tag,
+                            0);
+                    HatVisible:= true;
+                    defaultPos:= false;
+                    end;
                 gtWhip:
                     begin
                     DrawSpriteRotatedF(sprWhip,
@@ -680,13 +766,13 @@
                                 0);
                         // sprCensored contains English text, so only show it for English locales
                         // TODO: Make text translatable. But how?
-                        if Copy(cLocale, 1, 2) = 'en' then
+                        if Copy(cLanguage, 1, 2) = 'en' then
                             DrawSprite(sprCensored, ox - 32, oy - 20, 0);
                         end;
                     defaultPos:= false
                     end;
                 gtFlamethrower: DrawSpriteRotatedF(sprHandFlamethrower, hx, hy, (RealTicks div 125) mod 4, sign, aangle);
-                gtLandGun: DrawSpriteRotated(sprHandBallgun, hx, hy, sign, aangle);
+                gtLandGun: DrawSpriteRotated(sprHandLandGun, hx, hy, sign, aangle);
                 gtIceGun: DrawSpriteRotated(sprIceGun, hx, hy, sign, aangle);
             end;
 
@@ -711,7 +797,7 @@
         if ((Gear^.State and gstHHJumping) <> 0) then
         begin
         DrawHedgehog(sx, sy,
-            sign*m,
+            hogLR,
             1,
             1,
             0);
@@ -797,20 +883,15 @@
                 amAirMine: DrawSpriteRotated(sprHandAirMine, hx, hy, sign, aangle);
                 amSMine: DrawSpriteRotated(sprHandSMine, hx, hy, sign, aangle);
                 amKnife: DrawSpriteRotatedF(sprHandKnife, hx, hy, 0, sign, aangle);
-                amSeduction: begin
+                amSeduction: if ((Gear^.State and gstMoving) = 0) then
+                             begin
                              DrawSpriteRotated(sprHandSeduction, hx, hy, sign, aangle);
-                             DrawCircle(ox, oy, 248, 4, $FF, $00, $00, $AA);
-                             //Tint($FF, $0, $0, $AA);
-                             //DrawTexture(ox - 240, oy - 240, SpritesData[sprVampiric].Texture, 10);
-                             //untint;
+                             DrawCircle(ox, oy, cSeductionDist - 2, 4, $FF, $00, $00, $AA);
                              end;
                 amVampiric: DrawSpriteRotatedF(sprHandVamp, hx, hy, (RealTicks div 125) mod 4, sign, aangle);
-                amRCPlane: begin
-                    DrawSpriteRotated(sprHandPlane, hx, hy, sign, 0);
-                    defaultPos:= false
-                    end;
                 amRubber,
-                amGirder: begin
+                amGirder: if ((Gear^.State and gstMoving) = 0) then
+                    begin
                     DrawSpriteRotated(sprHandConstruction, hx, hy, sign, aangle);
                     if cBuildMaxDist = cDefaultBuildMaxDist then
                         begin
@@ -848,9 +929,11 @@
                     end;
                 amBee: DrawSpriteRotatedF(sprHandBee, hx, hy, (RealTicks div 125) mod 4, sign, aangle);
                 amFlamethrower: DrawSpriteRotatedF(sprHandFlamethrower, hx, hy, (RealTicks div 125) mod 4, sign, aangle);
-                amLandGun: DrawSpriteRotated(sprHandBallgun, hx, hy, sign, aangle);
+                amLandGun: DrawSpriteRotated(sprHandLandGun, hx, hy, sign, aangle);
                 amIceGun: DrawSpriteRotated(sprIceGun, hx, hy, sign, aangle);
-                amResurrector: DrawCircle(ox, oy, 98, 4, $F5, $DB, $35, $AA); // I'd rather not like to hardcode 100 here
+                amResurrector: if ((Gear^.State and gstMoving) = 0) then
+                    DrawCircle(ox, oy, cResurrectorDist - 2, 4, $F5, $DB, $35, $AA);
+                amFirePunch: DrawSpriteRotatedF(sprFirePunch, hx + 6 * sign + 1, hy - 5, (RealTicks div 50) mod 16, sign, 0);
             end;
 
             case amt of
@@ -877,11 +960,16 @@
                             sign,
                             0);
                 amHammer: DrawSpriteRotatedF(sprHammer,
-                            sx,
+                            sx + sign,
                             sy,
                             0,
                             sign,
                             0);
+                amRCPlane:
+                    begin
+                    DrawSpriteRotated(sprHandPlane, hx + 1, hy, sign, 0);
+                    defaultPos:= false
+                    end;
                 amBaseballBat, amMinigun:
                     begin
                     HatVisible:= true;
@@ -892,24 +980,24 @@
                             0);
                     end
             else
-                DrawHedgehog(sx, sy,
-                    sign,
-                    0,
-                    4,
-                    0);
-
-                HatVisible:= true;
-                (* with HH^ do
-                    if (HatTex <> nil)
-                    and (HatVisibility > 0) then
-                        DrawTextureF(HatTex,
-                            HatVisibility,
-                            sx,
-                            sy - 5,
-                            0,
-                            sign,
-                            32,
-                            32); *)
+                // Special hog sprite that makes hog "look" towards the selection icon.
+                // Only works without hat for now since it would look weird/creepy for many hats.
+                if ((HH^.Hat = 'NoHat') or (HH^.HatTex = nil)) and ((Gear^.State and (gstMoving or gstAttacking)) = 0) and ((Ammoz[amt].Ammo.Propz and ammoprop_ShowSelIcon) <> 0) then
+                    DrawHedgehog(sx, sy,
+                        sign,
+                        0,
+                        6,
+                        0)
+                // Default idle hedgehog
+                else
+                    begin
+                    DrawHedgehog(sx, sy,
+                        sign,
+                        0,
+                        4,
+                        0);
+                    HatVisible:= true;
+                    end;
             end;
 
             defaultPos:= false
@@ -953,7 +1041,7 @@
         if ((Gear^.State and gstHHJumping) <> 0) then
             begin
             DrawHedgehog(sx, sy,
-                sign*m,
+                hogLR,
                 1,
                 1,
                 0);
@@ -1057,7 +1145,7 @@
                     sx,
                     sy - 5,
                     0,
-                    sign*m,
+                    hogLR,
                     32,
                     32);
                 if (curhat^.w > 64) or ((curhat^.w = 64) and (curhat^.h = 32)) then
@@ -1072,7 +1160,7 @@
                         sx,
                         sy - 5,
                         tx,
-                        sign*m,
+                        hogLR,
                         32,
                         32);
                     untint
@@ -1082,24 +1170,17 @@
 
     if (Gear^.State and gstHHDriven) <> 0 then
         begin
-    (*    if (CurAmmoGear = nil) then
-            begin
-            amt:= CurrentHedgehog^.CurAmmoType;
-            case amt of
-                amJetpack: DrawSprite(sprJetpack, sx-32, sy-32, 0);
-                end
-            end; *)
         if (CurAmmoGear = nil) then
             begin
-                if ((Gear^.State and (gstAttacked or gstAnimation or gstHHJumping)) = 0)
-                and (Gear^.Message and (gmLeft or gmRight) = 0) then
+            if ((Gear^.State and (gstAttacked or gstAnimation or gstHHJumping)) = 0)
+            and (Gear^.Message and (gmLeft or gmRight) = 0) then
                 begin
                 amt:= CurrentHedgehog^.CurAmmoType;
-                    case amt of
-                        amBaseballBat: DrawSpritePivotedF(sprHandBaseball,
-                            sx + 9 * sign, sy + 2, 0, sign, -8, 1, aangle);
-                        amMinigun: DrawSpritePivotedF(sprMinigun,
-                            sx + 20 * sign, sy + 4, 0, sign, -18, -2, aangle);
+                case amt of
+                    amBaseballBat: DrawSpritePivotedF(sprHandBaseball,
+                        sx + 9 * sign, sy + 2, 0, sign, -8, 1, aangle);
+                    amMinigun: DrawSpritePivotedF(sprMinigun,
+                        sx + 20 * sign, sy + 4, 0, sign, -18, -2, aangle);
                     end;
                 end;
             end
@@ -1159,42 +1240,8 @@
             if (CurAmmoGear <> nil) and (CurAmmoGear^.Kind = gtResurrector) then
                 DrawTextureCentered(ox, sy - cHHRadius - 7 - HealthTagTex^.h, HealthTagTex);
 
-            if bShowFinger and ((Gear^.State and gstHHDriven) <> 0) then
-                begin
-                ty := oy - 32;
-                // move finger higher up if tags are above hog
-                if (cTagsMask and htTeamName) <> 0 then
-                    ty := ty - Team^.NameTagTex^.h - 2;
-                if (cTagsMask and htName) <> 0 then
-                    ty := ty - NameTagTex^.h - 2;
-                if (cTagsMask and htHealth) <> 0 then
-                    ty := ty - HealthTagTex^.h - 2;
-                tx := ox;
-
-                // don't go offscreen
-                //tx := round(max(((-cScreenWidth + 16) / cScaleFactor) + SpritesData[sprFinger].Width div 2, min(((cScreenWidth - 16) / cScaleFactor) - SpritesData[sprFinger].Width div 2, tx)));
-                //ty := round(max(cScreenHeight div 2 - ((cScreenHeight - 16) / cScaleFactor) + SpritesData[sprFinger].Height div 2, min(cScreenHeight div 2 - ((-cScreenHeight + SpritesData[sprFinger].Height) / (cScaleFactor)) - SpritesData[sprFinger].Width div 2 - 96, ty)));
-                t:= 32;//trunc((SpritesData[sprFinger].Width + t) / cScaleFactor);
-                tx := min(max(tx, ViewLeftX + t), ViewRightX  - t);
-                t:= 32;//trunc((SpritesData[sprFinger].Height + t) / cScaleFactor);
-                ty := min(ty, ViewBottomY - 96);
-                // don't overlap with HH or HH tags
-                if ty < ViewTopY + t then
-                    begin
-                    if abs(tx - ox) < abs(ty - oy)  then
-                        ty:= max(ViewTopY + t, oy + t)
-                    else
-                        ty:= max(ViewTopY + t, ty);
-                    end;
-
-                dAngle := DxDy2Angle(int2hwfloat(ty - oy), int2hwfloat(tx - ox)) + 90;
-
-                DrawSpriteRotatedF(sprFinger, tx, ty, RealTicks div 32 mod 16, 1, dAngle);
-                end;
-
-
             if (Gear^.State and gstDrowning) = 0 then
-                if (Gear^.State and gstHHThinking) <> 0 then
+                if ((Gear^.State and gstHHThinking) <> 0) and (not CinematicScript) then
                     DrawSprite(sprQuestion, ox - 10, oy - cHHRadius - 34, (RealTicks shr 9) mod 8)
             end
         end;
@@ -1251,20 +1298,29 @@
     vg: PVisualGear;
     i: Longword;
     aAngle: real;
-    startX, endX, startY, endY: LongInt;
+    startX, endX, startY, endY, ty: LongInt;
 begin
-	// airmine has its own sprite
+    // airmine has its own sprite
     if (Gear^.State and gstFrozen <> 0) and (Gear^.Kind <> gtAirMine) then Tint($A0, $A0, $FF, $FF);
-    //if Gear^.State and gstFrozen <> 0 then Tint(IceColor or $FF);
     if Gear^.Target.X <> NoPointX then
         if Gear^.AmmoType = amBee then
             DrawSpriteRotatedF(sprTargetBee, Gear^.Target.X + WorldDx, Gear^.Target.Y + WorldDy, 0, 0, (RealTicks shr 3) mod 360)
     else if Gear^.AmmoType = amIceGun then
-        //DrawSprite(sprSnowDust, Gear^.Target.X + WorldDx, Gear^.Target.Y + WorldDy, (RealTicks shr 2) mod 8)
-        //DrawTextureRotatedF(SpritesData[sprSnowDust].Texture, 1, 0, 0, Gear^.Target.X + WorldDx, Gear^.Target.Y + WorldDy, (RealTicks shr 2) mod 8, 1, 22, 22, (RealTicks shr 3) mod 360)
         DrawTextureRotatedF(SpritesData[sprSnowDust].Texture, 1/(1+(RealTicks shr 8) mod 5), 0, 0, Gear^.Target.X + WorldDx, Gear^.Target.Y + WorldDy, (RealTicks shr 2) mod 8, 1, 22, 22, (RealTicks shr 3) mod 360)
     else
+        begin
+        if CurrentHedgehog <> nil then
+            begin
+            if (IsTooDarkToRead(CurrentHedgehog^.Team^.Clan^.Color)) then
+                DrawSpriteRotatedF(sprTargetPBackInv, Gear^.Target.X + WorldDx, Gear^.Target.Y + WorldDy, 0, 0, (RealTicks shr 3) mod 360)
+            else
+                DrawSpriteRotatedF(sprTargetPBack, Gear^.Target.X + WorldDx, Gear^.Target.Y + WorldDy, 0, 0, (RealTicks shr 3) mod 360);
+            Tint(CurrentHedgehog^.Team^.Clan^.Color shl 8 or $FF);
+            end;
         DrawSpriteRotatedF(sprTargetP, Gear^.Target.X + WorldDx, Gear^.Target.Y + WorldDy, 0, 0, (RealTicks shr 3) mod 360);
+        if CurrentHedgehog <> nil then
+            untint;
+        end;
 
     case Gear^.Kind of
           gtGrenade: DrawSpriteRotated(sprBomb, x, y, 0, Gear^.DirAngle);
@@ -1305,11 +1361,16 @@
                      end;
                  end;
 
-           gtDrill: if (Gear^.State and gsttmpFlag) <> 0 then
-                        DrawSpriteRotated(sprAirDrill, x, y, 0, DxDy2Angle(Gear^.dY, Gear^.dX))
+           gtDrill: begin
+                    if (Gear^.Pos = 1) then
+                        i:= (RealTicks shr 5 + Gear^.uid) mod 4
                     else
-                        DrawSpriteRotated(sprDrill, x, y, 0, DxDy2Angle(Gear^.dY, Gear^.dX));
-
+                        i:= Gear^.uid mod 4;
+                    if (Gear^.State and gsttmpFlag) <> 0 then
+                        DrawTextureRotatedF(SpritesData[sprAirDrill].texture, 0.5, 0, 0, x, y, i, 0, 64, 64, DxDy2Angle(Gear^.dY, Gear^.dX))
+                    else
+                        DrawTextureRotatedF(SpritesData[sprDrill].texture, 0.5, 0, 0, x, y, i, 0, 64, 64, DxDy2Angle(Gear^.dY, Gear^.dX));
+                    end;
         gtHedgehog: DrawHH(Gear, x, y);
 
            gtShell: DrawSpriteRotated(sprBazookaShell, x, y, 0, DxDy2Angle(Gear^.dY, Gear^.dX));
@@ -1318,9 +1379,7 @@
                     DrawTextureF(Gear^.Hedgehog^.Team^.GraveTex, 1, x, y, (RealTicks shr 7+Gear^.uid) and 15, 1, 32, 32);
                     if Gear^.Health > 0 then
                         begin
-                        //Tint($33, $33, $FF, max($40, round($FF * abs(1 - (GameTicks mod (6000 div Gear^.Health)) / 750))));
                         Tint($f5, $db, $35, max($40, round($FF * abs(1 - (RealTicks mod 1500) / (750 + Gear^.Health)))));
-                        //Tint($FF, $FF, $FF, max($40, round($FF * abs(1 - (RealTicks mod 1500) / 750))));
                         DrawSprite(sprVampiric, x - 24, y - 24, 0);
                         untint
                         end
@@ -1337,22 +1396,35 @@
                     else DrawSpriteRotated(sprMineDead, x, y, 0, Gear^.DirAngle);
                     end;
          gtAirMine: 
-					if (Gear^.State and gstFrozen <> 0) then
+                    // render air mine based on its state:
+                    // frozen
+                    if (Gear^.State and gstFrozen <> 0) then
+                        // frozen air mine sprite
                         DrawSprite(sprFrozenAirMine, x-16, y-16, 0)
-					else if (Gear^.Tag <> 0) then
+                    // stunned (after being shot)
+                    else if (Gear^.Tag <> 0) then
+                        // sparks animation
                         DrawSprite(sprAirMine, x-16, y-16, 16 + ((RealTicks div 50 + Gear^.Uid) mod 16))
-					else if (Gear^.State and gstTmpFlag = 0) then                // mine is inactive
+                    // inactive / initialization phase (shortly after launched by hog)
+                    else if (Gear^.State and gstTmpFlag = 0) then
                         begin
-						if (Gear^.State and gstTmpFlag = 0) then Tint(150,150,150,255);
+                        // dark air mine, signal lamp off
+                        Tint(150,150,150,255);
                         DrawSprite(sprAirMine, x-16, y-16, 15);
                         untint
                         end
-                    else if (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.Gear <> nil) then  // mine is chasing a hog
+                    // actively chasing a hog
+                    else if (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.Gear <> nil) then
+                         // signal lamp rapidly flashes
                          DrawSprite(sprAirMine, x-16, y-16, (RealTicks div 25 + Gear^.Uid) mod 16)
-                    else if Gear^.State and gstChooseTarget <> 0 then   // mine is seeking for hogs
-                         DrawSprite(sprAirMine, x-16, y-16, (RealTicks div 125 + Gear^.Uid) mod 16)
+                    // seeking for hogs
+                    else if Gear^.State and gstChooseTarget <> 0 then
+                         // signal lamp on
+                         DrawSprite(sprAirMine, x-16, y-16, 3)
+                    // active, but not seeking for hogs
                     else
-                         DrawSprite(sprAirMine, x-16, y-16, 4);           // mine is active but not seeking
+                         // signal lamp off
+                         DrawSprite(sprAirMine, x-16, y-16, 15);
 
            gtSMine: if (((Gear^.State and gstAttacking) = 0)or((Gear^.Timer and $3FF) < 420)) and (Gear^.Health <> 0) then
                            DrawSpriteRotated(sprSMineOff, x, y, 0, Gear^.DirAngle)
@@ -1456,6 +1528,10 @@
                     DrawSpriteRotatedF(sprAirplane, x, y, 0, Gear^.Tag, 0);
                     untint;
                     DrawSpriteRotatedF(sprAirplane, x, y, 1, Gear^.Tag, 0);
+                    if WorldEdge <> weSea then
+                        DrawSpriteRotatedF(sprAirplane, x, y, 2, Gear^.Tag, 0)
+                    else
+                        DrawSpriteRotatedF(sprAirplane, x, y, 3, Gear^.Tag, 0);
                     end;
          gtAirBomb: DrawSpriteRotated(sprAirBomb, x, y, 0, DxDy2Angle(Gear^.dY, Gear^.dX));
         gtTeleport: begin
@@ -1467,7 +1543,35 @@
                         DrawSpriteRotatedF(sprTeleport, hwRound(HHGear^.X) + 1 + WorldDx, hwRound(HHGear^.Y) - 3 + WorldDy, 11 - Gear^.Pos, hwSign(HHGear^.dX), 0)
                         end
                     end;
-        gtSwitcher: DrawSprite(sprSwitch, x - 16, y - 56, (RealTicks shr 6) mod 12);
+        gtSwitcher: begin
+                    setTintAdd(true);
+                    if IsTooDarkToRead(Gear^.Hedgehog^.Team^.Clan^.Color) then
+                        Tint($FFFFFFFF)
+                    else
+                        Tint($000000FF);
+
+                    ty := y - SpritesData[sprSwitch].Height;
+                    // Move higher up if hedgehog tags are visible.
+                    // This happens when finger is active. The finger is then moved above the switching arrows.
+                    if bShowFinger then
+                        begin
+                        if (cTagsMask and htTeamName) <> 0 then
+                            ty := ty - Gear^.Hedgehog^.Team^.NameTagTex^.h - 2;
+                        if (cTagsMask and htName) <> 0 then
+                            ty := ty - Gear^.Hedgehog^.NameTagTex^.h - 2;
+                        if (cTagsMask and htHealth) <> 0 then
+                            ty := ty - Gear^.Hedgehog^.HealthTagTex^.h - 2;
+                        if (cTagsMask and (htTeamName or htName or htHealth)) <> 0 then
+                            ty := ty - 4;
+                        end;
+
+                    DrawSpriteRotatedF(sprSwitch, x + 1, ty, 1, 0, (RealTicks div 5) mod 360);
+
+                    Tint(Gear^.Hedgehog^.Team^.Clan^.Color shl 8 or $FF);
+                    DrawSpriteRotatedF(sprSwitch, x + 1, ty, 0, 0, (RealTicks div 5) mod 360);
+                    untint;
+                    setTintAdd(false);
+                    end;
           gtTarget: begin
                     Tint($FF, $FF, $FF, round($FF * Gear^.Timer / 1000));
                     DrawSprite(sprTarget, x - 16, y - 16, 0);
@@ -1551,8 +1655,6 @@
                         Tint(Gear^.Tint);
                         // Needs a nicer white texture to tint
                         DrawTextureRotatedF(SpritesData[sprSnowDust].Texture, 1, 0, 0, x, y, 0, 1, 8, 8, Gear^.DirAngle);
-                        //DrawSpriteRotated(sprSnowDust, x, y, 0, Gear^.DirAngle);
-                        //DrawTexture(x, y, SpritesData[sprVampiric].Texture, 0.1);
                         untint;
                         end
                     else //if not isInLag then
@@ -1567,8 +1669,6 @@
                             DrawSprite(sprFlake, x, y, Gear^.Timer)
                         else
                             DrawSpriteRotatedF(sprFlake, x, y, Gear^.Timer, 1, Gear^.DirAngle);
-//DrawSprite(sprFlake, x-SpritesData[sprFlake].Width div 2, y-SpritesData[sprFlake].Height div 2, Gear^.Timer)
-//DrawSpriteRotatedF(sprFlake, x-SpritesData[sprFlake].Width div 2, y-SpritesData[sprFlake].Height div 2, Gear^.Timer, 1, Gear^.DirAngle);
                         if Gear^.FlightTime > 0 then
                             untint;
                         end;
@@ -1586,11 +1686,6 @@
                         DrawSprite(sprTardis, x-25, y-64,1);
                         if Gear^.Pos <> 2 then
                             untint
-(*
-                        Tint(Gear^.Hedgehog^.Team^.Clan^.Color shl 8 or max($00, round(Gear^.Power * abs(1 - (RealTicks mod 500) / 250))));
-                        DrawTexture(x-6, y-70, SpritesData[sprVampiric].Texture, 0.25);
-                        untint
-*)
                         end;
             gtIceGun: begin
                       HHGear := Gear^.Hedgehog^.Gear;
@@ -1624,8 +1719,8 @@
                           end
                       end;
             gtCreeper: if (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.Gear <> nil) then
-					     DrawSpriteRotatedF(sprCreeper, x, y, 1, hwRound(SignAs(_1,Gear^.Hedgehog^.Gear^.X-Gear^.X)), 0)
-					else DrawSpriteRotatedF(sprCreeper, x, y, 1, hwRound(SignAs(_1,Gear^.dX)), 0);
+                         DrawSpriteRotatedF(sprCreeper, x, y, 1, hwRound(SignAs(_1,Gear^.Hedgehog^.Gear^.X-Gear^.X)), 0)
+                    else DrawSpriteRotatedF(sprCreeper, x, y, 1, hwRound(SignAs(_1,Gear^.dX)), 0);
 
             gtGenericFaller: begin
                              // DEBUG: draw gtGenericFaller
@@ -1640,8 +1735,19 @@
 
 procedure RenderGearTimer(Gear: PGear; x, y: LongInt);
 begin
-if Gear^.RenderTimer and (Gear^.Tex <> nil) then
+if Gear^.RenderTimer and (Gear^.Tex <> nil) and (isShowGearInfo or (not (Gear^.Kind in [gtMine, gtSMine, gtAirMine]))) then
     DrawTextureCentered(x + 8, y + 8, Gear^.Tex);
 end;
 
+procedure RenderGearHealth(Gear: PGear; x, y: LongInt);
+begin
+if isShowGearInfo and (Gear^.RenderHealth) and (Gear^.Tex <> nil) then
+    begin
+    if (Gear^.Kind = gtCase) and ((Gear^.Pos and posCaseHealth) <> 0) then
+        DrawTextureCentered(x, y - 38, Gear^.Tex);
+    if (Gear^.Kind = gtExplosives) then
+        DrawTextureCentered(x, y - 38, Gear^.Tex);
+    end;
+end;
+
 end.
--- a/hedgewars/uGearsUtils.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uGearsUtils.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -52,7 +52,8 @@
 procedure AmmoShoveCache(Ammo: PGear; Damage, Power: LongInt);
 procedure AmmoShoveLine(Ammo: PGear; Damage, Power: LongInt; oX, oY, tX, tY: hwFloat);
 function  GearsNear(X, Y: hwFloat; Kind: TGearType; r: LongInt): PGearArrayS;
-procedure SpawnBoxOfSmth;
+function  SpawnBoxOfSmth: PGear;
+procedure PlayBoxSpawnTaunt(Gear: PGear);
 procedure ShotgunShot(Gear: PGear);
 function  CanUseTardis(HHGear: PGear): boolean;
 
@@ -64,7 +65,9 @@
 function  GetUtility(Hedgehog: PHedgehog): TAmmoType;
 
 function WorldWrap(var Gear: PGear): boolean;
+function HomingWrap(var Gear: PGear): boolean;
 
+function IsHogFacingLeft(Gear: PGear): boolean;
 function IsHogLocal(HH: PHedgehog): boolean;
 
 
@@ -117,11 +120,6 @@
     end;
 if (Mask and EXPLAutoSound) <> 0 then PlaySound(sndExplosion);
 
-(*if (Mask and EXPLAllDamageInRadius) = 0 then
-    dmgRadius:= Radius shl 1
-else
-    dmgRadius:= Radius;
-dmgBase:= dmgRadius + cHHRadius div 2;*)
 dmgBase:= Radius shl 1 + cHHRadius div 2;
 
 // we might have to run twice if weWrap is enabled
@@ -135,8 +133,6 @@
 while Gear <> nil do
     begin
     dmg:= 0;
-    //dmg:= dmgRadius  + cHHRadius div 2 - hwRound(Distance(Gear^.X - int2hwFloat(X), Gear^.Y - int2hwFloat(Y)));
-    //if (dmg > 1) and
     if (Gear^.State and gstNoDamage) = 0 then
         begin
         case Gear^.Kind of
@@ -146,7 +142,6 @@
                 gtMelonPiece,
                 gtGrenade,
                 gtClusterBomb,
-            //    gtCluster, too game breaking I think
                 gtSMine,
                 gtAirMine,
                 gtCase,
@@ -179,7 +174,11 @@
                                 Gear^.State:= (Gear^.State or gstMoving) and (not gstLoser);
                                 if Gear^.Kind = gtKnife then Gear^.State:= Gear^.State and (not gstCollision);
                                 if (Gear^.Kind = gtHedgehog) and (Gear^.Hedgehog^.Effects[heInvulnerable] = 0) then
-                                    Gear^.State:= (Gear^.State or gstMoving) and (not (gstWinner or gstHHJumping or gstHHHJump));
+                                    begin
+                                    Gear^.State:= (Gear^.State or gstMoving) and (not (gstHHJumping or gstHHHJump));
+                                    if (not GameOver) then
+                                        Gear^.State:= (Gear^.State and (not gstWinner));
+                                    end;
                                 Gear^.Active:= true;
                                 if Gear^.Kind <> gtFlame then FollowGear:= Gear;
                                 if Gear^.Kind = gtAirMine then
@@ -284,8 +283,13 @@
         Gear^.LastDamage := AttackerHog;
 
         Gear^.Hedgehog^.Team^.Clan^.Flawless:= false;
-        HHHurt(Gear^.Hedgehog, Source, Damage);
-        AddDamageTag(hwRound(Gear^.X), hwRound(Gear^.Y), Damage, Gear^.Hedgehog^.Team^.Clan^.Color);
+
+        if (Gear^.State and gstHHDeath) = 0 then
+            begin
+            HHHurt(Gear^.Hedgehog, Source, Damage);
+            AddDamageTag(hwRound(Gear^.X), hwRound(Gear^.Y), Damage, Gear^.Hedgehog^.Team^.Clan^.Color);
+            end;
+
         tmpDmg:= min(Damage, max(0,Gear^.Health-Gear^.Damage));
         if (Gear <> CurrentHedgehog^.Gear) and (CurrentHedgehog^.Gear <> nil) and (tmpDmg >= 1) then
             begin
@@ -313,26 +317,23 @@
 
         uStats.HedgehogDamaged(Gear, AttackerHog, Damage, false);
 
-	if AprilOne and (Gear^.Hedgehog^.Hat = 'fr_tomato') and (Damage > 2) then
-	    for i := 0 to random(min(Damage,20))+5 do
-		begin
-		vg:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtStraightShot);
-		if vg <> nil then
-		    with vg^ do
-			begin
-			dx:= 0.001 * (random(100)+10);
-			dy:= 0.001 * (random(100)+10);
-			tdy:= -cGravityf;
-			if random(2) = 0 then
-			    dx := -dx;
-			//if random(2) = 0 then
-			//    dy := -dy;
-			FrameTicks:= random(500) + 1000;
-			State:= ord(sprBubbles);
-			//Tint:= $bd2f03ff
-			Tint:= $ff0000ff
-			end
-	end
+    if AprilOne and (Gear^.Hedgehog^.Hat = 'fr_tomato') and (Damage > 2) then
+        for i := 0 to random(min(Damage,20))+5 do
+        begin
+        vg:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtStraightShot);
+        if vg <> nil then
+            with vg^ do
+            begin
+            dx:= 0.001 * (random(100)+10);
+            dy:= 0.001 * (random(100)+10);
+            tdy:= -cGravityf;
+            if random(2) = 0 then
+                dx := -dx;
+            FrameTicks:= random(500) + 1000;
+            State:= ord(sprBubbles);
+            Tint:= $ff0000ff
+            end
+    end
     end else
         Gear^.Hedgehog:= AttackerHog;
     inc(Gear^.Damage, Damage);
@@ -468,11 +469,6 @@
     if ((Gear^.Hedgehog^.Effects[heInvulnerable] <> 0)) then
         exit;
 
-    //if _0_6 < Gear^.dY then
-    //    PlaySound(sndOw4, Gear^.Hedgehog^.Team^.voicepack)
-    //else
-    //    PlaySound(sndOw1, Gear^.Hedgehog^.Team^.voicepack);
-
     if Gear^.LastDamage <> nil then
         ApplyDamage(Gear, Gear^.LastDamage, dmg, dsFall)
     else
@@ -486,7 +482,6 @@
     dAngle: real;
 begin
     // Frac/Round to be kind to JS as of 2012-08-27 where there is yet no int64/uint64
-    //dAngle := (Gear^.dX.QWordValue + Gear^.dY.QWordValue) / $80000000;
     dAngle := (Gear^.dX.Round + Gear^.dY.Round) / 2 + (Gear^.dX.Frac/$100000000+Gear^.dY.Frac/$100000000);
     if not Gear^.dX.isNegative then
         Gear^.DirAngle := Gear^.DirAngle + dAngle
@@ -588,6 +583,13 @@
     else Scale:= Scale + ((1-Scale) / 2);
     if Scale > 1 then Timer:= round(min(Scale*0.0005/cGravityf,4))
     else Timer:= 1;
+    if Scale > 1 then
+        if (not isImpactH) then
+            Y:= Y + 10
+        else if isImpactRight then
+            X:= X + 10
+        else
+            X:= X - 10;
     // Low Gravity
     FrameTicks:= FrameTicks*Timer;
     end;
@@ -756,7 +758,7 @@
                 end
             else // submersible
                 begin
-                // drown submersible grears if far below map
+                // drown submersible gears if far below map
                 if (Y > cWaterLine + cVisibleWater*4) then
                     begin
                     DrownGear(Gear);
@@ -795,7 +797,8 @@
 
         // splash sound animation and droplets
         if isImpact or isSkip then
-            addSplashForGear(Gear, isSkip);
+            if (not (((dist2Water + Gear^.Radius div 2) < 0) or (abs(dist2Water + Gear^.Radius) >= Gear^.Radius))) then
+                addSplashForGear(Gear, isSkip);
 
         if isSkip then
             ScriptCall('onGearWaterSkip', Gear^.uid);
@@ -1068,39 +1071,75 @@
 var t: PGear;
     width, bound, dX, dY: hwFloat;
     isHit: Boolean;
+    i, j: LongWord;
 begin
-    t:= GearsList;
     bound:= _1_5 * int2hwFloat(max(rX, rY));
     rX:= sqr(rX);
     rY:= sqr(rY);
     width:= int2hwFloat(RightX - LeftX);
-
-    while t <> nil do
-    begin
-        if (t <> exclude) and (t^.Kind = Kind) then
+    if (Kind = gtHedgehog) then
         begin
-            dX := X - t^.X;
-            dY := Y - t^.Y;
-            isHit := (hwAbs(dX) + hwAbs(dY) < bound)
-                and (not ((hwSqr(dX) / rX + hwSqr(dY) / rY) > _1));
+        for j:= 0 to Pred(TeamsCount) do
+            if TeamsArray[j]^.TeamHealth > 0 then // it's impossible for a team to have hogs in game and zero health right?
+                with TeamsArray[j]^ do
+                    for i:= 0 to cMaxHHIndex do
+                        with Hedgehogs[i] do
+                            if (Gear <> nil) and (Gear <> exclude) then
+                                begin
+                                // code duplication - could throw into an inline function I guess
+                                dX := X - Gear^.X;
+                                dY := Y - Gear^.Y;
+                                isHit := (hwAbs(dX) + hwAbs(dY) < bound)
+                                    and (not ((hwSqr(dX) / rX + hwSqr(dY) / rY) > _1));
 
-            if (not isHit) and (WorldEdge = weWrap) then
+                                if (not isHit) and (WorldEdge = weWrap) then
+                                    begin
+                                    if (hwAbs(dX - width) + hwAbs(dY) < bound)
+                                        and (not ((hwSqr(dX - width) / rX + hwSqr(dY) / rY) > _1)) then
+                                        isHit := true
+                                    else if (hwAbs(dX + width) + hwAbs(dY) < bound)
+                                        and (not ((hwSqr(dX + width) / rX + hwSqr(dY) / rY) > _1)) then
+                                        isHit := true
+                                    end;
+
+                                if isHit then
+                                    begin
+                                    CheckGearNearImpl:= Gear;
+                                    exit;
+                                    end
+                                end;
+        end
+    else
+        begin
+        t:= GearsList;
+
+        while t <> nil do
             begin
-                if (hwAbs(dX - width) + hwAbs(dY) < bound)
-                    and (not ((hwSqr(dX - width) / rX + hwSqr(dY) / rY) > _1)) then
-                    isHit := true
-                else if (hwAbs(dX + width) + hwAbs(dY) < bound)
-                    and (not ((hwSqr(dX + width) / rX + hwSqr(dY) / rY) > _1)) then
-                    isHit := true
-            end;
+            if (t <> exclude) and (t^.Kind = Kind) then
+                begin
+                dX := X - t^.X;
+                dY := Y - t^.Y;
+                isHit := (hwAbs(dX) + hwAbs(dY) < bound)
+                    and (not ((hwSqr(dX) / rX + hwSqr(dY) / rY) > _1));
 
-            if isHit then
-            begin
-                CheckGearNearImpl:= t;
-                exit;
-            end;
-        end;
-        t:= t^.NextGear
+                if (not isHit) and (WorldEdge = weWrap) then
+                    begin
+                    if (hwAbs(dX - width) + hwAbs(dY) < bound)
+                        and (not ((hwSqr(dX - width) / rX + hwSqr(dY) / rY) > _1)) then
+                        isHit := true
+                    else if (hwAbs(dX + width) + hwAbs(dY) < bound)
+                        and (not ((hwSqr(dX + width) / rX + hwSqr(dY) / rY) > _1)) then
+                        isHit := true
+                    end;
+
+                if isHit then
+                    begin
+                    CheckGearNearImpl:= t;
+                    exit;
+                    end;
+                end;
+            t:= t^.NextGear
+            end
     end;
 
     CheckGearNearImpl:= nil
@@ -1562,15 +1601,12 @@
     GearsNear.ar:= @GearsNearArray
 end;
 
-procedure SpawnBoxOfSmth;
-const
-    // Max. distance between hog and crate for sndThisOneIsMine taunt
-    ThisOneIsMineDistance : LongInt = 130;
-var t, aTot, uTot, a, h, d, minD: LongInt;
+function SpawnBoxOfSmth: PGear;
+var t, aTot, uTot, a, h: LongInt;
     i: TAmmoType;
-    gi, closestHog: PGear;
 begin
-if (PlacingHogs) or
+SpawnBoxOfSmth:= nil;
+if (PlacingHogs) or (PlacingKings) or
     (cCaseFactor = 0)
     or (CountGears(gtCase) >= cMaxCaseDrops)
     or (GetRandom(cCaseFactor) <> 0) then
@@ -1606,6 +1642,7 @@
 if t<h then
     begin
     FollowGear:= AddGear(0, 0, gtCase, 0, _0, _0, 0);
+    FollowGear^.RenderHealth:= true;
     FollowGear^.Health:= cHealthCaseAmount;
     FollowGear^.Pos:= posCaseHealth;
     // health crate is smaller than the other crates
@@ -1643,9 +1680,20 @@
 if (FollowGear <> nil) then
     begin
     FindPlace(FollowGear, true, 0, LAND_WIDTH);
+    PlayBoxSpawnTaunt(FollowGear);
+    SpawnBoxOfSmth:= FollowGear;
+    end
+end;
 
+procedure PlayBoxSpawnTaunt(Gear: PGear);
+const
+    // Max. distance between hog and crate for sndThisOneIsMine taunt
+    ThisOneIsMineDistance : LongInt = 130;
+var d, minD: LongInt;
+    gi, closestHog: PGear;
+begin
     // Taunt
-    if (FollowGear <> nil) then
+    if (Gear <> nil) then
         begin
         // Look for hog closest to the crate (on the X axis)
         gi := GearsList;
@@ -1656,7 +1704,7 @@
             if (gi^.Kind = gtHedgehog) then
                 begin
                 // Y axis is ignored to simplify calculations
-                d := hwRound(hwAbs(gi^.X - FollowGear^.X));
+                d := hwRound(hwAbs(gi^.X - Gear^.X));
                 if d < minD then
                     begin
                     minD := d;
@@ -1677,7 +1725,6 @@
         // Default crate drop taunt
             AddVoice(sndReinforce, CurrentTeam^.voicepack);
         end;
-    end
 end;
 
 
@@ -1744,7 +1791,7 @@
 Trying to make the checks a little broader than on first pass to catch things that don't move normally.
 *)
 function WorldWrap(var Gear: PGear): boolean;
-//var tdx: hwFloat;
+var bounced: boolean;
 begin
 WorldWrap:= false;
 if WorldEdge = weNone then exit(false);
@@ -1757,58 +1804,90 @@
              Gear^.X:= Gear^.X + int2hwfloat(rightX - leftX)
         else Gear^.X:= Gear^.X - int2hwfloat(rightX - leftX);
         LeftImpactTimer:= 150;
-        RightImpactTimer:= 150
+        RightImpactTimer:= 150;
+        WorldWrap:= true;
         end
     else if WorldEdge = weBounce then
         begin
-        if (hwRound(Gear^.X) - Gear^.Radius < leftX) then
+        bounced:= false;
+        // Bounce left
+        if (hwRound(Gear^.X) - Gear^.Radius < leftX) and (((hwSign(Gear^.dX) = -1) and (not isZero(Gear^.dX))) or (Gear^.Kind = gtHedgehog)) then
             begin
             LeftImpactTimer:= 333;
+            // Set X coordinate to bounce edge, unless the gear spawned inside the bounce edge before
+            if (Gear^.State and gstInBounceEdge) = 0 then
+                Gear^.X:= int2hwfloat(leftX + Gear^.Radius);
+            // Invert horizontal speed
             Gear^.dX.isNegative:= false;
-            Gear^.X:= int2hwfloat(leftX + Gear^.Radius)
+            bounced:= true;
             end
-        else
+        // Bounce right
+        else if (hwRound(Gear^.X) + Gear^.Radius > rightX) and (((hwSign(Gear^.dX) = 1) and (not isZero(Gear^.dX))) or (Gear^.Kind = gtHedgehog)) then
             begin
             RightImpactTimer:= 333;
+            // Set X coordinate to bounce edge, unless the gear spawned inside the bounce edge before
+            if (Gear^.State and gstInBounceEdge) = 0 then
+                Gear^.X:= int2hwfloat(rightX - Gear^.Radius);
+            // Invert horizontal speed
             Gear^.dX.isNegative:= true;
-            Gear^.X:= int2hwfloat(rightX-Gear^.Radius)
+            bounced:= true;
             end;
-        if (Gear^.Radius > 2) and (Gear^.dX.QWordValue > _0_001.QWordValue) then
-            AddBounceEffectForGear(Gear);
-        end{
-    else if WorldEdge = weSea then
-        begin
-        if (hwRound(Gear^.Y) > cWaterLine) and (Gear^.State and gstSubmersible <> 0) then
-            Gear^.State:= Gear^.State and (not gstSubmersible)
-        else
+        // Clear gstInBounceEdge when gear is no longer inside a bounce edge area
+        if ((Gear^.State and gstInBounceEdge) <> 0) and (hwRound(Gear^.X) - Gear^.Radius >= leftX) and (hwRound(Gear^.X) + Gear^.Radius <= rightX) then
+            Gear^.State:= Gear^.State and (not gstInBounceEdge);
+        if (bounced) then
             begin
-            Gear^.State:= Gear^.State or gstSubmersible;
-            Gear^.X:= int2hwFloat(PlayWidth)*int2hwFloat(min(max(0,hwRound(Gear^.Y)),PlayHeight))/PlayHeight;
-            Gear^.Y:= int2hwFloat(cWaterLine+cVisibleWater+Gear^.Radius*2);
-            tdx:= Gear^.dX;
-            Gear^.dX:= -Gear^.dY;
-            Gear^.dY:= tdx;
-            Gear^.dY.isNegative:= true
-            end
-        end};
-(*
-* Window in the sky (Gear moved high into the sky, Y is used to determine X) [unfortunately, not a safe thing to do. shame, I thought aerial bombardment would be kinda neat
-This one would be really easy to freeze game unless it was flagged unfortunately.
-
+            WorldWrap:= true;
+            if (Gear^.dX.QWordValue > _0_001.QWordValue) then
+               AddBounceEffectForGear(Gear);
+            end;
+        end
     else
-        begin
-        Gear^.X:= int2hwFloat(PlayWidth)*int2hwFloat(min(max(0,hwRound(Gear^.Y)),PlayHeight))/PlayHeight;
-        Gear^.Y:= -_2048-_256-_256;
-        tdx:= Gear^.dX;
-        Gear^.dX:= Gear^.dY;
-        Gear^.dY:= tdx;
-        Gear^.dY.isNegative:= false
-        end
-*)
-    WorldWrap:= true
+        WorldWrap:= true;
     end;
 end;
 
+(*
+Applies wrap-around logic for the target of homing gears.
+
+In wrap-around world edge, the shortest way may to the target might
+be across the border, so the X value of the target would lead the
+gear to the wrong direction across the whole map. This procedure
+changes the target X in this case.
+This function must be called after the gear passed through
+the wrap-around world edge (WorldWrap returned true).
+
+No-op for other world edges.
+
+Returns true if target has been changed.
+*)
+function HomingWrap(var Gear: PGear): boolean;
+var dist_center, dist_right, dist_left: hwFloat;
+begin
+    if WorldEdge = weWrap then
+        begin
+        HomingWrap:= false;
+        // We just check the same target 3 times:
+        // 1) in current section (no change)
+        // 2) clone in the right section
+        // 3) clone in the left section
+        // The gear will go for the target with the shortest distance to the gear.
+        // For simplicity, we only check distance on the X axis.
+        dist_center:= hwAbs(Gear^.X - int2hwFloat(Gear^.Target.X));
+        dist_right:= hwAbs(Gear^.X - int2hwFloat(Gear^.Target.X + (RightX-LeftX)));
+        dist_left:= hwAbs(Gear^.X - int2hwFloat(Gear^.Target.X - (RightX-LeftX)));
+        if (dist_left < dist_right) and (dist_left < dist_center) then
+            begin
+            dec(Gear^.Target.X, RightX-LeftX);
+            HomingWrap:= true;
+            end
+        else if (dist_right < dist_left) and (dist_right < dist_center) then
+            begin
+            inc(Gear^.Target.X, RightX-LeftX);
+            HomingWrap:= true;
+            end;
+        end;
+end;
 
 // Add an audiovisual bounce effect for gear after it bounced from bouncy material.
 // Graphical effect is based on speed.
@@ -1821,7 +1900,7 @@
 procedure AddBounceEffectForGear(Gear: PGear; imageScale: Single);
 var boing: PVisualGear;
 begin
-    if Gear^.Density < _0_01 then
+    if (Gear^.Density < _0_01) or (Gear^.Radius < 2) then
         exit;
     boing:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtStraightShot, 0, false, 1);
     if boing <> nil then
@@ -1837,9 +1916,21 @@
     PlaySound(sndMelonImpact, true)
 end;
 
+function IsHogFacingLeft(Gear: PGear): boolean;
+var sign: LongInt;
+begin
+    sign:= hwSign(Gear^.dX);
+    if (CurAmmoGear <> nil) and (CurAmmoGear^.Kind = gtParachute) then
+        IsHogFacingLeft:= CurAmmoGear^.Tag = -1
+    else if ((Gear^.State and gstHHHJump) <> 0) and (Gear^.Hedgehog^.Effects[heArtillery] = 0) then
+        IsHogFacingLeft:= sign > 0
+    else
+        IsHogFacingLeft:= sign < 0;
+end;
+
 function IsHogLocal(HH: PHedgehog): boolean;
 begin
-    IsHogLocal:= (not (HH^.Team^.ExtDriven or (HH^.BotLevel > 0))) or (HH^.Team^.Clan^.ClanIndex = LocalClan) or (GameType = gmtDemo);
+    IsHogLocal:= (not (HH^.Team^.ExtDriven or (HH^.BotLevel > 0))) or (HH^.Team^.Clan^.LocalOrAlly) or (GameType = gmtDemo);
 end;
 
 end.
--- a/hedgewars/uIO.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uIO.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -39,7 +39,7 @@
 procedure doPut(putX, putY: LongInt; fromAI: boolean);
 
 implementation
-uses uConsole, uConsts, uVariables, uCommands, uUtils, uDebug, uLocale;
+uses uConsole, uConsts, uVariables, uCommands, uUtils, uDebug, uLocale, uSound;
 
 const
     cSendEmptyPacketTime = 1000;
@@ -171,6 +171,10 @@
               if s[2] = '.' then
                   ParseCommand('campvar ' + copy(s, 3, length(s) - 2), true);
           end;
+     'v': begin
+              if s[2] = '.' then
+                  ParseCommand('missvar ' + copy(s, 3, length(s) - 2), true);
+          end;
      'I': ParseCommand('pause server', true);
      's': if gameType = gmtNet then
              ParseChatCommand('chatmsg ', s, 2)
@@ -508,6 +512,7 @@
 with CurrentHedgehog^.Gear^,
     CurrentHedgehog^ do
     if (State and gstChooseTarget) <> 0 then
+        if ((((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_AttackInMove) <> 0) or ((State and gstMoving) = 0)) or ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_AttackingPut) = 0)) then
         begin
         if (Ammoz[CurAmmoType].Ammo.Propz and ammoprop_NoTargetAfter) <> 0 then
             isCursorVisible:= false;
@@ -523,13 +528,14 @@
                 TargetPoint.X:= CursorPoint.X - WorldDx;
                 TargetPoint.Y:= cScreenHeight - CursorPoint.Y - WorldDy;
                 end;
-            if (WorldEdge <> weBounce) then
+            if (WorldEdge <> weBounce) and ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_NoWrapTarget) = 0) then
                 TargetPoint.X:= CalcWorldWrap(TargetPoint.X, 0);
             SendIPCXY('p', TargetPoint.X, TargetPoint.Y);
             end
         else
             begin
-            TargetPoint.X:= CalcWorldWrap(TargetPoint.X, 0);
+            if (Ammoz[CurAmmoType].Ammo.Propz and ammoprop_NoWrapTarget) = 0 then
+                TargetPoint.X:= CalcWorldWrap(TargetPoint.X, 0);
             TargetPoint.X:= putX;
             TargetPoint.Y:= putY
             end;
@@ -537,7 +543,10 @@
         State:= State and (not gstChooseTarget);
         if (Ammoz[CurAmmoType].Ammo.Propz and ammoprop_AttackingPut) <> 0 then
             Message:= Message or (gmAttack and InputMask);
+        Message:= Message and (not (gmHJump or gmLJump or gmLeft or gmRight or gmUp or gmDown));
         end
+        else
+            PlaySound(sndDenied)
     else
         if CurrentTeam^.ExtDriven then
             OutError('Got /put while not being in choose target mode', false)
--- a/hedgewars/uInputHandler.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uInputHandler.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -32,12 +32,17 @@
 function  KeyBindToName(bind: shortstring): shortstring;
 //procedure MaskModifier(var code: LongInt; modifier: LongWord);
 procedure MaskModifier(Modifier: shortstring; var code: LongInt);
-procedure ProcessMouse(event: TSDL_MouseButtonEvent; ButtonDown: boolean);
+procedure ProcessMouseButton(event: TSDL_MouseButtonEvent; ButtonDown: boolean);
+procedure ProcessMouseMotion(xrel, yrel: LongInt);
 //procedure ProcessMouseWheel(x, y: LongInt);
 procedure ProcessMouseWheel(y: LongInt);
 procedure ProcessKey(event: TSDL_KeyboardEvent); inline;
 procedure ProcessKey(code: LongInt; KeyDown: boolean);
 
+{$IFDEF USE_AM_NUMCOLUMN}
+function CheckDefaultSlotKeys: boolean;
+{$ENDIF}
+
 procedure ResetKbd;
 procedure ResetMouseWheel;
 procedure FreezeEnterKey;
@@ -55,7 +60,7 @@
 procedure ControllerButtonEvent(joy, button: Byte; pressed: Boolean);
 
 implementation
-uses uConsole, uCommands, uVariables, uConsts, uUtils, uDebug, uPhysFSLayer;
+uses uKeyNames, uConsole, uCommands, uVariables, uConsts, uUtils, uDebug, uPhysFSLayer, uCursor;
 
 const
     LSHIFT = $0200;
@@ -66,7 +71,7 @@
     RCTRL  = $4000;
 
 var tkbd: array[0..cKbdMaxIndex] of boolean;
-    KeyNames: array [0..cKeyMaxIndex] of string[15];
+    KeyNames: TKeyNames;
     CurrentBinds: TBinds;
     ControllerNumControllers: Integer;
     ControllerEnabled: Integer;
@@ -182,7 +187,8 @@
 procedure ProcessKey(code: LongInt; KeyDown: boolean);
 var
     Trusted: boolean;
-    s      : string;
+    curBind, s: shortstring;
+    readyAborter: boolean;
 begin
 if not(tkbd[code] xor KeyDown) then exit;
 tkbd[code]:= KeyDown;
@@ -222,44 +228,63 @@
 
 if CurrentBinds.indices[code] > 0 then
     begin
+    curBind:= CurrentBinds.binds[CurrentBinds.indices[code]];
+
+    // Check if the keypress should end the ready phase.
+    // Camera movement keys are "safe" since its equivalent to moving the mouse,
+    // which also does not end the ready phase.
+    readyAborter:= (curBind <> '+cur_u') and (curBind <> '+cur_d') and (curBind <> '+cur_l') and (curBind <> '+cur_r');
+
     if (code < cKeyMaxIndex - 2) // means not mouse buttons
         and KeyDown
-        and (not ((CurrentBinds.binds[CurrentBinds.indices[code]] = 'put') 
-                  or (CurrentBinds.binds[CurrentBinds.indices[code]] = 'ammomenu') 
-                  or (CurrentBinds.binds[CurrentBinds.indices[code]] = '+cur_u') 
-                  or (CurrentBinds.binds[CurrentBinds.indices[code]] = '+cur_d') 
-                  or (CurrentBinds.binds[CurrentBinds.indices[code]] = '+cur_l') 
-                  or (CurrentBinds.binds[CurrentBinds.indices[code]] = '+cur_r')))
-        and (CurrentTeam <> nil) 
-        and (not CurrentTeam^.ExtDriven) 
+        and (not ((curBind = 'put')
+                  or (curBind = 'ammomenu')
+                  or (curBind = '+cur_u')
+                  or (curBind = '+cur_d')
+                  or (curBind = '+cur_l')
+                  or (curBind = '+cur_r')))
+        and (CurrentTeam <> nil)
+        and (not CurrentTeam^.ExtDriven)
         then bShowAmmoMenu:= false;
 
     if KeyDown then
         begin
         Trusted:= Trusted and (not isPaused); //releasing keys during pause should be allowed on the other hand
 
-        if CurrentBinds.binds[CurrentBinds.indices[code]] = 'switch' then
+        if curBind = 'switch' then
             LocalMessage:= LocalMessage or gmSwitch
-        else if CurrentBinds.binds[CurrentBinds.indices[code]] = '+precise' then
+        else if curBind = '+precise' then
+            begin
             LocalMessage:= LocalMessage or gmPrecise;
+            updateVolumeDelta(true);
+            updateCursorMovementDelta(true, CursorMovementX, CursorMovementX);
+            updateCursorMovementDelta(true, CursorMovementY, CursorMovementY);
+            end;
 
-        ParseCommand(CurrentBinds.binds[CurrentBinds.indices[code]], Trusted);
-        if (CurrentTeam <> nil) and (not CurrentTeam^.ExtDriven) and (ReadyTimeLeft > 1) then
+        ParseCommand(curBind, Trusted);
+        // End ready phase
+        if (readyAborter) and (CurrentTeam <> nil) and (not CurrentTeam^.ExtDriven) and (ReadyTimeLeft > 1) then
             ParseCommand('gencmd R', true)
         end
-    else if (CurrentBinds.binds[CurrentBinds.indices[code]][1] = '+') then
+    else if (curBind[1] = '+') then
         begin
-        if CurrentBinds.binds[CurrentBinds.indices[code]] = '+precise' then
+        if curBind = '+precise' then
+            begin
             LocalMessage:= LocalMessage and (not gmPrecise);
-        s:= CurrentBinds.binds[CurrentBinds.indices[code]];
+            updateVolumeDelta(false);
+            updateCursorMovementDelta(false, CursorMovementX, CursorMovementX);
+            updateCursorMovementDelta(false, CursorMovementY, CursorMovementY);
+            end;
+        s:= curBind;
         s[1]:= '-';
         ParseCommand(s, Trusted);
-        if (CurrentTeam <> nil) and (not CurrentTeam^.ExtDriven) and (ReadyTimeLeft > 1) then
+        // End ready phase
+        if (readyAborter) and (CurrentTeam <> nil) and (not CurrentTeam^.ExtDriven) and (ReadyTimeLeft > 1) then
             ParseCommand('gencmd R', true)
         end
     else
         begin
-        if CurrentBinds.binds[CurrentBinds.indices[code]] = 'switch' then
+        if curBind = 'switch' then
             LocalMessage:= LocalMessage and (not gmSwitch)
         end
     end
@@ -274,7 +299,7 @@
     ProcessKey(code, event.type_ = SDL_KEYDOWN);
 end;
 
-procedure ProcessMouse(event: TSDL_MouseButtonEvent; ButtonDown: boolean);
+procedure ProcessMouseButton(event: TSDL_MouseButtonEvent; ButtonDown: boolean);
 begin
     //writelntoconsole('[MOUSE] '+inttostr(event.button));
     case event.button of
@@ -284,9 +309,18 @@
             ProcessKey(KeyNameToCode('mousem'), ButtonDown);
         SDL_BUTTON_RIGHT:
             ProcessKey(KeyNameToCode('mouser'), ButtonDown);
+        SDL_BUTTON_X1:
+            ProcessKey(KeyNameToCode('mousex1'), ButtonDown);
+        SDL_BUTTON_X2:
+            ProcessKey(KeyNameToCode('mousex2'), ButtonDown);
         end;
 end;
 
+procedure ProcessMouseMotion(xrel, yrel: LongInt);
+begin
+    uCursor.updatePositionDelta(xrel, yrel);
+end;
+
 var mwheelupCode, mwheeldownCode: Integer;
 
 //procedure ProcessMouseWheel(x, y: LongInt);
@@ -358,10 +392,13 @@
     RegisterBind(DefaultBinds, 'delete', 'rotmask');
     RegisterBind(DefaultBinds, 'home', 'rottags');
     RegisterBind(DefaultBinds, _S'm', '+mission');
+    RegisterBind(DefaultBinds, _S'o', 'gearinfo');
 
     //numpad
-    //DefaultBinds[265]:= '+volup';
-    //DefaultBinds[256]:= '+voldown';
+    RegisterBind(DefaultBinds, 'keypad_8', '+cur_u');
+    RegisterBind(DefaultBinds, 'keypad_6', '+cur_r');
+    RegisterBind(DefaultBinds, 'keypad_4', '+cur_l');
+    RegisterBind(DefaultBinds, 'keypad_2', '+cur_d');
 
     RegisterBind(DefaultBinds, _S'0', '+volup');
     RegisterBind(DefaultBinds, _S'9', '+voldown');
@@ -370,8 +407,9 @@
     RegisterBind(DefaultBinds, _S'r', 'record');
     RegisterBind(DefaultBinds, _S'h', 'findhh');
     RegisterBind(DefaultBinds, _S'p', 'pause');
-    RegisterBind(DefaultBinds, _S's', '+speedup');
+    RegisterBind(DefaultBinds, _S'f', '+speedup');
     RegisterBind(DefaultBinds, _S't', 'chat');
+    RegisterBind(DefaultBinds, _S'u', 'chat team');
     RegisterBind(DefaultBinds, _S'y', 'confirm');
 
     RegisterBind(DefaultBinds, 'mousem', 'zoomreset');
@@ -396,66 +434,26 @@
     RegisterBind(DefaultBinds, 'right', '+right');
     RegisterBind(DefaultBinds, 'left_shift', '+precise');
 
-    // Default controls for first connected controller
-    { NOTE: This is provided for convenience so players
-    don't have to set-up the controller entirely in a new install.
-    It's not ideal, so players are still encourages to
-    set up things manually. }
-    // Essential controls
-    RegisterBind(DefaultBinds, 'j0h0r', '+right');
-    RegisterBind(DefaultBinds, 'j0h0l', '+left');
-    RegisterBind(DefaultBinds, 'j0h0u', '+up');
-    RegisterBind(DefaultBinds, 'j0h0d', '+down');
-    RegisterBind(DefaultBinds, 'j0b0', 'ljump');
-    RegisterBind(DefaultBinds, 'j0b1', 'hjump');
-    RegisterBind(DefaultBinds, 'j0b2', '+attack');
-    RegisterBind(DefaultBinds, 'j0b3', 'ammomenu');
-    RegisterBind(DefaultBinds, 'j0b4', '+precise');
-    RegisterBind(DefaultBinds, 'j0b5', 'put');
-    RegisterBind(DefaultBinds, 'j0b6', 'switch');
-    RegisterBind(DefaultBinds, 'j0b7', 'timer_u');
-
-    // Cursor movement (also essential)
-    RegisterBind(DefaultBinds, 'j0h1r', '+cur_r');
-    RegisterBind(DefaultBinds, 'j0h1l', '+cur_l');
-    RegisterBind(DefaultBinds, 'j0h1d', '+cur_d');
-    RegisterBind(DefaultBinds, 'j0h1u', '+cur_u');
-
-    RegisterBind(DefaultBinds, 'j0a0u', '+cur_r');
-    RegisterBind(DefaultBinds, 'j0a0d', '+cur_l');
-    RegisterBind(DefaultBinds, 'j0a1u', '+cur_d');
-    RegisterBind(DefaultBinds, 'j0a1d', '+cur_u');
-
-    // Additional controls
-    RegisterBind(DefaultBinds, 'j0b8', 'findhh');
-    RegisterBind(DefaultBinds, 'j0b9', '+mission');
-
     loadBinds('dbind', cPathz[ptConfig] + '/settings.ini');
 end;
 
 
 procedure InitKbdKeyTable;
-var i, j, k, t: LongInt;
-    s: string[15];
+var i, j, k: LongInt;
 begin
+    // Mouse buttons and mouse wheel
     KeyNames[cKeyMaxIndex    ]:= 'mousel';
     KeyNames[cKeyMaxIndex - 1]:= 'mousem';
     KeyNames[cKeyMaxIndex - 2]:= 'mouser';
-    mwheelupCode:= cKeyMaxIndex - 3;
+    KeyNames[cKeyMaxIndex - 3]:= 'mousex1';
+    KeyNames[cKeyMaxIndex - 4]:= 'mousex2';
+    mwheelupCode:= cKeyMaxIndex - 5;
     KeyNames[mwheelupCode]:= 'wheelup';
-    mwheeldownCode:= cKeyMaxIndex - 4;
+    mwheeldownCode:= cKeyMaxIndex - 6;
     KeyNames[mwheeldownCode]:= 'wheeldown';
 
-    for i:= 0 to cKeyMaxIndex - 5 do
-        begin
-        s:= shortstring(SDL_GetScancodeName(TSDL_Scancode(i)));
-
-        for t:= 1 to Length(s) do
-            if s[t] = ' ' then
-                s[t]:= '_';
-        KeyNames[i]:= LowerCase(s)
-        end;
-
+    // Keyboard keys
+    uKeyNames.populateKeyNames(KeyNames);
 
     // get the size of keyboard array
     SDL_GetKeyboardState(@k);
@@ -488,6 +486,27 @@
 end;
 
 
+{$IFDEF USE_AM_NUMCOLUMN}
+function CheckDefaultSlotKeys: boolean;
+{$IFDEF USE_TOUCH_INTERFACE}
+begin
+    CheckDefaultSlotKeys:= false;
+{$ELSE}
+var i, code: LongInt;
+begin
+    for i:=1 to cMaxSlotIndex do
+        begin
+        code:= KeyNameToCode('f'+IntToStr(i));
+        if CurrentBinds.binds[CurrentBinds.indices[code]] <> 'slot '+char(i+48) then
+            begin
+            CheckDefaultSlotKeys:= false;
+            exit;
+            end;
+        end;
+    CheckDefaultSlotKeys:= true;
+{$ENDIF}
+end;
+{$ENDIF}
 
 {$IFNDEF MOBILE}
 procedure SetBinds(var binds: TBinds);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hedgewars/uKeyNames.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,131 @@
+(*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2004-2019 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program 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; version 2 of the License
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *)
+
+unit uKeyNames;
+interface
+uses uConsts;
+
+type TKeyNames = array [0..cKeyMaxIndex] of string[15];
+
+procedure populateKeyNames(var KeyArray: TKeyNames);
+// procedure generateKeyNames(); // DEBUG (see below)
+
+implementation
+
+uses uPhysFSLayer, uUtils, uVariables, uTypes, uConsole;
+
+procedure populateKeyNames(var KeyArray: TKeyNames);
+var f: PfsFile;
+    l, keyname, tmp: shortstring;
+    i, scancode: LongInt;
+begin
+(*
+ KeyArray is a mapping from SDL scancodes to Hedgewars key identifiers.
+ Hedgewars key identifiers are strings with a maximum length of 15
+ and are used internally to identify keys in the engine and in settings.ini.
+*)
+
+(* Key identifiers are read from an RFC 4180-compliant CSV file.
+- 1st column: SDL scancode
+- 2nd column: Hedgewars key ID *)
+if pfsExists(cPathz[ptMisc]+'/keys.csv') then
+    begin
+    f:= pfsOpenRead(cPathz[ptMisc]+'/keys.csv');
+    l:= '';
+    pfsReadLn(f, l);
+    while (not pfsEOF(f)) and (l <> '') do
+        begin
+        tmp:= '';
+        i:= 1;
+        while (i <= length(l)) and (l[i] <> ',') do
+            begin
+            tmp:= tmp + l[i];
+            inc(i)
+            end;
+        scancode:= StrToInt(tmp);
+
+        if i < length(l) then
+            begin
+            keyname:= copy(l, i + 1, length(l) - i);
+            if (keyname[1] = '"') and (keyname[length(keyname)] = '"') then
+                keyname:= copy(keyname, 2, length(keyname) - 2)
+            else
+                keyname:= copy(keyname, 1, length(keyname) - 1);
+            end;
+
+        pfsReadLn(f, l);
+        KeyArray[scancode]:= keyname;
+        end;
+
+    pfsClose(f)
+    end
+else
+    begin
+    WriteLnToConsole('misc/keys.csv file not found');
+    AddFileLog('misc/keys.csv file not found');
+    halt(haltStartupError);
+    end;
+
+// generateKeyNames(); // DEBUG (see below)
+end;
+
+(*
+The Hedgewars key identifiers were obtained with the following algorithm:
+
+Basically:
+- For each SDL scancode, do:
+   - Take the printable SDL scancode key name (with SDL_GetScancodeName)
+   - Replace spaces with underscores
+   - Lowercase it
+   - Cap string length to 15 characters
+- Manually fix duplicates
+
+See also:
+
+https://wiki.libsdl.org/SDLScancodeLookup
+https://wiki.libsdl.org/SDL_Scancode
+
+NOTE: For compability reasons, existing identifiers should not be renamed.
+
+*)
+
+(* DEBUG
+   Uncomment this to generate a list of key names in
+   CSV format (RFC 4180) and print it out on console.
+   Don't forget to fix duplicates! *)
+(*
+procedure generateKeyNames();
+var i, t: LongInt;
+s, s2: shortstring;
+begin
+    for i := 0 to cKeyMaxIndex - 5 do
+        begin
+        s := shortstring(SDL_GetScancodeName(TSDL_Scancode(i)));
+        for t := 1 to Length(s) do
+            if s[t] = ' ' then
+                s[t] := '_';
+        s2:= copy(s, 1, 15);
+        if s2 = '"' then
+            WriteLnToConsole(IntToStr(i)+',"\""')
+        else if s2 <> '' then
+            WriteLnToConsole(IntToStr(i)+',"'+LowerCase(s2)+'"');
+        end;
+end;
+*)
+
+end.
--- a/hedgewars/uLand.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uLand.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -49,7 +49,6 @@
 
 procedure DrawBorderFromImage(Surface: PSDL_Surface);
 var tmpsurf: PSDL_Surface;
-    //r, rr: TSDL_Rect;
     x, yd, yu: LongInt;
     targetMask: Word;
 begin
@@ -269,7 +268,6 @@
         while r.x < LAND_WIDTH do
             begin
             copyToXY(tmpsurf, Surface, r.x, r.y);
-            //SDL_UpperBlit(tmpsurf, nil, Surface, @r);
             inc(r.x, tmpsurf^.w)
             end;
         inc(y, tmpsurf^.h);
@@ -284,27 +282,88 @@
 
 
 procedure GenDrawnMap;
+var lowerX, upperX, lowerY, upperY, lowerFS, upperFS: LongInt;
 begin
-    ResizeLand(4096, 2048);
-    uLandPainted.Draw;
+    if (cFeatureSize <= 6) then
+        MaxHedgehogs:= 6 + (cFeatureSize-1) * 2
+    else if (cFeatureSize < 11) then
+        MaxHedgehogs:= 16 + (cFeatureSize-6) * 4
+    else if (cFeatureSize = 11) then
+        MaxHedgehogs:= 48
+    else if (cFeatureSize = 12) then
+        MaxHedgehogs:= 64
+    else
+        MaxHedgehogs:= cMaxHHs;
+
+    if GameType = gmtLandPreview then
+        cFeatureSize:= 1;
+
+    // Calculate map size for drawn map, use cFeatureSize to scale.
 
-    MaxHedgehogs:= 48;
+    // We have pre-determined map size for cFeatureSize 1, 6, 12 and 25.
+    // The other values will be interpolated.
+    if cFeatureSize < 6 then
+        begin
+        // reference size for cFeatureSize 1
+        lowerFS:= 1;
+        lowerX:= 1024;
+        lowerY:= 512;
+        upperFS:= 6;
+        end
+    else if cFeatureSize < 12 then
+        begin
+        // reference size for cFeatureSize 6
+        lowerFS:= 6;
+        lowerX:= 2048;
+        lowerY:= 1024;
+        upperFS:= 12;
+        end
+    else
+        begin
+        // reference size for cFeatureSize 12, size of drawn maps in pre-1.0.0 versions
+        lowerFS:= 12;
+        lowerX:= 4096;
+        lowerY:= 2048;
+        upperFS:= 25;
+        end;
+
+    upperX:= lowerX * 2;
+    upperY:= lowerY * 2;
+
+    if cFeatureSize = 25 then
+        begin
+        // hardcoded size for size level 25
+        playWidth:= 8192;
+        playHeight:= 4096;
+        end
+    else
+        begin
+        // Interpolation formula
+        playWidth:= lowerX + ((upperX-lowerX) div (upperFS-lowerFS))*(cFeatureSize-lowerFS);
+        playHeight:= lowerY + ((upperY-lowerY) div (upperFS-lowerFS))*(cFeatureSize-lowerFS);
+        end;
+
+    if GameType <> gmtLandPreview then
+        WriteLnToConsole('Drawn map size: cFeatureSize='+IntToStr(cFeatureSize)+' playWidth='+IntToStr(playWidth)+' playHeight='+IntToStr(playHeight));
+
+    ResizeLand(playWidth, playHeight);
+
     hasGirders:= true;
-    playHeight:= 2048;
-    playWidth:= 4096;
     leftX:= ((LAND_WIDTH - playWidth) div 2);
     rightX:= (playWidth + ((LAND_WIDTH - playWidth) div 2)) - 1;
     topY:= LAND_HEIGHT - playHeight;
+
+    uLandPainted.Draw;
 end;
 
 function SelectTemplate: LongInt;
 var l: LongInt;
 begin
-	SelectTemplate:= 0;
+    SelectTemplate:= 0;
     if (cReducedQuality and rqLowRes) <> 0 then
         SelectTemplate:= SmallTemplates[getrandom(Succ(High(SmallTemplates)))]
     else
-		begin
+        begin
         if cTemplateFilter = 0 then
             begin
             l:= getRandom(GroupedTemplatesCount);
@@ -313,22 +372,22 @@
                 dec(l, TemplateCounts[cTemplateFilter]);
             until l < 0;
             end
-			else getRandom(1);
+            else getRandom(1);
 
-			case cTemplateFilter of
-			0: OutError('Error selecting TemplateFilter. Ask unC0Rr about what you did wrong', true);
-			1: SelectTemplate:= SmallTemplates[getrandom(TemplateCounts[cTemplateFilter])];
-			2: SelectTemplate:= MediumTemplates[getrandom(TemplateCounts[cTemplateFilter])];
-			3: SelectTemplate:= LargeTemplates[getrandom(TemplateCounts[cTemplateFilter])];
-			4: SelectTemplate:= CavernTemplates[getrandom(TemplateCounts[cTemplateFilter])];
-			5: SelectTemplate:= WackyTemplates[getrandom(TemplateCounts[cTemplateFilter])];
-	// For lua only!
-			6: begin
-			   SelectTemplate:= min(LuaTemplateNumber,High(EdgeTemplates));
-			   GetRandom(2) // burn 1
-			   end
-			end
-		end;
+            case cTemplateFilter of
+            0: OutError('Error selecting TemplateFilter. Ask unC0Rr about what you did wrong', true);
+            1: SelectTemplate:= SmallTemplates[getrandom(TemplateCounts[cTemplateFilter])];
+            2: SelectTemplate:= MediumTemplates[getrandom(TemplateCounts[cTemplateFilter])];
+            3: SelectTemplate:= LargeTemplates[getrandom(TemplateCounts[cTemplateFilter])];
+            4: SelectTemplate:= CavernTemplates[getrandom(TemplateCounts[cTemplateFilter])];
+            5: SelectTemplate:= WackyTemplates[getrandom(TemplateCounts[cTemplateFilter])];
+    // For lua only!
+            6: begin
+               SelectTemplate:= min(LuaTemplateNumber,High(EdgeTemplates));
+               GetRandom(2) // burn 1
+               end
+            end
+        end;
 
     WriteLnToConsole('Selected template #'+inttostr(SelectTemplate)+' using filter #'+inttostr(cTemplateFilter));
 end;
@@ -350,7 +409,7 @@
         if (cReducedQuality and rqBlurryLand) = 0 then
             LandPixels[y, x]:= p^[x]// or AMask
         else
-            LandPixels[y div 2, x div 2]:= p^[x];// or AMask;
+            LandPixels[y div 2, x div 2]:= p^[x];
 
     p:= PLongwordArray(@(p^[Surface^.pitch div 4]));
     end;
@@ -766,8 +825,10 @@
                     end;
                 end;
 
+// Indestructible map border (top, left, right)
 if hasBorder then
     begin
+    // Make land beyond the border indestructible
     if WorldEdge = weNone then
         begin
         for y:= 0 to LAND_HEIGHT - 1 do
@@ -781,23 +842,26 @@
             for x:= 0 to LAND_WIDTH - 1 do
                 Land[y, x]:= lfIndestructible;
         end;
-    // experiment hardcoding cave
-    // also try basing cave dimensions on map/template dimensions, if they exist
-    for w:= 0 to 5 do // width of 3 allowed hogs to be knocked through with grenade
+    // Render map border
+    for w:= 0 to (cBorderWidth-1) do
         begin
+        // Left and right border
         if (WorldEdge <> weBounce) and (WorldEdge <> weWrap) then
             for y:= LongWord(topY) to LAND_HEIGHT - 1 do
                     begin
+                    // set land flags
                     Land[y, leftX + w]:= lfIndestructible;
                     Land[y, rightX - w]:= lfIndestructible;
+
+                    // paint black and yellow stripes
                     if (y + leftX + w) mod 32 < 16 then
-                        c:= AMask
+                        c:= AMask // black
                     else
-                        c:= AMask or RMask or GMask; // FF00FFFF
+                        c:= AMask or RMask or GMask; // yellow
                     if (y + rightX - w) mod 32 < 16 then
-                        c2:= AMask
+                        c2:= AMask // black
                     else
-                        c2:= AMask or RMask or GMask; // FF00FFFF
+                        c2:= AMask or RMask or GMask; // yellow
 
                     if (cReducedQuality and rqBlurryLand) = 0 then
                         begin
@@ -811,13 +875,14 @@
                         end;
                     end;
 
+        // Top border
         for x:= LongWord(leftX) to LongWord(rightX) do
             begin
             Land[topY + w, x]:= lfIndestructible;
-            if (x + w) mod 32 < 16 then
-                c:= AMask
+            if (topY + x + w) mod 32 < 16 then
+                c:= AMask // black
             else
-                c:= AMask or RMask or GMask; // FF00FFFF
+                c:= AMask or RMask or GMask; // yellow
 
             if (cReducedQuality and rqBlurryLand) = 0 then
                 LandPixels[topY + w, x]:= c
@@ -827,6 +892,7 @@
         end;
     end;
 
+// Bottom border
 if (GameFlags and gfBottomBorder) <> 0 then
     DrawBottomBorder;
 
@@ -886,7 +952,7 @@
         mgRandom: GenTemplated(EdgeTemplates[SelectTemplate]);
         mgMaze: begin ResizeLand(4096,2048); GenMaze; end;
         mgPerlin: begin ResizeLand(4096,2048); GenPerlin; end;
-        mgDrawn: GenDrawnMap;
+        mgDrawn: begin GenDrawnMap; end;
         mgForts: MakeFortsPreview();
     else
         OutError('Unknown mapgen', true);
@@ -895,8 +961,16 @@
     ScriptSetMapGlobals;
 
     // strict scaling needed here since preview assumes a rectangle
-    rh:= max(LAND_HEIGHT,2048);
-    rw:= max(LAND_WIDTH,4096);
+    if (cMapGen <> mgDrawn) then
+        begin
+        rh:= max(LAND_HEIGHT, 2048);
+        rw:= max(LAND_WIDTH, 4096);
+        end
+    else
+        begin
+        rh:= LAND_HEIGHT;
+        rw:= LAND_WIDTH
+        end;
     ox:= 0;
     if rw < rh*2 then
         begin
@@ -937,7 +1011,7 @@
         mgRandom: GenTemplated(EdgeTemplates[SelectTemplate]);
         mgMaze: begin ResizeLand(4096,2048); GenMaze; end;
         mgPerlin: begin ResizeLand(4096,2048); GenPerlin; end;
-        mgDrawn: GenDrawnMap;
+        mgDrawn: begin GenDrawnMap; end;
         mgForts: MakeFortsPreview;
     else
         OutError('Unknown mapgen', true);
@@ -945,9 +1019,19 @@
 
     ScriptSetMapGlobals;
 
+
     // strict scaling needed here since preview assumes a rectangle
-    rh:= max(LAND_HEIGHT, 2048);
-    rw:= max(LAND_WIDTH, 4096);
+    if (cMapGen <> mgDrawn) then
+        begin
+        rh:= max(LAND_HEIGHT, 2048);
+        rw:= max(LAND_WIDTH, 4096);
+        end
+    else
+        begin
+        rh:= LAND_HEIGHT;
+        rw:= LAND_WIDTH
+        end;
+
     ox:= 0;
     if rw < rh*2 then
         begin
@@ -986,9 +1070,9 @@
 
 procedure chSendLandDigest(var s: shortstring);
 var i: LongInt;
-	landPixelDigest  : LongInt;	
+    landPixelDigest  : LongInt;
 begin
-	landPixelDigest:= 1;
+    landPixelDigest:= 1;
     for i:= 0 to LAND_HEIGHT-1 do
         landPixelDigest:= Adler32Update(landPixelDigest, @Land[i,0], LAND_WIDTH*2);
     s:= 'M' + IntToStr(syncedPixelDigest)+'|'+IntToStr(landPixelDigest);
--- a/hedgewars/uLandGenPerlin.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uLandGenPerlin.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -135,6 +135,43 @@
 
     df:= detail * (6 - param2 * 2);
 
+    // Calculate estimate for max. hedgehog count
+    // Tunnels
+    if param1 = 0 then
+        begin
+        // Small tunnels
+        if param2 = 0 then
+            // 12..24
+            MaxHedgehogs:= 12 + 1 * (cFeatureSize - 1)
+        // Medium tunnels
+        else if param2 = 1 then
+            // 14..24
+            MaxHedgehogs:= 14 + max(0, 1 * (cFeatureSize - 3))
+        // Large tunnels
+        else if param2 = 2 then
+            // 16..24
+            MaxHedgehogs:= 16 + max(0, 1 * (cFeatureSize - 5));
+        if MaxHedgehogs > 24 then
+            MaxHedgehogs:= 24;
+        end
+    // Islands
+    else if (param1 = 1) and (cFeatureSize <= 25) then
+        // Small islands
+        if param2 = 0 then
+            // 64..32
+            MaxHedgehogs:= 32 + ((((25 - (cFeatureSize-1))*1000000) div 24) * 32) div 1000000
+        // Medium islands
+        else if param2 = 1 then
+            // 56..28
+            MaxHedgehogs:= 28 + ((((25 - (cFeatureSize-1))*1000000) div 24) * 28) div 1000000
+        // Large islands
+        else if param2 = 2 then
+            // 48..24
+            MaxHedgehogs:= 24 + ((((25 - (cFeatureSize-1))*1000000) div 24) * 24) div 1000000;
+    // We only want even numbers
+    if (MaxHedgehogs > 0) and ((MaxHedgehogs mod 2) = 1) then
+        MaxHedgehogs:= MaxHedgehogs - 1;
+
     inoise_setup();
 
     for y:= minY to pred(height) do
@@ -188,8 +225,10 @@
                     Land[y, x]:= 0;
         end;
 
+    playWidth:= width;
+    playHeight:= height;
     leftX:= 0;
-    rightX:= 4095;
+    rightX:= playWidth - 1;
     topY:= 0;
     hasBorder:= false;
 end;
--- a/hedgewars/uLandGraphics.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uLandGraphics.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -51,6 +51,7 @@
 function TryPlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace: boolean; LandFlags: Word): boolean; inline;
 function ForcePlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; LandFlags: Word; Tint: LongWord; Behind, flipHoriz, flipVert: boolean): boolean; inline;
 function TryPlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace, outOfMap, force, behind, flipHoriz, flipVert: boolean; LandFlags: Word; Tint: LongWord): boolean;
+procedure EraseLandRectRaw(X, Y, width, height: LongWord);
 procedure EraseLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; LandFlags: Word; eraseOnLFMatch, onlyEraseLF, flipHoriz, flipVert: boolean);
 function GetPlaceCollisionTex(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt): PTexture;
 
@@ -161,6 +162,7 @@
 procedure DrawPixelIce(landX, landY, pixelX, pixelY: Longint); inline;
 begin
 if ((Land[landY, landX] and lfIce) <> 0) then exit;
+if (pixelX < LeftX) or (pixelX > RightX) or (pixelY < TopY) then exit;
 if isLandscapeEdge(getPixelWeight(landX, landY)) then
     begin
     if (LandPixels[pixelY, pixelX] and AMask < 255) and (LandPixels[pixelY, pixelX] and AMask > 0) then
@@ -839,6 +841,17 @@
 
 end;
 
+procedure EraseLandRectRaw(X, Y, width, height: LongWord);
+var tx, ty: LongWord;
+begin
+for ty:= 0 to height - 1 do
+    for tx:= 0 to width - 1 do
+        begin
+        LandPixels[ty, tx]:= 0;
+        Land[Y + ty, X + tx]:= 0;
+        end;
+end;
+
 procedure EraseLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; LandFlags: Word; eraseOnLFMatch, onlyEraseLF, flipHoriz, flipVert: boolean);
 var X, Y, bpp, h, w, row, col, gx, gy, numFramesFirstCol: LongInt;
     p: PByteArray;
--- a/hedgewars/uLandObjects.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uLandObjects.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -114,9 +114,15 @@
     BlitImageAndGenerateCollisionInfo(cpX, cpY, Width, Image, LandFlags, false);
 end;
 
+function LerpByte(src, dst: Byte; l: LongWord): LongWord; inline;
+begin
+    LerpByte:= ((255 - l) * src + l * dst) div 255;
+end;
+
 procedure BlitImageAndGenerateCollisionInfo(cpX, cpY, Width: Longword; Image: PSDL_Surface; LandFlags: Word; Flip: boolean);
 var p: PLongwordArray;
-    px, x, y: Longword;
+    pLandColor: PLongWord;
+    alpha, color, landColor, x, y: LongWord;
     bpp: LongInt;
 begin
 WriteToConsole('Generating collision info... ');
@@ -142,25 +148,33 @@
         begin
         // map image pixels per line backwards if in flip mode
         if Flip then
-            px:= Pred(Image^.w) - x
+            color:= p^[Pred(Image^.w) - x]
+        else
+            color:= p^[x];
+
+        if (cReducedQuality and rqBlurryLand) = 0 then
+            pLandColor:= @LandPixels[cpY + y, cpX + x]
         else
-            px:= x;
+            pLandColor:= @LandPixels[(cpY + y) div 2, (cpX + x) div 2];
 
-        if (p^[px] and AMask) <> 0 then
+        landColor:= pLandColor^;
+        alpha:= (landColor and AMask) shr AShift;
+
+        if ((color and AMask) <> 0) and (alpha <> 255)  then
             begin
-            if (cReducedQuality and rqBlurryLand) = 0 then
-                begin
-                if (LandPixels[cpY + y, cpX + x] = 0)
-                or (((LandPixels[cpY + y, cpX + x] and AMask) shr AShift) < 255) then
-                    LandPixels[cpY + y, cpX + x]:= p^[px];
-                end
+            if alpha = 0 then
+                pLandColor^:= color
             else
-                if LandPixels[(cpY + y) div 2, (cpX + x) div 2] = 0 then
-                    LandPixels[(cpY + y) div 2, (cpX + x) div 2]:= p^[px];
+                pLandColor^:=
+                   (LerpByte((color and RMask) shr RShift, (landColor and RMask) shr RShift, alpha) shl RShift)
+                    or (LerpByte((color and GMask) shr GShift, (landColor and GMask) shr GShift, alpha) shl GShift)
+                    or (LerpByte((color and BMask) shr BShift, (landColor and BMask) shr BShift, alpha) shl BShift)
+                    or (LerpByte(alpha, 255, (color and AMask) shr AShift) shl AShift);
 
-            if Land[cpY + y, cpX + x] <= lfAllObjMask then
-                Land[cpY + y, cpX + x]:= lfObject or LandFlags
             end;
+
+        if ((color and AMask) <> 0) and (Land[cpY + y, cpX + x] <= lfAllObjMask) then
+            Land[cpY + y, cpX + x]:= lfObject or LandFlags
         end;
     p:= PLongwordArray(@(p^[Image^.pitch shr 2]))
     end;
@@ -170,11 +184,6 @@
 WriteLnToConsole(msgOK)
 end;
 
-function LerpByte(src, dst: Byte; l: LongWord): LongWord; inline;
-begin
-    LerpByte:= ((255 - l) * src + l * dst) div 255;
-end;
-
 procedure BlitOverlayAndGenerateCollisionInfo(cpX, cpY: Longword; Image: PSDL_Surface);
 var p: PLongwordArray;
     pLandColor: PLongWord;
@@ -229,7 +238,8 @@
 
 procedure BlitImageUsingMask(cpX, cpY: Longword;  Image, Mask: PSDL_Surface);
 var p, mp: PLongwordArray;
-    x, y: Longword;
+    pLandColor: PLongWord;
+    alpha, color, landColor, x, y: Longword;
     bpp: LongInt;
 begin
 WriteToConsole('Generating collision info... ');
@@ -250,19 +260,32 @@
     begin
     for x:= 0 to Pred(Image^.w) do
         begin
+        color:= p^[x];
+
         if (cReducedQuality and rqBlurryLand) = 0 then
-            begin
-            if (LandPixels[cpY + y, cpX + x] = 0)
-            or (((p^[x] and AMask) <> 0) and (((LandPixels[cpY + y, cpX + x] and AMask) shr AShift) < 255)) then
-                LandPixels[cpY + y, cpX + x]:= p^[x];
-            end
+            pLandColor:= @LandPixels[cpY + y, cpX + x]
         else
-            if LandPixels[(cpY + y) div 2, (cpX + x) div 2] = 0 then
-                LandPixels[(cpY + y) div 2, (cpX + x) div 2]:= p^[x];
+            pLandColor:= @LandPixels[(cpY + y) div 2, (cpX + x) div 2];
+
+        landColor:= pLandColor^;
+        alpha:= (landColor and AMask) shr AShift;
+
+        if ((color and AMask) <> 0) and (alpha <> 255)  then
+        begin
+            if alpha = 0 then
+                pLandColor^:= color
+            else
+                pLandColor^:=
+                   (LerpByte((color and RMask) shr RShift, (landColor and RMask) shr RShift, alpha) shl RShift)
+                   or (LerpByte((color and GMask) shr GShift, (landColor and GMask) shr GShift, alpha) shl GShift)
+                   or (LerpByte((color and BMask) shr BShift, (landColor and BMask) shr BShift, alpha) shl BShift)
+                   or (LerpByte(alpha, 255, (color and AMask) shr AShift) shl AShift);
+        end;
 
         if (Land[cpY + y, cpX + x] <= lfAllObjMask) or (Land[cpY + y, cpX + x] and lfObject <> 0)  then
             SetLand(Land[cpY + y, cpX + x], mp^[x]);
         end;
+
     p:= PLongwordArray(@(p^[Image^.pitch shr 2]));
     mp:= PLongwordArray(@(mp^[Mask^.pitch shr 2]))
     end;
@@ -514,10 +537,12 @@
         if bRes then
             begin
             anchored:= anchorcnt = 0;
-            for i:= 1 to anchorcnt do
+            i:= 0;
+            while i < anchorcnt do
                 begin
                     anchored := CheckLandAny(anchors[i], x, y, lfLandMask);
                     if anchored then break;
+                    inc(i);
                 end;
             bRes:= anchored;
             end;
@@ -542,7 +567,7 @@
     begin
     if Maxcnt = 0 then
         exit;
-    x:= 0;
+    x:= leftX;
     repeat
         y:= topY+32; // leave room for a hedgie to teleport in
         repeat
@@ -564,7 +589,7 @@
             inc(y, 3);
         until y >= LAND_HEIGHT - Height;
         inc(x, getrandom(6) + 3)
-    until x >= LAND_WIDTH - Width;
+    until x >= rightX - Width;
     bRes:= cnt <> 0;
     if bRes then
         begin
@@ -594,7 +619,8 @@
 
 function TryPut2(var Obj: TSprayObject; Surface: PSDL_Surface): boolean;
 const MaxPointsIndex = 8095;
-var x, y: Longword;
+var x, y, xStart, yStart: Longword;
+    xWraps, yWraps: Byte;
     ar: array[0..MaxPointsIndex] of TPoint;
     cnt, i: Longword;
     r: TSDL_Rect;
@@ -606,13 +632,20 @@
     begin
     if Maxcnt = 0 then
         exit;
-    x:= 0;
+    xWraps:= 0;
+    yWraps:= 0;
+    // Start at random coordinates
+    xStart:= getrandom(LAND_WIDTH - Width);
+    yStart:= 8 + getrandom(LAND_HEIGHT - Height - 16);
+    x:= xStart;
+    y:= yStart;
     r.x:= 0;
     r.y:= 0;
     r.w:= Width;
     r.h:= Height + 16;
+    // Then iterate through the whole map; this requires we wrap one time per axis
     repeat
-        y:= 8;
+        yWraps:= 0;
         repeat
             if CheckLand(r, x, y - 8, lfBasic)
             and (not CheckIntersect(x, y, Width, Height)) then
@@ -627,9 +660,19 @@
                     else inc(cnt);
                 end;
             inc(y, 12);
-        until y >= LAND_HEIGHT - Height - 8;
-        inc(x, getrandom(12) + 12)
-    until x >= LAND_WIDTH - Width;
+            if (y >= LAND_HEIGHT - Height - 8) or ((yWraps > 0) and (y >= yStart)) then
+                begin
+                inc(yWraps);
+                y:= 8;
+                end;
+        until yWraps > 1;
+        inc(x, getrandom(12) + 12);
+        if (x >= LAND_WIDTH - Width) or ((xWraps > 0) and (x >= xStart)) then
+            begin
+            inc(xWraps);
+            x:= 0;
+            end;
+    until xWraps > 1;
     bRes:= cnt <> 0;
     if bRes then
         begin
@@ -1036,6 +1079,10 @@
         cIce:= true
     else if key = 'snow' then
         cSnow:= true
+    else if key = 'rope-step' then
+        cRopeNodeStep:= max(1, StrToInt(s))
+    else if key = 'rope-layers' then
+        cRopeLayers:= max(1, min(MAXROPELAYERS, StrToInt(s)))
     else if key = 'sd-water-top' then
         begin
         i:= Pos(',', s);
--- a/hedgewars/uLandPainted.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uLandPainted.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -58,6 +58,7 @@
         rec:= prec^;
         rec.X:= SDLNet_Read16(@rec.X);
         rec.Y:= SDLNet_Read16(@rec.Y);
+
         if rec.X < -318 then rec.X:= -318;
         if rec.X > 4096+318 then rec.X:= 4096+318;
         if rec.Y < -318 then rec.Y:= -318;
@@ -81,7 +82,7 @@
 var pe: PPointEntry;
     prevPoint: PointRec;
     radius: LongInt;
-    color: Longword;
+    color, Xoffset, Yoffset: Longword;
     lineNumber, linePoints: Longword;
 begin
     // shutup compiler
@@ -89,6 +90,8 @@
     prevPoint.Y:= 0;
     radius:= 0;
     linePoints:= 0;
+    Xoffset:= (LAND_WIDTH-(playWidth)) div 2;
+    Yoffset:= LAND_HEIGHT-(playHeight);
 
     pe:= pointsListHead;
     while (pe <> nil) and (pe^.point.flags and $80 = 0) do
@@ -101,6 +104,8 @@
 
     while(pe <> nil) do
         begin
+        pe^.point.X:= LongInt(pe^.point.X) * playWidth div 4096 + Xoffset;
+        pe^.point.Y:= LongInt(pe^.point.Y) * playHeight div 2048 + Yoffset;
         if (pe^.point.flags and $80 <> 0) then
             begin
             if (lineNumber > 0) and (linePoints = 0) and cAdvancedMapGenMode then
@@ -113,9 +118,10 @@
                 else
                 color:= lfBasic;
             radius:= (pe^.point.flags and $3F) * 5 + 3;
+            radius:= (radius * playWidth div 4096);
             linePoints:= FillRoundInLand(pe^.point.X, pe^.point.Y, radius, color);
             end
-            else
+        else
             begin
             inc(linePoints, DrawThickLine(prevPoint.X, prevPoint.Y, pe^.point.X, pe^.point.Y, radius, color));
             end;
@@ -123,6 +129,13 @@
         prevPoint:= pe^.point;
         pe:= pe^.next;
         end;
+
+    if (topY > 0) then
+        EraseLandRectRaw(0, 0, LAND_WIDTH, topY);
+    if (leftX > 0) then
+        EraseLandRectRaw(0, topY, leftX, LAND_HEIGHT - topY);
+    if (rightX < (LAND_WIDTH - 1)) then
+        EraseLandRectRaw(rightX + 1, topY, LAND_WIDTH - (rightX + 1), LAND_HEIGHT - topY);
 end;
 
 procedure initModule;
--- a/hedgewars/uLandTemplates.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uLandTemplates.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -2229,7 +2229,7 @@
         TemplateHeight: 4096; TemplateWidth: 4096;
         canMirror: true; canFlip: true; isNegative: false; canInvert: false;
         hasGirders: true;
-        MaxHedgeHogs: 48;
+        MaxHedgeHogs: 64;
        ),
        (BasePoints: PPointArray(@Template44Points);
         BasePointsCount: Succ(High(Template44Points));
@@ -2262,13 +2262,12 @@
 const SmallTemplates: array[0..2] of Longword = ( 39, 40, 42 );
 const MediumTemplates: array[0..18] of Longword =
       ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 46 );
-const LargeTemplates: array[0..20] of Longword =
+const LargeTemplates: array[0..17] of Longword =
       (
         18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
-        28, 29, 30, 31, 32, 33, 34, 35, 37, 38, 43
+        28, 29, 30, 31, 32, 33, 34, 35
       );
 const CavernTemplates: array[0..5] of Longword = (36, 2, 3, 21, 29, 45);
-//const WackyTemplates: array[0..4] of Longword = (37, 38, 39, 40, 41);
 const WackyTemplates: array[0..4] of Longword = (37, 38, 41, 43, 44);
 const TemplateCounts: array[0..5] of Longword = (
           0
--- a/hedgewars/uLandUtils.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uLandUtils.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -42,6 +42,11 @@
 
 lx:= LongInt(LAND_WIDTH) - 1;
 
+// don't change world edges for drawn maps
+if (cMapGen = mgDrawn) then
+    // edges were adjusted already in GenDrawnMap() in uLand
+    EXIT;
+
 // use maximum available map width if there is no special world edge
 if WorldEdge = weNone then
     begin
--- a/hedgewars/uLocale.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uLocale.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -53,7 +53,7 @@
 {$ENDIF}
 
 implementation
-uses uRandom, uUtils, uVariables, uDebug, uPhysFSLayer;
+uses SysUtils, uRandom, uUtils, uVariables, uDebug, uPhysFSLayer;
 
 var trevt: array[TEventId] of array [0..Pred(MAX_EVENT_STRINGS)] of ansistring;
     trevt_n: array[TEventId] of integer;
@@ -65,6 +65,11 @@
     first: array[TEventId] of boolean;
     e: TEventId;
 begin
+{- TODO: Add support for localized decimal separator in Pas2C -}
+{$IFNDEF PAS2C}
+lDecimalSeparator:= FormatSettings.DecimalSeparator;
+{$ENDIF}
+
 for e:= Low(TEventId) to High(TEventId) do
     first[e]:= true;
 
--- a/hedgewars/uMisc.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uMisc.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -26,7 +26,6 @@
 procedure initModule;
 procedure freeModule;
 
-procedure movecursor(dx, dy: LongInt);
 function  doSurfaceConversion(tmpsurf: PSDL_Surface): PSDL_Surface;
 function MakeScreenshot(filename: shortstring; k: LongInt; dump: LongWord): boolean;
 function  GetTeamStatString(p: PTeam): shortstring;
@@ -46,17 +45,6 @@
 
 var conversionFormat : PSDL_PixelFormat;
 
-procedure movecursor(dx, dy: LongInt);
-var x, y: LongInt;
-begin
-if (dx = 0) and (dy = 0) then exit;
-
-SDL_GetMouseState(@x, @y);
-Inc(x, dx);
-Inc(y, dy);
-SDL_WarpMouse(x, y);
-end;
-
 {$IFDEF PNG_SCREENSHOTS}
 // this funtion will be executed in separate thread
 function SaveScreenshot(screenshot: pointer): LongInt; cdecl; export;
@@ -111,8 +99,41 @@
 SaveScreenshot:= 0;
 end;
 
-{$ELSE} // no PNG_SCREENSHOTS
+{$ELSE} //PNG_SCREENSHOTS
+{$IFDEF WINDOWS}
+function SaveScreenshot(screenshot: pointer): LongInt; cdecl; export;
+var
+    surface: PSDL_Surface;
+    image: PScreenshot;
+    mirror: PByte;
+    row, stride: LongInt;
+begin
+    image:= PScreenshot(screenshot);
+    mirror:= PByte(GetMem(image^.size));
+    stride:= image^.width * 4;
+
+    for row:= 0 to image^.height - 1 do
+        Move((image^.buffer + row * stride)^,
+             (mirror + (image^.height - row - 1) * stride)^,
+             stride);
 
+    surface:= SDL_CreateRGBSurfaceFrom(
+        mirror,
+        image^.width, image^.height, 32, image^.width * 4,
+        $000000FF, $0000FF00, $00FF0000, $FF000000);
+
+    if surface <> nil then
+        begin
+        IMG_SavePNG(surface, Str2PChar(image^.filename));
+        SDL_FreeSurface(surface);
+        end;
+
+    FreeMem(mirror, image^.size);
+    FreeMem(image^.buffer, image^.size);
+    Dispose(image);
+    SaveScreenshot:= 0;
+end;
+{$ELSE} //WINDOWS
 // this funtion will be executed in separate thread
 function SaveScreenshot(screenshot: pointer): LongInt; cdecl; export;
 var f: file;
@@ -181,11 +202,12 @@
 SaveScreenshot:= 0;
 end;
 
-{$ENDIF} // no PNG_SCREENSHOTS
+{$ENDIF} // WINDOWS
+{$ENDIF} // PNG_SCREENSHOTS
 
 {$IFDEF USE_VIDEO_RECORDING}
 // make image k times smaller (useful for saving thumbnails)
-procedure ReduceImage(img: PByte; width, height, k: LongInt);
+procedure ReduceImage(img: PByteArray; width, height, k: LongInt);
 var i, j, i0, j0, w, h, r, g, b: LongInt;
 begin
     w:= width  div k;
@@ -203,14 +225,14 @@
                 for i0:= 0 to k-1 do
                     for j0:= 0 to k-1 do
                     begin
-                        inc(r, img[4*(width*(i*k+i0) + j*k+j0)+0]);
-                        inc(g, img[4*(width*(i*k+i0) + j*k+j0)+1]);
-                        inc(b, img[4*(width*(i*k+i0) + j*k+j0)+2]);
+                        inc(r, img^[4*(width*(i*k+i0) + j*k + j0)+0]);
+                        inc(g, img^[4*(width*(i*k+i0) + j*k + j0)+1]);
+                        inc(b, img^[4*(width*(i*k+i0) + j*k + j0)+2]);
                     end;
-                img[4*(w*i + j)+0]:= r div (k*k);
-                img[4*(w*i + j)+1]:= g div (k*k);
-                img[4*(w*i + j)+2]:= b div (k*k);
-                img[4*(w*i + j)+3]:= 255;
+                img^[4*(w*i + j)+0]:= r div (k*k);
+                img^[4*(w*i + j)+1]:= g div (k*k);
+                img^[4*(w*i + j)+2]:= b div (k*k);
+                img^[4*(w*i + j)+3]:= 255;
             end;
     end;
 end;
@@ -230,9 +252,14 @@
 format:= GL_RGBA;
 ext:= '.png';
 {$ELSE}
+{$IFDEF WINDOWS}
+format:= GL_RGBA;
+ext:= '.png';
+{$ELSE}
 format:= GL_BGRA;
 ext:= '.bmp';
 {$ENDIF}
+{$ENDIF}
 
 if dump > 0 then
      size:= LAND_WIDTH*LAND_HEIGHT*4
--- a/hedgewars/uPhysFSLayer.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uPhysFSLayer.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -35,6 +35,7 @@
 procedure pfsReadLn(f: PFSFile; var s: shortstring);
 procedure pfsReadLnA(f: PFSFile; var s: ansistring);
 procedure pfsWriteLn(f: PFSFile; s: shortstring);
+procedure pfsWriteRaw(f: PFSFile; s: PChar; len: QWord);
 function pfsBlockRead(f: PFSFile; buf: pointer; size: Int64): Int64;
 function pfsEOF(f: PFSFile): boolean;
 
@@ -46,7 +47,7 @@
 procedure hedgewarsMountPackage(filename: PChar); cdecl; external PhyslayerLibName;
 
 implementation
-uses uConsts, uUtils, uVariables{$IFNDEF PAS2C}{$IFDEF HWLIBRARY}, sysutils{$ENDIF}{$ELSE}, physfs{$ENDIF};
+uses uConsts, uUtils, uVariables{$IFNDEF PAS2C}{$IFDEF HWLIBRARY}, SysUtils{$ENDIF}{$ELSE}, physfs{$ENDIF};
 
 function PHYSFSRWOPS_openRead(fname: PChar): PSDL_RWops; cdecl; external PhyslayerLibName;
 function PHYSFSRWOPS_openWrite(fname: PChar): PSDL_RWops; cdecl; external PhyslayerLibName;
@@ -179,6 +180,11 @@
     PHYSFS_writeBytes(f, @c, 1);
 end;
 
+procedure pfsWriteRaw(f: PFSFile; s: PChar; len: QWord);
+begin
+    PHYSFS_writeBytes(f, s, len);
+end;
+
 function pfsBlockRead(f: PFSFile; buf: pointer; size: Int64): Int64;
 var r: Int64;
 begin
--- a/hedgewars/uRender.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uRender.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -34,6 +34,7 @@
 procedure DrawSpriteClipped     (Sprite: TSprite; X, Y, TopY, RightX, BottomY, LeftX: LongInt);
 procedure DrawSpriteRotated     (Sprite: TSprite; X, Y, Dir: LongInt; Angle: real);
 procedure DrawSpriteRotatedF    (Sprite: TSprite; X, Y, Frame, Dir: LongInt; Angle: real);
+procedure DrawSpriteRotatedFReal(Sprite: TSprite; X, Y: Real; Frame, Dir: LongInt; Angle: real);
 procedure DrawSpritePivotedF(Sprite: TSprite; X, Y, Frame, Dir, PivotX, PivotY: LongInt; Angle: real);
 
 procedure DrawTexture           (X, Y: LongInt; Texture: PTexture); inline;
@@ -67,7 +68,7 @@
 procedure RenderClear           (mode: TRenderMode);
 {$ENDIF}
 procedure RenderSetClearColor   (r, g, b, a: real);
-procedure Tint                  (r, g, b, a: Byte); inline;
+procedure Tint                  (r, g, b, a: Byte);
 procedure Tint                  (c: Longword); inline;
 procedure untint(); inline;
 procedure setTintAdd            (enable: boolean); inline;
@@ -1152,7 +1153,7 @@
 
 if Angle <> 0  then
     begin
-    // Check the bounding circle 
+    // Check the bounding circle
     if isCircleOffscreen(X, Y, (sqr(SpritesData[Sprite].Width) + sqr(SpritesData[Sprite].Height)) div 4) then
         exit;
     end
@@ -1186,6 +1187,45 @@
 
 end;
 
+procedure DrawSpriteRotatedFReal(Sprite: TSprite; X, Y: Real; Frame, Dir: LongInt; Angle: real);
+begin
+
+    if Angle <> 0  then
+    begin
+        // Check the bounding circle
+        if isCircleOffscreen(round(X), round(Y), (sqr(SpritesData[Sprite].Width) + sqr(SpritesData[Sprite].Height)) div 4) then
+            exit;
+    end
+    else
+    begin
+        if isDxAreaOffscreen(round(X) - SpritesData[Sprite].Width div 2, SpritesData[Sprite].Width) <> 0 then
+            exit;
+        if isDYAreaOffscreen(round(Y) - SpritesData[Sprite].Height div 2 , SpritesData[Sprite].Height) <> 0 then
+            exit;
+    end;
+
+
+    openglPushMatrix;
+    openglTranslatef(X, Y, 0);
+
+// mirror
+    if Dir < 0 then
+        openglScalef(-1.0, 1.0, 1.0);
+
+// apply angle after (conditional) mirroring
+    if Angle <> 0  then
+        openglRotatef(Angle, 0, 0, 1);
+
+    UpdateModelviewProjection;
+
+    DrawSprite(Sprite, -SpritesData[Sprite].Width div 2, -SpritesData[Sprite].Height div 2, Frame);
+
+    openglPopMatrix;
+
+    UpdateModelviewProjection;
+
+end;
+
 procedure DrawSpritePivotedF(Sprite: TSprite; X, Y, Frame, Dir, PivotX, PivotY: LongInt; Angle: real);
 begin
 if Angle <> 0  then
@@ -1218,6 +1258,8 @@
     openglTranslatef(-PivotX, -PivotY, 0);
     end;
 
+UpdateModelviewProjection;
+
 DrawSprite(Sprite, -SpritesData[Sprite].Width div 2, -SpritesData[Sprite].Height div 2, Frame);
 
 openglPopMatrix;
@@ -2044,7 +2086,7 @@
     {$ENDIF}
 end;
 
-procedure Tint(r, g, b, a: Byte); inline;
+procedure Tint(r, g, b, a: Byte);
 var
     nc, tw: Longword;
 begin
--- a/hedgewars/uRenderUtils.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uRenderUtils.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -38,6 +38,8 @@
 function  RenderStringTexLim(s: ansistring; Color: Longword; font: THWFont; maxLength: LongWord): PTexture;
 function  RenderSpeechBubbleTex(s: ansistring; SpeechType: Longword; font: THWFont): PTexture;
 
+function IsTooDarkToRead(TextColor: Longword): boolean; inline;
+
 implementation
 uses uVariables, uConsts, uTextures, SysUtils, uUtils, uDebug;
 
@@ -46,7 +48,7 @@
 begin
     r:= rect^;
     if Clear then
-        SDL_FillRect(Surface, @r, SDL_MapRGB(Surface^.format, 0, 0, 0));
+        SDL_FillRect(Surface, @r, SDL_MapRGBA(Surface^.format, 0, 0, 0, 0));
 
     BorderColor:= SDL_MapRGB(Surface^.format, BorderColor shr 16, BorderColor shr 8, BorderColor and $FF);
     FillColor:= SDL_MapRGB(Surface^.format, FillColor shr 16, FillColor shr 8, FillColor and $FF);
@@ -76,11 +78,20 @@
     WriteInRoundRect:= WriteInRoundRect(Surface, X, Y, Color, Font, s, 0);
 end;*)
 
+function IsTooDarkToRead(TextColor: LongWord): boolean; inline;
+var clr: TSDL_Color;
+begin
+    clr.r:= (TextColor shr 16) and $FF;
+    clr.g:= (TextColor shr 8) and $FF;
+    clr.b:= TextColor and $FF;
+    IsTooDarkToRead:= not ((clr.r >= cInvertTextColorAt) or (clr.g >= cInvertTextColorAt) or (clr.b >= cInvertTextColorAt));
+end;
+
 function WriteInRoundRect(Surface: PSDL_Surface; X, Y: LongInt; Color: LongWord; Font: THWFont; s: ansistring; maxLength: LongWord): TSDL_Rect;
 var w, h: Longword;
     tmpsurf: PSDL_Surface;
+    finalRect, textRect: TSDL_Rect;
     clr: TSDL_Color;
-    finalRect, textRect: TSDL_Rect;
 begin
     TTF_SizeUTF8(Fontz[Font].Handle, PChar(s), @w, @h);
     if (maxLength > 0) and (w > maxLength * HDPIScaleFactor) then w := maxLength * HDPIScaleFactor;
@@ -92,10 +103,14 @@
     textRect.y:= Y;
     textRect.w:= w;
     textRect.h:= h;
-    DrawRoundRect(@finalRect, cWhiteColor, cNearBlackColor, Surface, true);
     clr.r:= (Color shr 16) and $FF;
     clr.g:= (Color shr 8) and $FF;
     clr.b:= Color and $FF;
+    clr.a:= $FF;
+    if (not IsTooDarkToRead(Color)) then
+        DrawRoundRect(@finalRect, cWhiteColor, cNearBlackColor, Surface, true)
+    else
+        DrawRoundRect(@finalRect, cNearBlackColor, cWhiteColor, Surface, true);
     tmpsurf:= TTF_RenderUTF8_Blended(Fontz[Font].Handle, PChar(s), clr);
     finalRect.x:= X + cFontBorder + cFontPadding;
     finalRect.y:= Y + cFontBorder;
@@ -399,7 +414,7 @@
     finalSurface, tmpsurf, rotatedEdge: PSDL_Surface;
     rect: TSDL_Rect;
     {$IFNDEF PAS2C}
-    chars: set of char = [#9,' ',';',':','?','!',','];
+    breakChars: set of char = [#9,' ','-'];
     {$ENDIF}
     substr: ansistring;
     edge, corner, tail: TSPrite;
@@ -449,7 +464,7 @@
         w:= 0;
         i:= round(Sqrt(length(s)) * 2);
         {$IFNDEF PAS2C}
-        s:= WrapText(s, #1, chars, i);
+        s:= WrapText(s, #1, breakChars, i);
         {$ENDIF}
         pos:= 1; line:= 0;
     // Find the longest line for the purposes of centring the text.  Font dependant.
--- a/hedgewars/uScript.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uScript.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -109,7 +109,7 @@
 procedure ScriptPrepareAmmoStore; forward;
 procedure ScriptApplyAmmoStore; forward;
 procedure ScriptSetAmmo(ammo : TAmmoType; count, probability, delay, reinforcement: Byte); forward;
-procedure ScriptSetAmmoDelay(ammo : TAmmoType; delay: Byte); forward;
+procedure ScriptSetAmmoDelay(ammo : TAmmoType; delay: LongWord); forward;
 
 var LuaDebugInfo: lua_Debug;
 
@@ -686,11 +686,20 @@
 
 function lc_spawnfakehealthcrate(L: Plua_State) : LongInt; Cdecl;
 var gear: PGear;
-begin
-    if CheckLuaParamCount(L, 4,'SpawnFakeHealthCrate', 'x, y, explode, poison') then
+    explode, poison: boolean;
+    n: LongInt;
+begin
+    if CheckAndFetchParamCountRange(L, 2, 4, 'SpawnFakeHealthCrate', 'x, y [, explode [, poison]]', n) then
         begin
+        explode:= false;
+        poison:= false;
+        if (n >= 3) and (not lua_isnil(L, 3)) then
+            explode:= lua_toboolean(L, 3);
+        if (n = 4) and (not lua_isnil(L, 4)) then
+            poison:= lua_toboolean(L, 4);
+
         gear := SpawnFakeCrateAt(Trunc(lua_tonumber(L, 1)), Trunc(lua_tonumber(L, 2)),
-        HealthCrate, lua_toboolean(L, 3), lua_toboolean(L, 4));
+        HealthCrate, explode, poison);
         if gear <> nil then
              lua_pushnumber(L, gear^.uid)
         else lua_pushnil(L)
@@ -702,11 +711,20 @@
 
 function lc_spawnfakeammocrate(L: PLua_State): LongInt; Cdecl;
 var gear: PGear;
-begin
-    if CheckLuaParamCount(L, 4,'SpawnFakeAmmoCrate', 'x, y, explode, poison') then
+    explode, poison: boolean;
+    n: LongInt;
+begin
+    if CheckAndFetchParamCountRange(L, 2, 4, 'SpawnFakeAmmoCrate', 'x, y [, explode [, poison]]', n) then
         begin
+        explode:= false;
+        poison:= false;
+        if (n >= 3) and (not lua_isnil(L, 3)) then
+            explode:= lua_toboolean(L, 3);
+        if (n = 4) and (not lua_isnil(L, 4)) then
+            poison:= lua_toboolean(L, 4);
+
         gear := SpawnFakeCrateAt(Trunc(lua_tonumber(L, 1)), Trunc(lua_tonumber(L, 2)),
-        AmmoCrate, lua_toboolean(L, 3), lua_toboolean(L, 4));
+        AmmoCrate, explode, poison);
         if gear <> nil then
              lua_pushnumber(L, gear^.uid)
         else lua_pushnil(L)
@@ -718,11 +736,20 @@
 
 function lc_spawnfakeutilitycrate(L: PLua_State): LongInt; Cdecl;
 var gear: PGear;
-begin
-    if CheckLuaParamCount(L, 4,'SpawnFakeUtilityCrate', 'x, y, explode, poison') then
+    explode, poison: boolean;
+    n: LongInt;
+begin
+    if CheckAndFetchParamCountRange(L, 2, 4, 'SpawnFakeUtilityCrate', 'x, y [, explode [, poison]]', n) then
         begin
+        explode:= false;
+        poison:= false;
+        if (n >= 3) and (not lua_isnil(L, 3)) then
+            explode:= lua_toboolean(L, 3);
+        if (n = 4) and (not lua_isnil(L, 4)) then
+            poison:= lua_toboolean(L, 4);
+
         gear := SpawnFakeCrateAt(Trunc(lua_tonumber(L, 1)), Trunc(lua_tonumber(L, 2)),
-        UtilityCrate, lua_toboolean(L, 3), lua_toboolean(L, 4));
+        UtilityCrate, explode, poison);
         if gear <> nil then
              lua_pushnumber(L, gear^.uid)
         else lua_pushnil(L)
@@ -1331,15 +1358,31 @@
 function lc_setclancolor(L : Plua_State) : LongInt; Cdecl;
 var clan : PClan;
     team : PTeam;
-    hh   : THedgehog;
+    hh  : THedgehog;
     i, j : LongInt;
+    colorArg: Int64;
+    color: LongWord;
 begin
     if CheckLuaParamCount(L, 2, 'SetClanColor', 'clan, color') then
         begin
         i:= Trunc(lua_tonumber(L,1));
         if i >= ClansCount then exit(0);
         clan := ClansArray[i];
-        clan^.Color:= Trunc(lua_tonumber(L, 2)) shr 8;
+        colorArg:= Trunc(lua_tonumber(L, 2));
+        if (colorArg < 0) and (abs(colorArg) <= cClanColors) then
+            // Pick clan color from settings (recommended)
+            color:= ClanColorArray[Pred(abs(colorArg))]
+        else if (colorArg >= 0) and (colorArg <= $ffffffff) then
+            // Specify color directly
+            color:= colorArg shr 8
+        else
+            begin
+            OutError('Lua error: SetClanColor: Invalid ''color'' argument, must be between '+IntToStr(-cClanColors)+' and 0xffffffff!', true);
+            lc_setclancolor:= 0;
+            exit;
+            end;
+
+        clan^.Color:= color;
 
         for i:= 0 to Pred(clan^.TeamsNumber) do
             begin
@@ -1352,6 +1395,7 @@
                     FreeAndNilTexture(hh.NameTagTex);
                     hh.NameTagTex:= RenderStringTex(ansistring(hh.Name), clan^.Color, fnt16);
                     RenderHealth(hh);
+                    team^.Hedgehogs[j]:= hh;
                     end;
                 end;
             FreeAndNilTexture(team^.NameTagTex);
@@ -1431,6 +1475,28 @@
     lc_gethogfort:= 1
 end;
 
+function lc_ishogalive(L : Plua_State) : LongInt; Cdecl;
+var gear : PGear;
+begin
+    if CheckLuaParamCount(L, 1, 'IsHogAlive', 'gearUid') then
+        begin
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
+        if gear <> nil then
+            if gear^.Kind = gtHedgehog then
+                if (gear^.Health > 0) and (gear^.Health > gear^.Damage) and ((gear^.State and (gstDrowning or gstHHDeath)) = 0) and ((gear^.Message and gmDestroy) = 0) then
+                    lua_pushboolean(L, true)
+                else
+                    lua_pushboolean(L, false)
+            else
+                lua_pushboolean(L, false)
+        else
+            lua_pushboolean(L, false);
+        end
+    else
+        lua_pushnil(L); // return value on stack (nil)
+    lc_ishogalive:= 1
+end;
+
 function lc_ishoglocal(L : Plua_State) : LongInt; Cdecl;
 var gear : PGear;
 begin
@@ -1680,6 +1746,7 @@
 // should we allow this when there is no current hedgehog? might do some odd(er) things to turn sequence.
         if (gear <> nil) and (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) and (CurrentHedgehog <> nil) then
             begin
+            CurrentHedgehog^.MultiShootAttacks:= 0;
             prevgear := CurrentHedgehog^.Gear;
             if prevgear <> nil then
                 begin
@@ -1821,9 +1888,9 @@
                     gear^.Health:= 0;
                 RenderHealth(gear^.Hedgehog^);
                 RecountTeamHealth(gear^.Hedgehog^.Team)
-                end;
-            // Why did this do a "setalltoactive" ?
-            //SetAllToActive;
+                end
+            else if (gear^.RenderHealth) and (gear^.Tex <> nil) then
+                FreeAndNilTexture(gear^.Tex);
             Gear^.Active:= true;
             AllInactive:= false
             end
@@ -1863,7 +1930,12 @@
     if CheckLuaParamCount(L, 2, 'SetTimer', 'gearUid, timer') then
         begin
         gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
-        if gear <> nil then gear^.Timer:= Trunc(lua_tonumber(L, 2))
+        if gear <> nil then
+            begin
+            gear^.Timer:= Trunc(lua_tonumber(L, 2));
+            if gear^.RenderTimer and (gear^.Tex <> nil) then
+                FreeAndNilTexture(gear^.Tex);
+            end;
         end;
     lc_settimer:= 0
 end;
@@ -1988,6 +2060,7 @@
 function lc_endgame(L : Plua_State) : LongInt; Cdecl;
 begin
     L:= L; // avoid compiler hint
+    GameOver:= true;
     AddGear(0, 0, gtATFinishGame, 0, _0, _0, 3000);
     lc_endgame:= 0
 end;
@@ -2263,7 +2336,9 @@
         else
             begin
             OutError('Lua error: AddTeam: Invalid ''color'' argument, must be between '+IntToStr(-cClanColors)+' and 0xffffffff!', true);
-            lc_addteam:= 0;
+            lua_pushnil(L);
+            lua_pushnil(L);
+            lc_addteam:= 2;
             exit;
             end;
         ParseCommand('addteam x ' + colorStr + ' ' + lua_tostring(L, 1), true, true);
@@ -2271,13 +2346,70 @@
         ParseCommand('fort ' + lua_tostring(L, 4), true, true);
         ParseCommand('voicepack ' + lua_tostring(L, 5), true, true);
         if (np = 6) then ParseCommand('flag ' + lua_tostring(L, 6), true, true);
-        CurrentTeam^.Binds:= DefaultBinds
-        // fails on x64
-        //lua_pushnumber(L, LongInt(CurrentTeam));
+        // If there's a mission team, copy it's control scheme.
+        // So in singleplayer missions, all teams use the player team's controls.
+        if MissionTeam <> nil then
+            CurrentTeam^.Binds:= MissionTeam^.Binds
+        // Default keys otherwise
+        else
+            CurrentTeam^.Binds:= DefaultBinds;
+        // push team name and index
+        lua_pushstring(L, str2pchar(CurrentTeam^.TeamName));
+        lua_pushnumber(L, TeamsCount - 1);
+        end
+    else
+        begin
+        lua_pushnil(L);
+        lua_pushnil(L);
         end;
-    //else
-        //lua_pushnil(L)
-    lc_addteam:= 0;//1;
+    lc_addteam:= 2;
+end;
+
+function lc_addmissionteam(L : Plua_State) : LongInt; Cdecl;
+var colorArg: Int64;
+    colorStr: shortstring;
+begin
+    if CheckLuaParamCount(L, 1, 'AddMissionTeam', 'color') then
+        begin
+        if(MissionTeam = nil) then
+            begin
+            OutError('Lua error: AddMissionTeam: Could not add team. Note: This function only works in singleplayer missions!', true);
+            lc_addmissionteam:= 0;
+            exit;
+            end;
+
+        colorArg:= Trunc(lua_tonumber(L, 1));
+        if (colorArg < 0) and (abs(colorArg) <= cClanColors) then
+            // Pick clan color from settings (recommended)
+            colorStr:= IntToStr(ClanColorArray[Pred(abs(colorArg))])
+        else if (colorArg >= 0) and (colorArg <= $ffffffff) then
+            // Specify color directly
+            colorStr:= IntToStr(colorArg)
+        else
+            begin
+            OutError('Lua error: AddMissionTeam: Invalid ''color'' argument, must be between '+IntToStr(-cClanColors)+' and 0xffffffff!', true);
+            lua_pushnil(L);
+            lua_pushnil(L);
+            lc_addmissionteam:= 2;
+            exit;
+            end;
+
+        ParseCommand('addteam x ' + colorStr + ' ' + MissionTeam^.TeamName, true, true);
+        ParseCommand('grave ' + MissionTeam^.GraveName, true, true);
+        ParseCommand('fort ' + MissionTeam^.FortName, true, true);
+        ParseCommand('voicepack ' + MissionTeam^.Voicepack^.name, true, true);
+        ParseCommand('flag ' + MissionTeam^.Flag, true, true);
+        CurrentTeam^.Binds:= MissionTeam^.Binds;
+        // push real team name and team index
+        lua_pushstring(L, str2pchar(CurrentTeam^.TeamName));
+        lua_pushnumber(L, TeamsCount - 1);
+        end
+    else
+        begin
+        lua_pushnil(L);
+        lua_pushnil(L);
+        end;
+    lc_addmissionteam:= 2;
 end;
 
 function lc_setteamlabel(L : Plua_State) : LongInt; Cdecl;
@@ -2323,6 +2455,46 @@
     lc_setteamlabel:= 1;
 end;
 
+function lc_setteampassive(L : Plua_State) : LongInt; Cdecl;
+var i, j: LongInt;
+    success, passive, passiveClan: boolean;
+begin
+	success:= false;
+    if CheckLuaParamCount(L, 2, 'SetTeamPassive', 'teamname, isPassive') then
+        begin
+        success:= false;
+        // fetch team
+        if TeamsCount > 0 then
+            for i:= 0 to Pred(TeamsCount) do
+                if TeamsArray[i]^.TeamName = lua_tostring(L, 1) then
+                    begin
+                    passive:= lua_toboolean(L, 2);
+                    TeamsArray[i]^.Passive:= passive;
+                    // also update clan state
+                    if passive then
+                        begin
+                        passiveClan:= true;
+                        for j:= 0 to Pred(TeamsCount) do
+                            if (not TeamsArray[j]^.Passive) then
+                                begin
+                                passiveClan:= false;
+                                break;
+                                end;
+                        end
+                    else
+                        passiveClan:= false;
+                    TeamsArray[i]^.Clan^.Passive:= passiveClan;
+
+                    success:= true;
+                    // don't change more than one team
+                    break;
+                    end;
+        end;
+    // return true if operation was successful, false otherwise
+    lua_pushboolean(L, success);
+    lc_setteampassive:= 1;
+end;
+
 function lc_getteamname(L : Plua_State) : LongInt; Cdecl;
 var t: LongInt;
 begin
@@ -2415,6 +2587,8 @@
                             AddVisualGear(hwRound(HHGear^.X) - 16 + Random(32), hwRound(HHGear^.Y) - 16 + Random(32), vgtSmokeWhite);
                             end;
                         HHGear^.Message:= HHGear^.Message or gmDestroy;
+                        HHGear^.Active:= true;
+                        AllInactive:= false;
                         end;
                     end;
                 // can't dismiss more than one team
@@ -2472,20 +2646,51 @@
 
 
 function lc_addhog(L : Plua_State) : LongInt; Cdecl;
-var temp: ShortString;
+var hatName: ShortString;
 begin
     if CheckLuaParamCount(L, 4, 'AddHog', 'hogname, botlevel, health, hat') then
         begin
-        temp:= lua_tostring(L, 4);
+        hatName:= lua_tostring(L, 4);
         ParseCommand('addhh ' + lua_tostring(L, 2) + ' ' + lua_tostring(L, 3) + ' ' + lua_tostring(L, 1), true, true);
-        ParseCommand('hat ' + temp, true, true);
-        lua_pushnumber(L, CurrentHedgehog^.Gear^.uid);
+        ParseCommand('hat ' + hatName, true, true);
+        if (CurrentHedgehog <> nil) and (CurrentHedgehog^.Gear <> nil) then
+            lua_pushnumber(L, CurrentHedgehog^.Gear^.uid)
+        else
+            OutError('Lua error: AddHog: Error adding hog. Maybe function was called outside of onGameInit.', true);
         end
     else
         lua_pushnil(L);
     lc_addhog:= 1;
 end;
 
+function lc_addmissionhog(L : Plua_State) : LongInt; Cdecl;
+var hatName: ShortString;
+begin
+    if CheckLuaParamCount(L, 1, 'AddMissionHog', 'health') then
+        begin
+        if(MissionTeam = nil) then
+            begin
+            OutError('Lua error: AddMissionHog: Could not add hog. Mission team is not set!', true);
+            lua_pushnil(L);
+            lc_addmissionhog:= 1;
+            exit;
+            end;
+        with MissionTeam^.Hedgehogs[CurrentTeam^.HedgehogsNumber] do
+            begin
+            hatName:= Hat;
+            ParseCommand('addhh ' + IntToStr(BotLevel) + ' ' + lua_tostring(L, 1) + ' ' + Name, true, true);
+            ParseCommand('hat ' + hatName, true, true);
+            end;
+        if (CurrentHedgehog <> nil) and (CurrentHedgehog^.Gear <> nil) then
+            lua_pushnumber(L, CurrentHedgehog^.Gear^.uid)
+        else
+            OutError('Lua error: AddMissionHog: Error adding hog. Maybe function was called outside of onGameInit.', true);
+        end
+    else
+        lua_pushnil(L);
+    lc_addmissionhog:= 1;
+end;
+
 function lc_hogturnleft(L : Plua_State) : LongInt; Cdecl;
 var gear: PGear;
 begin
@@ -2706,7 +2911,7 @@
 
 
 function lc_setammodelay(L : Plua_State) : LongInt; Cdecl;
-var at: LongInt;
+var at, delay: LongInt;
 const
     call = 'SetAmmoDelay';
     params = 'ammoType, delay';
@@ -2714,12 +2919,31 @@
     if CheckLuaParamCount(L, 2, call, params) then
         begin
         at:= LuaToAmmoTypeOrd(L, 1, call, params);
-        if at >= 0 then
-            ScriptSetAmmoDelay(TAmmoType(at), Trunc(lua_tonumber(L, 2)));
+        delay:= Trunc(lua_tonumber(L, 2));
+        if (at >= 0) and (TAmmoType(at) <> amNothing) then
+            begin
+            ScriptSetAmmoDelay(TAmmoType(at), delay);
+            // Unselect weapon if neccessary
+            if (delay > 0) and (CurrentHedgehog <> nil) and (CurrentHedgehog^.CurAmmoType = TAmmoType(at)) then
+                ParseCommand('setweap ' + char(0), true, true);
+            end;
         end;
     lc_setammodelay:= 0
 end;
 
+function lc_setammoslot(L : Plua_State) : LongInt; Cdecl;
+var at, slot: LongInt;
+begin
+    if CheckLuaParamCount(L, 2, 'SetAmmoSlot', 'ammoType, slot') then
+        begin
+        at:= Trunc(lua_tonumber(L, 1));
+        slot:= Trunc(lua_tonumber(L, 2));
+        Ammoz[TAmmoType(at)].Slot:= slot - 1;
+        AmmoMenuInvalidated:= true;
+        end;
+    lc_setammoslot:= 0;
+end;
+
 function lc_getrandom(L : Plua_State) : LongInt; Cdecl;
 var m : LongInt;
 begin
@@ -2980,6 +3204,21 @@
     lc_getcampaignvar := 1;
 end;
 
+function lc_savemissionvar(L : Plua_State): LongInt; Cdecl;
+begin
+    if CheckLuaParamCount(L, 2, 'SaveMissionVar', 'varname, value') then
+        SendIPC('v!' + lua_tostring(L, 1) + ' ' + lua_tostring(L, 2) + #0);
+    lc_savemissionvar := 0;
+end;
+
+function lc_getmissionvar(L : Plua_State): LongInt; Cdecl;
+begin
+    if CheckLuaParamCount(L, 1, 'GetMissionVar', 'varname') then
+        SendIPCAndWaitReply('v?' + lua_tostring(L, 1) + #0);
+    lua_pushstring(L, str2pchar(MissionVariable));
+    lc_getmissionvar := 1;
+end;
+
 function lc_hidehog(L: Plua_State): LongInt; Cdecl;
 var gear: PGear;
 begin
@@ -3276,6 +3515,22 @@
     lc_setreadytimeleft:= 0;
 end;
 
+function lc_setturntimepaused(L : Plua_State) : LongInt; Cdecl;
+begin
+    if CheckLuaParamCount(L, 1, 'SetTurnTimePaused', 'isPaused') then
+        LuaClockPaused:= lua_toboolean(L, 1);
+    lc_setturntimepaused:= 0;
+end;
+
+function lc_getturntimepaused(L : Plua_State) : LongInt; Cdecl;
+begin
+    if CheckLuaParamCount(L, 0, 'GetTurnTimePaused', '') then
+        lua_pushboolean(L, LuaClockPaused)
+    else
+        lua_pushnil(L);
+    lc_getturntimepaused:= 1;
+end;
+
 function lc_startghostpoints(L : Plua_State) : LongInt; Cdecl;
 begin
     if CheckLuaParamCount(L, 1, 'StartGhostPoints', 'count') then
@@ -3405,6 +3660,12 @@
     lua_setglobal(luaState, Str2PChar(name));
 end;
 
+procedure ScriptSetLongWord(name : shortstring; value : LongWord);
+begin
+    lua_pushnumber(luaState, value);
+    lua_setglobal(luaState, Str2PChar(name));
+end;
+
 procedure ScriptSetString(name : shortstring; value : shortstring);
 begin
     lua_pushstring(luaState, Str2PChar(value));
@@ -3478,6 +3739,7 @@
 ScriptSetInteger('MaxCaseDrops', cMaxCaseDrops);
 ScriptSetInteger('HealthCaseProb', cHealthCaseProb);
 ScriptSetInteger('HealthCaseAmount', cHealthCaseAmount);
+ScriptSetInteger('InitHealth', cInitHealth);
 ScriptSetInteger('DamagePercent', cDamagePercent);
 ScriptSetInteger('RopePercent', cRopePercent);
 ScriptSetInteger('MinesNum', cLandMines);
@@ -3511,6 +3773,7 @@
 cMaxCaseDrops    := ScriptGetInteger('MaxCaseDrops');
 cHealthCaseProb  := ScriptGetInteger('HealthCaseProb');
 cHealthCaseAmount:= ScriptGetInteger('HealthCaseAmount');
+cInitHealth      := ScriptGetInteger('InitHealth');
 cDamagePercent   := ScriptGetInteger('DamagePercent');
 cRopePercent     := ScriptGetInteger('RopePercent');
 cLandMines       := ScriptGetInteger('MinesNum');
@@ -3911,17 +4174,22 @@
 ScriptAmmoReinforcement[ord(ammo)]:= inttostr(reinforcement)[1];
 end;
 
-procedure ScriptSetAmmoDelay(ammo : TAmmoType; delay: Byte);
+procedure ScriptSetAmmoDelay(ammo : TAmmoType; delay: LongWord);
 begin
 // change loadout string if ammo store has not been initialized yet
 if (StoreCnt = 0) then
-begin
+    begin
     if (delay <= 9) then
         ScriptAmmoDelay[ord(ammo)]:= inttostr(delay)[1];
-end
+    end
 // change 'live' delay values
 else if (CurrentTeam <> nil) then
-        ammoz[ammo].SkipTurns:= CurrentTeam^.Clan^.TurnNumber + delay;
+    begin
+    ammoz[ammo].SkipTurns:= CurrentTeam^.Clan^.TurnNumber + delay;
+    if ammoz[ammo].SkipTurns > 0 then
+        dec(ammoz[ammo].SkipTurns);
+    AmmoMenuInvalidated:= true;
+    end;
 end;
 
 procedure ScriptApplyAmmoStore;
@@ -4001,7 +4269,7 @@
 luaopen_table(luaState);
 
 // import some variables
-ScriptSetString(_S'LOCALE', cLocale);
+ScriptSetString(_S'LOCALE', cLanguage);
 
 {$IFDEF USE_TOUCH_INTERFACE}
 ScriptSetString(_S'INTERFACE', 'touch');
@@ -4107,8 +4375,8 @@
 for we:= Low(TWorldEdge) to High(TWorldEdge) do
     ScriptSetInteger(EnumToStr(we), ord(we));
 
-ScriptSetInteger('capcolDefault'    , capcolDefault);
-ScriptSetInteger('capcolSetting'    , capcolSetting);
+ScriptSetLongWord('capcolDefault'   , capcolDefaultLua);
+ScriptSetLongWord('capcolSetting'   , capcolSettingLua);
 
 ScriptSetInteger('gstDrowning'      , gstDrowning);
 ScriptSetInteger('gstHHDriven'      , gstHHDriven);
@@ -4165,6 +4433,8 @@
 lua_register(luaState, _P'IsHogHidden', @lc_ishoghidden);
 lua_register(luaState, _P'SaveCampaignVar', @lc_savecampaignvar);
 lua_register(luaState, _P'GetCampaignVar', @lc_getcampaignvar);
+lua_register(luaState, _P'SaveMissionVar', @lc_savemissionvar);
+lua_register(luaState, _P'GetMissionVar', @lc_getmissionvar);
 lua_register(luaState, _P'band', @lc_band);
 lua_register(luaState, _P'bor', @lc_bor);
 lua_register(luaState, _P'bnot', @lc_bnot);
@@ -4221,6 +4491,7 @@
 lua_register(luaState, _P'SetAmmo', @lc_setammo);
 lua_register(luaState, _P'GetAmmo', @lc_getammo);
 lua_register(luaState, _P'SetAmmoDelay', @lc_setammodelay);
+lua_register(luaState, _P'SetAmmoSlot', @lc_setammoslot);
 lua_register(luaState, _P'PlaySound', @lc_playsound);
 lua_register(luaState, _P'PlayMusicSound', @lc_playmusicsound);
 lua_register(luaState, _P'StopMusicSound', @lc_stopmusicsound);
@@ -4229,8 +4500,11 @@
 lua_register(luaState, _P'GetTeamIndex', @lc_getteamindex);
 lua_register(luaState, _P'GetTeamClan', @lc_getteamclan);
 lua_register(luaState, _P'AddTeam', @lc_addteam);
+lua_register(luaState, _P'AddMissionTeam', @lc_addmissionteam);
 lua_register(luaState, _P'SetTeamLabel', @lc_setteamlabel);
+lua_register(luaState, _P'SetTeamPassive', @lc_setteampassive);
 lua_register(luaState, _P'AddHog', @lc_addhog);
+lua_register(luaState, _P'AddMissionHog', @lc_addmissionhog);
 lua_register(luaState, _P'AddAmmo', @lc_addammo);
 lua_register(luaState, _P'GetAmmoCount', @lc_getammocount);
 lua_register(luaState, _P'HealHog', @lc_healhog);
@@ -4245,6 +4519,7 @@
 lua_register(luaState, _P'GetHogFlag', @lc_gethogflag);
 lua_register(luaState, _P'GetHogFort', @lc_gethogfort);
 lua_register(luaState, _P'GetHogGrave', @lc_gethoggrave);
+lua_register(luaState, _P'IsHogAlive', @lc_ishogalive);
 lua_register(luaState, _P'IsHogLocal', @lc_ishoglocal);
 lua_register(luaState, _P'GetHogTeamName', @lc_gethogteamname);
 lua_register(luaState, _P'SetHogTeamName', @lc_sethogteamname);
@@ -4310,6 +4585,8 @@
 lua_register(luaState, _P'Explode', @lc_explode);
 lua_register(luaState, _P'SetTurnTimeLeft', @lc_setturntimeleft);
 lua_register(luaState, _P'SetReadyTimeLeft', @lc_setreadytimeleft);
+lua_register(luaState, _P'SetTurnTimePaused', @lc_setturntimepaused);
+lua_register(luaState, _P'GetTurnTimePaused', @lc_getturntimepaused);
 // drawn map functions
 lua_register(luaState, _P'AddPoint', @lc_addPoint);
 lua_register(luaState, _P'FlushPoints', @lc_flushPoints);
--- a/hedgewars/uSound.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uSound.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -116,7 +116,7 @@
 // Modifies the sound volume of the game by voldelta and returns the new volume level.
 function  ChangeVolume(voldelta: LongInt): LongInt;
 
-// Returns the current volume in percent
+// Returns the current volume in percent. Intended for display on UI.
 function  GetVolumePercent(): LongInt;
 
 // Returns a pointer to the voicepack with the given name.
@@ -247,8 +247,8 @@
             (FileName:             'Droplet3.ogg'; Path: ptCurrTheme; AltPath: ptSounds),// sndDroplet3
             (FileName:                  'egg.ogg'; Path: ptSounds; AltPath: ptNone),// sndEggBreak
             (FileName:             'drillgun.ogg'; Path: ptSounds; AltPath: ptNone),// sndDrillRocket
-            (FileName:          'PoisonCough.ogg'; Path: ptVoices; AltPath: ptNone),// sndPoisonCough
-            (FileName:           'PoisonMoan.ogg'; Path: ptVoices; AltPath: ptNone),// sndPoisonMoan
+            (FileName:          'PoisonCough.ogg'; Path: ptVoices; AltPath: ptDefaultVoice),// sndPoisonCough
+            (FileName:           'PoisonMoan.ogg'; Path: ptVoices; AltPath: ptDefaultVoice),// sndPoisonMoan
             (FileName:             'BirdyLay.ogg'; Path: ptSounds; AltPath: ptNone),// sndBirdyLay
             (FileName:              'Whistle.ogg'; Path: ptSounds; AltPath: ptNone),// sndWhistle
             (FileName:             'beewater.ogg'; Path: ptSounds; AltPath: ptNone),// sndBeeWater
@@ -329,42 +329,51 @@
             (FileName:             'Cutitout.ogg'; Path: ptVoices; AltPath: ptNone),// sndCutItOut
             (FileName:         'Leavemealone.ogg'; Path: ptVoices; AltPath: ptNone),// sndLeaveMeAlone
             (FileName:                 'Ouch.ogg'; Path: ptVoices; AltPath: ptNone),// sndOuch
-            (FileName:                  'Hmm.ogg'; Path: ptVoices; AltPath: ptNone) // sndHmm
+            (FileName:                  'Hmm.ogg'; Path: ptVoices; AltPath: ptNone),// sndHmm
+            (FileName:                 'Kiss.ogg'; Path: ptSounds; AltPath: ptNone),// sndKiss
+            (FileName:              'Flyaway.ogg'; Path: ptVoices; AltPath: ptNone),// sndFlyAway
+            (FileName:           'planewater.ogg'; Path: ptSounds; AltPath: ptNone) // sndPlaneWater
             );
 
 
 function  AskForVoicepack(name: shortstring): Pointer;
 var i: Longword;
-    locName, path: shortstring;
+    tmp, nameStart, langName, path: shortstring;
 begin
+    nameStart:= name;
     i:= 0;
 
-    // Adjust voicepack name if there's a localised version version of the voice
-    if cLocale <> 'en' then
+    { Adjust for language suffix: Voicepacks can have an optional language suffix.
+    It's an underscore followed by an ISO 639-1 or ISO 639-2 language code.
+    The suffix “_qau” is special, it will enable automatic language selection
+    of this voicepack. For example, if team has set Default_qau as voicepack,
+    and the player language is Russian, the actual voicepack will be Default_ru,
+    provided it can be found on the disk.
+    “qau” is a valid ISO 639-2 language code reserved for local use. }
+    tmp:= Copy(name, Length(name) - 3, 4);
+    if (tmp = '_qau') then
+        name:= Copy(name, 1, Length(name) - 4);
+    if (cLanguage <> 'en') and (tmp = '_qau') then
         begin
-        locName:= name+'_'+cLocale;
-        path:= cPathz[ptVoices] + '/' + locName;
+        langName:= name+'_'+cLanguage;
+        path:= cPathz[ptVoices] + '/' + langName;
         if pfsExists(path) then
-            name:= locName
+            name:= langName
         else
-            if Length(cLocale) > 3 then
+            if Length(cLanguage) > 3 then
                 begin
-                locName:= name+'_'+Copy(cLocale,1,2);
-                path:= cPathz[ptVoices] + '/' + locName;
+                langName:= name+'_'+Copy(cLanguage,1,2);
+                path:= cPathz[ptVoices] + '/' + langName;
                 if pfsExists(path) then
-                    name:= locName
+                    name:= langName
                 end
         end;
 
     path:= cPathz[ptVoices] + '/' + name;
 
-    // Fallback to Default if voicepack can't be found at all
-    if (name <> 'Default') and (not pfsExists(path)) then
-        begin
-        path:= cPathz[ptVoices] + '/Default';
-        if pfsExists(path) then
-            exit(AskForVoicepack('Default'));
-        end;
+    // Fallback to localized Default if voicepack can't be found at all
+    if (nameStart <> 'Default_qau') and (not pfsExists(path)) then
+        exit(AskForVoicepack('Default_qau'));
 
     while (voicepacks[i].name <> name) and (voicepacks[i].name <> '') and (i < cMaxTeams) do
         begin
@@ -379,6 +388,7 @@
 procedure InitSound;
 const channels: LongInt = 2;
 var success: boolean;
+    s: shortstring;
 begin
     if not (isSoundEnabled or isMusicEnabled) then
         begin
@@ -408,7 +418,15 @@
     end;
 
     WriteToConsole('Init SDL_mixer... ');
-    if SDLCheck(Mix_Init(MIX_INIT_OGG) <> 0, 'Mix_Init', true) then exit;
+
+    if (Mix_Init(MIX_INIT_OGG or MIX_INIT_OPUS) and MIX_INIT_OPUS) = 0 then
+    begin
+      s:= SDL_GetError();
+      WriteToConsole('Cannot init OPUS: ' + s);
+
+      if SDLCheck(Mix_Init(MIX_INIT_OGG) <> 0, 'Mix_Init', true) then exit;
+    end;
+
     WriteLnToConsole(msgOK);
 
     // from uVariables to be used by other modules
@@ -490,11 +508,11 @@
             GetFallbackV := sndUhOh
     else if (snd in [sndDrat, sndBugger]) then
         GetFallbackV := sndStupid
-    else if (snd in [sndGonnaGetYou, sndCutItOut, sndLeaveMeAlone]) then
+    else if (snd in [sndGonnaGetYou, sndIllGetYou, sndJustYouWait, sndCutItOut, sndLeaveMeAlone]) then
         GetFallbackV := sndRegret
     else if (snd in [sndOhDear, sndSoLong]) then
         GetFallbackV := sndByeBye
-    else if (snd = sndWhatThe) then
+    else if (snd in [sndWhatThe, sndUhOh]) then
         GetFallbackV := sndNooo
     else if (snd = sndRunAway) then
         GetFallbackV := sndOops
@@ -502,14 +520,19 @@
         GetFallbackV := sndReinforce
     else if (snd in [sndAmazing, sndBrilliant, sndExcellent]) then
         GetFallbackV := sndEnemyDown
-    // Hmm is for enemy turn start
-    else if snd = sndHmm then
-        // these are not ideal fallbacks, but those were the voices which were used in older versions
-        // for enemy turn start
-        if random(2) = 0 then
-            GetFallbackV := sndIllGetYou
-        else
-            GetFallbackV := sndJustYouWait
+    else if (snd = sndPoisonCough) then
+        GetFallbackV := sndPoisonMoan
+    else if (snd = sndPoisonMoan) then
+        GetFallbackV := sndPoisonCough
+    else if (snd = sndFlawless) then
+        GetFallbackV := sndVictory
+    else if (snd = sndSameTeam) then
+        GetFallbackV := sndTraitor
+    else if (snd = sndMelon) then
+        GetFallbackV := sndCover
+    // sndHmm is used for enemy turn start, so sndHello is an "okay" replacement
+    else if (snd = sndHmm) then
+        GetFallbackV := sndHello
     else
         GetFallbackV := sndNone;
 end;
@@ -585,7 +608,7 @@
 
             if rwops = nil then
                 begin
-                s:= cPathz[Soundz[snd].AltPath] + '/' + voicepack^.name + '/' + Soundz[snd].FileName;
+                s:= cPathz[Soundz[snd].AltPath] + '/' + Soundz[snd].FileName;
                 WriteToConsole(msgLoading + s + ' ... ');
                 rwops := rwopsOpenRead(s);
                 end;
@@ -808,7 +831,10 @@
         exit;
 
     if (chn <> -1) and (Mix_Playing(chn) <> 0) then
-        Mix_FadeOutChannel(chn, fadems);
+        if isAudioMuted then
+            Mix_HaltChannel(chn)
+        else
+            Mix_FadeOutChannel(chn, fadems);
 end;
 
 procedure PlayMusic;
@@ -862,6 +888,12 @@
 function GetVolumePercent(): LongInt;
 begin
     GetVolumePercent:= Volume * 100 div MIX_MAX_VOLUME;
+    // 0 and 100 will only be displayed when at min/max values
+    // to avoid confusion.
+    if ((GetVolumePercent = 0) and (Volume > 0)) then
+        GetVolumePercent:= 1
+    else if ((GetVolumePercent = 100) and (Volume < MIX_MAX_VOLUME)) then
+        GetVolumePercent:= 99;
 end;
 
 function ChangeVolume(voldelta: LongInt): LongInt;
@@ -1001,12 +1033,14 @@
 
     MusicFN:='';
     SDMusicFN:= 'sdmusic.ogg';
+    FallbackMusicFN:='';
+    FallbackSDMusicFN:= 'sdmusic.ogg';
     Mus:= nil;
     isAudioMuted:= false;
     isSEBackup:= isSoundEnabled;
     Volume:= 0;
     SoundTimerTicks:= 0;
-    defVoicepack:= AskForVoicepack('Default');
+    defVoicepack:= AskForVoicepack('Default_qau');
     LastVoiceFailed:= false;
 
     for i:= Low(TSound) to High(TSound) do
--- a/hedgewars/uStats.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uStats.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -25,10 +25,12 @@
 var TotalRoundsPre: LongInt; // Helper variable for calculating start of Sudden Death and more. Starts at -1 and is incremented on the turn BEFORE the turn which marks the start of the next round. Always -1 while in hog placing phase
     TotalRoundsReal: LongInt; // Total number of rounds played (-1 if not started or in hog placing phase). Exported to Lua as 'TotalRounds'
     FinishedTurnsTotal: LongInt;
+    // Variables to disable certain portions of game stats (set by Lua)
     SendGameResultOn : boolean = true;
     SendRankingStatsOn : boolean = true;
     SendAchievementsStatsOn : boolean = true;
     SendHealthStatsOn : boolean = true;
+    // Clan death log, used for game stats
     ClanDeathLog : PClanDeathLogEntry;
 
 procedure initModule;
@@ -40,6 +42,7 @@
 procedure HedgehogDamaged(Gear: PGear; Attacker: PHedgehog; Damage: Longword; killed: boolean);
 procedure TargetHit;
 procedure Skipped;
+function  getIsTurnSkipped: boolean;
 procedure TurnStats;
 procedure TurnReaction;
 procedure TurnStatsReset;
@@ -52,26 +55,29 @@
 implementation
 uses uSound, uLocale, uVariables, uUtils, uIO, uCaptions, uMisc, uConsole, uScript;
 
-var DamageClan  : Longword = 0;
-    DamageTeam  : Longword = 0;
-    DamageTotal : Longword = 0;
-    DamageTurn  : Longword = 0;
-    PoisonTurn  : Longword = 0; // Poisoned enemies per turn
-    PoisonClan  : Longword = 0; // Poisoned own clan members in turn
-    PoisonTeam  : Longword = 0; // Poisoned own team members in turn
-    PoisonTotal : Longword = 0; // Poisoned hogs in whole round
-    KillsClan   : LongWord = 0;
-    KillsTeam   : LongWord = 0;
-    Kills       : LongWord = 0;
-    KillsTotal  : LongWord = 0;
-    HitTargets  : LongWord = 0; // Target (gtTarget) hits per turn
-    AmmoUsedCount : Longword = 0;
-    AmmoDamagingUsed : boolean = false;
-    LeaveMeAlone : boolean = false;
-    SkippedTurns: LongWord = 0;
-    isTurnSkipped: boolean = false;
-    vpHurtSameClan: PVoicepack = nil;
-    vpHurtEnemy: PVoicepack = nil;
+var DamageClan  : Longword = 0;         // Damage of own clan in turn
+    DamageTeam  : Longword = 0;         // Damage of own team in turn
+    DamageTotal : Longword = 0;         // Total damage dealt in game
+    DamageTurn  : Longword = 0;         // Damage in turn
+    PoisonTurn  : Longword = 0;         // Poisoned enemies in turn
+    PoisonClan  : Longword = 0;         // Poisoned own clan members in turn
+    PoisonTeam  : Longword = 0;         // Poisoned own team members in turn
+    PoisonTotal : Longword = 0;         // Poisoned hogs in whole round
+    KillsClan   : LongWord = 0;         // Own clan members killed in turn
+    KillsTeam   : LongWord = 0;         // Own team members killed in turn
+    KillsSD     : LongWord = 0;         // Killed hedgehogs in turn that died by Sudden Death water rise
+    Kills       : LongWord = 0;         // Killed hedgehogs in turn (including those that died by Sudden Death water rise)
+    KillsTotal  : LongWord = 0;         // Total killed hedgehogs in game
+    HitTargets  : LongWord = 0;         // Target (gtTarget) hits in turn
+    AmmoUsedCount : Longword = 0;       // Number of times an ammo has been used this turn
+    AmmoDamagingUsed : boolean = false; // true if damaging ammo was used in turn
+    FirstBlood  : boolean = false;      // true if the “First blood” taunt has been used in this game
+    StepFirstBlood : boolean = false;   // true if the “First blood” taunt is to be used this turn
+    LeaveMeAlone : boolean = false;     // true if the “Leave me alone” taunt is to be used this turn
+    SkippedTurns: LongWord = 0;         // number of skipped turns in game
+    isTurnSkipped: boolean = false;     // true if this turn was skipped
+    vpHurtSameClan: PVoicepack = nil;   // voicepack of current clan (used for taunts)
+    vpHurtEnemy: PVoicepack = nil;      // voicepack of enemy (used for taunts)
 
 procedure HedgehogPoisoned(Gear: PGear; Attacker: PHedgehog);
 begin
@@ -84,6 +90,8 @@
         end
     else
         begin
+        if not FirstBlood then
+            StepFirstBlood:= true;
         vpHurtEnemy:= Gear^.Hedgehog^.Team^.voicepack;
         inc(PoisonTurn)
         end;
@@ -102,11 +110,13 @@
     vpHurtSameClan:= Gear^.Hedgehog^.Team^.voicepack
 else
     begin
+    if not FirstBlood then
+        StepFirstBlood:= true;
     vpHurtEnemy:= Gear^.Hedgehog^.Team^.voicepack;
-    if (not killed) then
+    if (not killed) and (not bDuringWaterRise) then
         begin
         // Check if victim got attacked by RevengeHog again
-        if (Gear^.Hedgehog^.RevengeHog <> nil) and (Gear^.Hedgehog^.RevengeHog = Attacker) then
+        if (Gear^.Hedgehog^.RevengeHog <> nil) and (Gear^.Hedgehog^.RevengeHog = Attacker) and (Gear^.Hedgehog^.stats.StepRevenge = false) then
             LeaveMeAlone:= true;
         // Check if attacker got revenge
         if (Attacker^.RevengeHog <> nil) and (Attacker^.RevengeHog = Gear^.Hedgehog) then
@@ -118,14 +128,22 @@
             end
         // If not, victim remembers their attacker to plan *their* revenge
         else
+            begin
             Gear^.Hedgehog^.RevengeHog:= Attacker;
+            // To prevent "LeaveMeAlone" being activated if same hog is hit by attacker
+            // multiple times in the same turn.
+            Gear^.Hedgehog^.stats.StepRevenge:= true;
+            end;
         end
     end;
 
 //////////////////////////
 
-inc(Attacker^.stats.StepDamageGiven, Damage);
-inc(Gear^.Hedgehog^.stats.StepDamageRecv, Damage);
+if (not bDuringWaterRise) then
+    begin
+    inc(Attacker^.stats.StepDamageGiven, Damage);
+    inc(Gear^.Hedgehog^.stats.StepDamageRecv, Damage);
+    end;
 
 if CurrentHedgehog^.Team^.Clan = Gear^.Hedgehog^.Team^.Clan then inc(DamageClan, Damage);
 if CurrentHedgehog^.Team = Gear^.Hedgehog^.Team then inc(DamageTeam, Damage);
@@ -133,22 +151,29 @@
 if killed then
     begin
     Gear^.Hedgehog^.stats.StepDied:= true;
-    inc(Attacker^.stats.StepKills);
     inc(Kills);
+
     inc(KillsTotal);
-    inc(Attacker^.Team^.stats.Kills);
-    if (Attacker^.Team^.TeamName = Gear^.Hedgehog^.Team^.TeamName) then
+
+    if bDuringWaterRise then
+        inc(KillsSD)
+    else
         begin
-        inc(Attacker^.Team^.stats.TeamKills);
-        inc(Attacker^.Team^.stats.TeamDamage, Gear^.Damage);
-    end;
-    if Gear = Attacker^.Gear then
-        inc(Attacker^.Team^.stats.Suicides);
-    if Attacker^.Team^.Clan = Gear^.Hedgehog^.Team^.Clan then
-        begin
-        inc(KillsClan);
-        if Attacker^.Team = Gear^.Hedgehog^.Team then
-            inc(KillsTeam);
+        inc(Attacker^.stats.StepKills);
+        inc(Attacker^.Team^.stats.Kills);
+        if (Attacker^.Team^.TeamName = Gear^.Hedgehog^.Team^.TeamName) then
+            begin
+            inc(Attacker^.Team^.stats.TeamKills);
+            inc(Attacker^.Team^.stats.TeamDamage, Gear^.Damage);
+        end;
+        if Gear = Attacker^.Gear then
+            inc(Attacker^.Team^.stats.Suicides);
+        if Attacker^.Team^.Clan = Gear^.Hedgehog^.Team^.Clan then
+            begin
+            inc(KillsClan);
+            if Attacker^.Team = Gear^.Hedgehog^.Team then
+                inc(KillsTeam);
+            end;
         end;
     end;
 
@@ -167,6 +192,11 @@
 isTurnSkipped:= true
 end;
 
+function getIsTurnSkipped: boolean;
+begin
+getIsTurnSkipped:= isTurnSkipped;
+end;
+
 procedure TurnStats;
 var i, t: LongInt;
     c: Longword;
@@ -247,15 +277,20 @@
     begin
     s:= ansistring(CurrentHedgehog^.Name);
     inc(CurrentHedgehog^.stats.FinishedTurns);
-    // If the hog sacrificed (=kamikaze/piano) itself, this needs to be taken into accounts for the reactions later
+
+    // killsCheck is used to take deaths into account that were not a traditional "kill"
+    // Hogs that died during SD water rise do not count as "kills" for taunts
+    killsCheck:= KillsSD;
+    // If the hog sacrificed (=kamikaze/piano) itself, this needs to be taken into account for the reactions later
     if (CurrentHedgehog^.stats.Sacrificed) then
-        killsCheck:= 1
-    else
-        killsCheck:= 0;
+        inc(killsCheck);
 
-    // First blood (first damage, poison or kill)
-    if ((DamageTotal > 0) or (KillsTotal > 0) or (PoisonTotal > 0)) and ((CurrentHedgehog^.stats.DamageGiven = DamageTotal) and (CurrentHedgehog^.stats.StepKills = KillsTotal) and (PoisonTotal = PoisonTurn + PoisonClan)) then
-        AddVoice(sndFirstBlood, CurrentTeam^.voicepack)
+    // First blood (first damage, poison or kill of enemy)
+    if (StepFirstBlood) and (not FirstBlood) and (ClansCount > 1) and ((DamageTotal > 0) or (KillsTotal > 0) or (PoisonTotal > 0)) then
+        begin
+        FirstBlood:= true;
+        AddVoice(sndFirstBlood, CurrentTeam^.voicepack);
+        end
 
     // Hog hurts, poisons or kills itself (except sacrifice)
     else if (CurrentHedgehog^.stats.Sacrificed = false) and ((CurrentHedgehog^.stats.StepDamageRecv > 0) or (CurrentHedgehog^.stats.StepPoisoned) or (CurrentHedgehog^.stats.StepDied)) then
@@ -277,7 +312,7 @@
 
     // Hog hurts, poisons or kills own team/clan member. Sacrifice is taken into account
     else if (DamageClan <> 0) or (KillsClan > killsCheck) or (PoisonClan <> 0) then
-        if (DamageTurn > DamageClan) or (Kills > KillsClan) then
+        if (DamageTurn > DamageClan) or ((Kills-KillsSD) > KillsClan) then
             if random(2) = 0 then
                 AddVoice(sndNutter, CurrentTeam^.voicepack)
             else
@@ -354,7 +389,7 @@
         begin end// nothing ?
 
     // Turn skipped
-    else if isTurnSkipped and (not PlacingHogs) then
+    else if isTurnSkipped and (not PlacingHogs) and (not PlacingKings) then
         begin
         AddVoice(sndCoward, PreviousTeam^.voicepack);
         AddCaption(FormatA(GetEventString(eidTurnSkipped), s), capcolDefault, capgrpMessage);
@@ -376,9 +411,11 @@
                 StepPoisoned:= false;
                 StepDied:= false;
                 GotRevenge:= false;
+                StepRevenge:= false;
                 end;
 
 Kills:= 0;
+KillsSD:= 0;
 KillsClan:= 0;
 KillsTeam:= 0;
 DamageClan:= 0;
@@ -392,6 +429,7 @@
 LeaveMeAlone:= false;
 AmmoDamagingUsed:= false;
 isTurnSkipped:= false;
+StepFirstBlood:= false;
 end;
 
 procedure AmmoUsed(am: TAmmoType);
@@ -460,7 +498,7 @@
 
             { Send player stats for winner clans/teams.
             The clan that survived is ranked 1st. }
-            if Clan^.ClanHealth > 0 then
+            if (Clan^.ClanHealth > 0) then
                 begin
                 winnersClan:= Clan;
                 if SendRankingStatsOn then
@@ -512,7 +550,7 @@
                 if ((deathEntry^.KilledClans[c]^.ClanHealth) = 0) and (not deathEntry^.KilledClans[c]^.StatsHandled) then
                     begin
                     for t:= 0 to Pred(TeamsCount) do
-                        if TeamsArray[t]^.Clan^.ClanIndex = deathEntry^.KilledClans[c]^.ClanIndex then
+                        if (TeamsArray[t]^.Clan^.ClanIndex = deathEntry^.KilledClans[c]^.ClanIndex) then
                             begin
                             SendStat(siTeamRank, IntToStr(currentRank));
                             SendStat(siPlayerKills, IntToStr(deathEntry^.killedClans[c]^.Color) + ' ' +
@@ -549,13 +587,17 @@
     // now to console
     if winnersClan <> nil then
         begin
+        ScriptCall('onGameResult', winnersClan^.ClanIndex);
         WriteLnToConsole('WINNERS');
         WriteLnToConsole(inttostr(winnersClan^.TeamsNumber));
         for t:= 0 to winnersClan^.TeamsNumber - 1 do
             WriteLnToConsole(winnersClan^.Teams[t]^.TeamName);
         end
     else
+        begin
+        ScriptCall('onGameResult', -1);
         WriteLnToConsole('DRAW');
+        end;
 
     ScriptCall('onAchievementsDeclaration');
 end;
@@ -593,11 +635,14 @@
     PoisonTurn  := 0;
     KillsClan   := 0;
     KillsTeam   := 0;
+    KillsSD     := 0;
     Kills       := 0;
     KillsTotal  := 0;
     HitTargets  := 0;
     AmmoUsedCount := 0;
     AmmoDamagingUsed := false;
+    FirstBlood:= false;
+    StepFirstblood:= false;
     LeaveMeAlone := false;
     SkippedTurns:= 0;
     isTurnSkipped:= false;
--- a/hedgewars/uStore.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uStore.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -113,6 +113,7 @@
 clr.r:= Color shr 16;
 clr.g:= (Color shr 8) and $FF;
 clr.b:= Color and $FF;
+clr.a:= $FF;
 tmpsurf:= TTF_RenderUTF8_Blended(Fontz[Font].Handle, s, clr);
 if tmpsurf = nil then exit;
 tmpsurf:= doSurfaceConversion(tmpsurf);
@@ -278,19 +279,23 @@
                     if ExtDriven then
                          NameTagTex:= RenderStringTexLim(ansistring(Name), Clan^.Color, fnt16, cTeamHealthWidth)
                     else NameTagTex:= RenderStringTex(ansistring(Name), Clan^.Color, fnt16);
-                    if Hat = 'NoHat' then
+                    if cHolidaySilliness then
                         begin
-                        if (month = 4) and (md = 20) then
-                            Hat := 'eastertop'   // Easter
-                        else if (month = 12) and ((md = 24) or (md = 25) or (md = 26)) then
-                            Hat := 'Santa'       // Christmas Eve/Christmas/Boxing Day
-                        else if (month = 10) and (md = 31) then
-                            Hat := 'fr_pumpkin'; // Halloween/Hedgewars' birthday
-                        end;
-                    if (month = 4) and (md = 1) then
-                        begin
-                        AprilOne:= true;
-                        Hat := 'fr_tomato'; // avoid promoting violence to hedgehogs. see https://hedgewars.org/node/5818
+                        // Special hats on special days
+                        if Hat = 'NoHat' then
+                            begin
+                            if (month = 4) and (md = 20) then
+                                Hat := 'eastertop'   // Easter
+                            else if (month = 12) and ((md = 24) or (md = 25) or (md = 26)) then
+                                Hat := 'Santa'       // Christmas Eve/Christmas/Boxing Day
+                            else if (month = 10) and (md = 31) then
+                                Hat := 'fr_pumpkin'; // Halloween/Hedgewars' birthday
+                            end;
+                        if (month = 4) and (md = 1) then
+                            begin
+                            AprilOne:= true;
+                            Hat := 'fr_tomato'; // avoid promoting violence to hedgehogs. see https://hedgewars.org/node/5818
+                            end;
                         end;
 
                     if Hat <> 'NoHat' then
@@ -322,9 +327,9 @@
 
 for t:= 0 to Pred(ClansCount) do
     with ClansArray[t]^ do
-        HealthTex:= makeHealthBarTexture(cTeamHealthWidth + 5, Teams[0]^.NameTagTex^.h, Color);
+        HealthTex:= makeHealthBarTexture(cTeamHealthWidth + 5, 19 * HDPIScaleFactor, Color);
 
-GenericHealthTexture:= makeHealthBarTexture(cTeamHealthWidth + 5, TeamsArray[0]^.NameTagTex^.h, cWhiteColor)
+GenericHealthTexture:= makeHealthBarTexture(cTeamHealthWidth + 5, 19 * HDPIScaleFactor, cWhiteColor)
 end;
 
 
@@ -619,8 +624,13 @@
 procedure RenderHealth(var Hedgehog: THedgehog);
 var s: shortstring;
 begin
-s:= IntToStr(Hedgehog.Gear^.Health);
 FreeAndNilTexture(Hedgehog.HealthTagTex);
+if Hedgehog.Gear <> nil then
+    s:= IntToStr(Hedgehog.Gear^.Health)
+else if Hedgehog.GearHidden <> nil then
+    s:= IntToStr(Hedgehog.GearHidden^.Health)
+else
+    exit;
 Hedgehog.HealthTagTex:= RenderStringTex(ansistring(s), Hedgehog.Team^.Clan^.Color, fnt16)
 end;
 
@@ -851,7 +861,9 @@
     SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 0);         // no depth buffer
     SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 0);         // no alpha channel
     SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 16);       // buffer should be 16
-    SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1); // prefer hw rendering
+{$IFNDEF DARWIN}
+    SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1); // force hw rendering except on macOS
+{$ENDIF}
 end;
 
 procedure SetupOpenGL;
--- a/hedgewars/uTeams.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uTeams.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -29,6 +29,7 @@
 procedure freeModule;
 
 function  AddTeam(TeamColor: Longword): PTeam;
+function  SetMissionTeam(): PTeam;
 procedure SwitchHedgehog;
 procedure AfterSwitchHedgehog;
 procedure InitTeams;
@@ -57,19 +58,21 @@
 var AliveClan: PClan;
     s, cap: ansistring;
     ts: array[0..(cMaxTeams - 1)] of ansistring;
-    t, AliveCount, i, j: LongInt;
+    t, ActiveAliveCount, i, j: LongInt;
     allWin, winCamera: boolean;
 begin
 CheckForWin:= false;
-AliveCount:= 0;
+ActiveAliveCount:= 0;
+// Victory if there is 1 living and non-passive clan left
 for t:= 0 to Pred(ClansCount) do
-    if ClansArray[t]^.ClanHealth > 0 then
+    if (ClansArray[t]^.ClanHealth > 0) and (not ClansArray[t]^.Passive) then
         begin
-        inc(AliveCount);
+        inc(ActiveAliveCount);
         AliveClan:= ClansArray[t]
         end;
 
-if (AliveCount > 1) or ((AliveCount = 1) and ((GameFlags and gfOneClanMode) <> 0)) then
+// Exception: gfOneClanMode, then there is no winner
+if (ActiveAliveCount > 1) or ((ActiveAliveCount = 1) and ((GameFlags and gfOneClanMode) <> 0)) then
     exit;
 CheckForWin:= true;
 
@@ -88,7 +91,7 @@
 
 if not TeamsGameOver then
     begin
-    if AliveCount = 0 then
+    if ActiveAliveCount = 0 then
         begin // draw
         AddCaption(GetEventString(eidRoundDraw), capcolDefault, capgrpGameState);
         if SendGameResultOn then
@@ -198,7 +201,9 @@
            if Gear <> nil then
                AddCI(Gear)
            end
-        end;
+        end
+    else if (PreviousTeam <> nil) and PlacingKings and UnplacedKing then
+        UnplacedKing:= false;
 
 PreviousTeam:= CurrentTeam;
 
@@ -249,7 +254,7 @@
 
         with ClansArray[c]^ do
             begin
-            if (not PlacingHogs) and ((Succ(CurrTeam) mod TeamsNumber) = TagTeamIndex) then
+            if (not PlacingHogs) and (not PlacingKings) and ((Succ(CurrTeam) mod TeamsNumber) = TagTeamIndex) then
                 begin
                 if c = SwapClanPre then
                     inc(TotalRoundsPre);
@@ -261,7 +266,7 @@
         inc(c);
         if c = ClansCount then
             c:= 0;
-        if (not PlacingHogs) then
+        if (not PlacingHogs) and (not PlacingKings) then
             begin
             if c = SwapClanPre then
                 inc(TotalRoundsPre);
@@ -277,15 +282,16 @@
             CurrTeam:= Succ(CurrTeam) mod TeamsNumber;
             CurrentTeam:= Teams[CurrTeam];
             with CurrentTeam^ do
-                begin
-                PrevHH:= CurrHedgehog mod HedgehogsNumber; // prevent infinite loop when CurrHedgehog = 7, but HedgehogsNumber < 8 (team is destroyed before its first turn)
-                repeat
-                    CurrHedgehog:= Succ(CurrHedgehog) mod HedgehogsNumber;
-                until ((Hedgehogs[CurrHedgehog].Gear <> nil) and (Hedgehogs[CurrHedgehog].Effects[heFrozen] < 256)) or (CurrHedgehog = PrevHH)
-                end
-        until ((CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil) and (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Effects[heFrozen] < 256)) or (PrevTeam = CurrTeam) or ((CurrTeam = TagTeamIndex) and ((GameFlags and gfTagTeam) <> 0))
+                if (not Passive) then
+                    begin
+                    PrevHH:= CurrHedgehog mod HedgehogsNumber; // prevent infinite loop when CurrHedgehog = 7, but HedgehogsNumber < 8 (team is destroyed before its first turn)
+                    repeat
+                        CurrHedgehog:= Succ(CurrHedgehog) mod HedgehogsNumber;
+                    until ((Hedgehogs[CurrHedgehog].Gear <> nil) and (Hedgehogs[CurrHedgehog].Effects[heFrozen] < 256)) or (CurrHedgehog = PrevHH)
+                    end
+        until ((not CurrentTeam^.Passive) and (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil) and (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Effects[heFrozen] < 256)) or (PrevTeam = CurrTeam) or ((CurrTeam = TagTeamIndex) and ((GameFlags and gfTagTeam) <> 0))
         end;
-        if (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear = nil) or (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Effects[heFrozen] > 255) then
+        if (CurrentTeam^.Passive) or (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear = nil) or (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Effects[heFrozen] > 255) then
             begin
             with CurrentTeam^.Clan^ do
                 for t:= 0 to Pred(TeamsNumber) do
@@ -297,10 +303,10 @@
                                 if (Gear <> nil) and (Effects[heFrozen] < 256) and (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Effects[heFrozen] > 255) then
                                     CurrHedgehog:= i
                                 end;
-            if (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear = nil) or (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Effects[heFrozen] > 255) then
+            if (not CurrentTeam^.Passive) and ((CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear = nil) or (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Effects[heFrozen] > 255)) then
                 inc(CurrentTeam^.Clan^.TurnNumber);
-            end
-until (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil) and (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Effects[heFrozen] < 256);
+            end;
+until (not CurrentTeam^.Passive) and (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil) and (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Effects[heFrozen] < 256);
 
 SwitchCurrentHedgehog(@(CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog]));
 {$IFDEF USE_TOUCH_INTERFACE}
@@ -330,15 +336,18 @@
     g: PGear;
     s: ansistring;
 begin
-if PlacingHogs then
+if PlacingHogs or PlacingKings then
     begin
     PlacingHogs:= false;
+    PlacingKings:= false;
     for t:= 0 to Pred(TeamsCount) do
         for i:= 0 to cMaxHHIndex do
-            if (TeamsArray[t]^.Hedgehogs[i].Gear <> nil) and (TeamsArray[t]^.Hedgehogs[i].Unplaced) then
-                PlacingHogs:= true;
+            if ((GameFlags and gfPlaceHog) <> 0) and (TeamsArray[t]^.Hedgehogs[i].Gear <> nil) and (TeamsArray[t]^.Hedgehogs[i].Unplaced) then
+                PlacingHogs:= true
+            else if ((GameFlags and gfPlaceHog) = 0) and ((GameFlags and gfKing) <> 0) and (TeamsArray[t]^.Hedgehogs[i].Gear <> nil) and (TeamsArray[t]^.Hedgehogs[i].UnplacedKing) then
+                PlacingKings:= true;
 
-    if not PlacingHogs then // Reset  various things I mucked with
+    if (not PlacingHogs) and (not PlacingKings) then // Reset various things I mucked with
         begin
         for i:= 0 to ClansCount do
             if ClansArray[i] <> nil then
@@ -350,7 +359,7 @@
 
     end;
 
-if not PlacingHogs then
+if (not PlacingHogs) and (not PlacingKings) then
     begin
     if (TotalRoundsReal = -1) then
         TotalRoundsReal:= 0;
@@ -359,7 +368,7 @@
     end;
 
 // Determine clan ID to check to determine whether to increase TotalRoundsPre/TotalRoundsReal
-if (not PlacingHogs) then
+if (not PlacingHogs) and (not PlacingKings) then
     begin
     if SwapClanPre = -1 then
         begin
@@ -420,6 +429,11 @@
         TurnTimeLeft:= 15000
     else TurnTimeLeft:= 0
     end
+else if PlacingKings then
+    if CurrentHedgehog^.King and CurrentHedgehog^.UnplacedKing then
+        TurnTimeLeft:= cHedgehogTurnTime
+    else
+        TurnTimeLeft:= 0
 else
     begin
     if ((GameFlags and gfTagTeam) <> 0) and (not NextClan) then
@@ -453,14 +467,11 @@
 // turn start taunt: sndYesSir for own team, sndHmm for enemy or computer team
 if (TurnTimeLeft > 0) and (CurrentHedgehog^.BotLevel = 0) then
     begin
-    if CurrentTeam^.ExtDriven then
-        begin
-        AddVoice(sndHmm, CurrentTeam^.voicepack)
-        end
-    else
-        begin
-        AddVoice(sndYesSir, CurrentTeam^.voicepack);
-        end;
+    if (not CinematicScript) then
+        if CurrentTeam^.ExtDriven then
+            AddVoice(sndHmm, CurrentTeam^.voicepack)
+        else
+            AddVoice(sndYesSir, CurrentTeam^.voicepack);
     if cHedgehogTurnTime < 1000000 then
         ReadyTimeLeft:= cReadyDelay;
     s:= ansistring(CurrentTeam^.TeamName);
@@ -468,14 +479,26 @@
     end
 else
     begin
-    if TurnTimeLeft > 0 then
-        begin
-        AddVoice(sndHmm, CurrentTeam^.voicepack)
-        end;
-    ReadyTimeLeft:= 0
+    if (TurnTimeLeft > 0) and (not CinematicScript) then
+        AddVoice(sndHmm, CurrentTeam^.voicepack);
+    ReadyTimeLeft:= 0;
     end;
 end;
 
+function SetMissionTeam(): PTeam;
+var team: PTeam;
+begin
+New(team);
+if checkFails(team <> nil, 'AddTeam: team = nil', true) then exit(nil);
+FillChar(team^, sizeof(TTeam), 0);
+team^.HedgehogsNumber:= 0;
+team^.Binds:= DefaultBinds;
+
+CurrentTeam:= team;
+MissionTeam:= team;
+SetMissionTeam:= team;
+end;
+
 function AddTeam(TeamColor: Longword): PTeam;
 var team: PTeam;
     c: LongInt;
@@ -493,6 +516,7 @@
 inc(VisibleTeamsCount);
 
 team^.Binds:= DefaultBinds;
+team^.Passive:= false;
 
 c:= Pred(ClansCount);
 while (c >= 0) and (ClansArray[c]^.Color <> TeamColor) do dec(c);
@@ -508,6 +532,7 @@
         Color:= TeamColor;
         TagTeamIndex:= 0;
         Flawless:= true;
+        LocalOrAlly:= false;
         DeathLogged:= false;
         StatsHandled:= false;
         end
@@ -520,6 +545,7 @@
 with team^.Clan^ do
     begin
     Teams[TeamsNumber]:= team;
+    Passive:= false;
     inc(TeamsNumber)
     end;
 
@@ -547,7 +573,8 @@
         begin
         if (not ExtDriven) and (Hedgehogs[0].BotLevel = 0) then
             begin
-            LocalClan:= Clan^.ClanIndex;
+            if (MissionTeam = nil) or (MissionTeam^.TeamName = TeamName) then
+                Clan^.LocalOrAlly:= true;
             LocalTeam:= t;
             LocalAmmo:= Hedgehogs[0].AmmoStore
             end;
@@ -560,6 +587,7 @@
         // Some initial King buffs
         if (GameFlags and gfKing) <> 0 then
             begin
+            hasKing:= true;
             Hedgehogs[0].King:= true;
             Hedgehogs[0].Hat:= 'crown';
             Hedgehogs[0].Effects[hePoisoned] := 0;
@@ -678,6 +706,31 @@
                     end
 end;
 
+procedure chAddMissionHH(var id: shortstring);
+var s: shortstring;
+    Health: LongInt;
+begin
+s:= '';
+if (not isDeveloperMode) then
+    exit;
+if checkFails((CurrentTeam <> nil), 'Can''t add hedgehogs yet, add a team first!', true) then exit;
+with CurrentTeam^ do
+    begin
+    if checkFails(HedgehogsNumber<=cMaxHHIndex, 'Can''t add hedgehog to "' + TeamName + '"! (already ' + intToStr(HedgehogsNumber) + ' hogs)', true) then exit;
+    SplitBySpace(id, s);
+    CurrentHedgehog:= @Hedgehogs[HedgehogsNumber];
+    CurrentHedgehog^.BotLevel:= StrToInt(id);
+    CurrentHedgehog^.Team:= CurrentTeam;
+    SplitBySpace(s, id);
+    Health:= StrToInt(s);
+    if checkFails((Health > 0) and (Health <= cMaxHogHealth), 'Invalid hedgehog health (must be between 1 and '+IntToStr(cMaxHogHealth)+')', true) then exit;
+    CurrentHedgehog^.Name:= id;
+    CurrentHedgehog^.InitialHealth:= Health;
+    CurrentHedgehog^.RevengeHog:= nil;
+    inc(HedgehogsNumber)
+    end
+end;
+
 procedure chAddHH(var id: shortstring);
 var s: shortstring;
     Gear: PGear;
@@ -709,6 +762,7 @@
     CurrentHedgehog^.Name:= id;
     CurrentHedgehog^.InitialHealth:= Gear^.Health;
     CurrentHedgehog^.RevengeHog:= nil;
+    CurrentHedgehog^.FlownOffMap:= false;
     CurrHedgehog:= HedgehogsNumber;
     inc(HedgehogsNumber)
     end
@@ -728,6 +782,63 @@
     loadBinds('bind', s);
 end;
 
+// Make sure the team name of chTeam is unique.
+// If it isn't, the name is changed to be unique.
+procedure makeTeamNameUnique(chTeam: PTeam);
+var tail: shortstring;
+    t, numLen, numTail: LongInt;
+//    valOK: Word;    -- see pas2c-related FIXME below
+    nameDupeCheck: boolean;
+    chChar: char;
+begin
+    nameDupeCheck:= false;
+    while(nameDupeCheck = false) do
+        begin
+        nameDupeCheck:= true;
+        for t:=0 to TeamsCount - 1 do
+            begin
+            // Name collision?
+            if (chTeam <> teamsArray[t]) and (TeamsArray[t]^.TeamName = chTeam^.TeamName) then
+                begin
+                // Change the name by appending a sequence number, starting from 2
+                numLen:= 0;
+                chChar:= chTeam^.TeamName[Length(chTeam^.TeamName) - numLen];
+                // Parse number at end of team name (if any)
+                while (chChar >= '0') and (chChar <= '9') and (numLen < Length(chTeam^.TeamName)) do
+                    begin
+                    inc(numLen);
+                    chChar:= chTeam^.TeamName[Length(chTeam^.TeamName) - numLen];
+                    end;
+
+                if numLen > 0 then
+                    // Number found: Increment it by 1
+                    begin
+                    tail:= Copy(chTeam^.TeamName, Length(chTeam^.TeamName) - numLen + 1, numLen);
+(* FIXME - pas2c missing 3rd param for val
+                    valOK:= 1;
+                    Val(tail, numTail, valOK);
+                    Inc(numTail);
+                    if valOK = 0 then
+                        tail:= IntToStr(numTail)
+                    else
+                        // This should not happen
+                        tail:= shortstring('X');
+*)
+                    Val(tail, numTail);
+                    Inc(numTail);
+                    tail:= IntToStr(numTail);
+                    chTeam^.TeamName:= Copy(chTeam^.TeamName, 0, Length(chTeam^.TeamName) - numLen) + tail;
+                    end
+                else
+                    // No number at team end: Just append a '2'
+                    chTeam^.TeamName:= chTeam^.TeamName + ' 2';
+                nameDupeCheck:= false;
+                break;
+                end;
+            end;
+        end;
+end;
+
 procedure chAddTeam(var s: shortstring);
 var Color: Longword;
     ts, cs: shortstring;
@@ -743,17 +854,41 @@
     // color is always little endian so the mask must be constant also in big endian archs
     Color:= Color or $FF000000;
     AddTeam(Color);
-    
+
     if CurrentTeam <> nil then
         begin
         CurrentTeam^.TeamName:= ts;
+        makeTeamNameUnique(CurrentTeam);
+
         CurrentTeam^.PlayerHash:= s;
         loadTeamBinds(ts);
 
         if GameType in [gmtDemo, gmtSave, gmtRecord] then
             CurrentTeam^.ExtDriven:= true;
 
-        CurrentTeam^.voicepack:= AskForVoicepack('Default')
+        CurrentTeam^.voicepack:= AskForVoicepack('Default_qau')
+        end
+    end
+end;
+
+procedure chSetMissionTeam(var s: shortstring);
+var ts, cs: shortstring;
+begin
+cs:= '';
+ts:= '';
+if isDeveloperMode then
+    begin
+    SplitBySpace(s, cs);
+    SplitBySpace(cs, ts);
+
+    SetMissionTeam();
+
+    if CurrentTeam <> nil then
+        begin
+        CurrentTeam^.TeamName:= ts;
+        CurrentTeam^.PlayerHash:= s;
+        loadTeamBinds(ts);
+        CurrentTeam^.voicepack:= AskForVoicepack('Default_qau')
         end
     end
 end;
@@ -803,7 +938,8 @@
                 begin
                 if (not hasGone) and isGoneFlagPendingToBeSet then
                     begin
-                    AddChatString(#7 + Format('* '+shortstring(trmsg[sidTeamGone]), TeamName));
+                    if (not TeamsGameOver) then
+                        AddChatString(#7 + Format('* '+shortstring(trmsg[sidTeamGone]), TeamName));
                     if not CurrentTeam^.ExtDriven then SendIPC(_S'f' + s);
                     hasGone:= true;
                     skippedTurns:= 0;
@@ -940,7 +1076,9 @@
 procedure initModule;
 begin
 RegisterVariable('addhh', @chAddHH, false);
+RegisterVariable('addmisshh', @chAddMissionHH, false);
 RegisterVariable('addteam', @chAddTeam, false);
+RegisterVariable('setmissteam', @chSetMissionTeam, false);
 RegisterVariable('hhcoords', @chSetHHCoords, false);
 RegisterVariable('bind', @chBind, true );
 RegisterVariable('teamgone', @chTeamGone, true );
@@ -956,7 +1094,6 @@
 CurrentHedgehog:= nil;
 TeamsCount:= 0;
 ClansCount:= 0;
-LocalClan:= -1;
 LocalTeam:= -1;
 LocalAmmo:= -1;
 TeamsGameOver:= false;
--- a/hedgewars/uTouch.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uTouch.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -22,7 +22,7 @@
 
 interface
 
-uses SysUtils, uUtils, uConsole, uVariables, SDLh, uFloat, uConsts, uCommands, GLUnit, uTypes, uCaptions, uAmmos, uWorld;
+uses SysUtils, uUtils, uConsole, uVariables, SDLh, uFloat, uConsts, uCommands, GLUnit, uTypes, uCaptions, uWorld, uGearsHedgehog;
 
 
 procedure initModule;
@@ -89,7 +89,7 @@
 procedure onTouchDown(x, y: Single; pointerId: TSDL_FingerId);
 var
     finger: PTouch_Data;
-    xr, yr: LongWord;
+    xr, yr, tmp: LongWord;
 begin
 xr:= round(x * cScreenWidth);
 yr:= round(y * cScreenHeight);
@@ -159,10 +159,35 @@
     if(CurrentHedgehog <> nil) then
         begin
         if Ammoz[CurrentHedgehog^.CurAmmoType].Ammo.Propz and ammoprop_Timerable <> 0 then
-            ParseTeamCommand('/timer ' + inttostr((GetCurAmmoEntry(CurrentHedgeHog^)^.Timer div 1000) mod 5 + 1));
+            begin
+            tmp:= HHGetTimerMsg(CurrentHedgehog^.Gear);
+            if tmp <> MSGPARAM_INVALID then
+                ParseTeamCommand('/timer ' + inttostr(tmp mod 5 + 1));
+            end;
         end;
     exit;
     end;
+
+if isOnWidget(utilityWidget2, finger^) then
+    begin
+    finger^.pressedWidget:= @utilityWidget2;
+    moveCursor:= false;
+    if(CurrentHedgehog <> nil) then
+        begin
+        if Ammoz[CurrentHedgehog^.CurAmmoType].Ammo.Propz and ammoprop_SetBounce <> 0 then
+            begin
+            tmp := HHGetBouncinessMsg(CurrentHedgehog^.Gear);
+            if tmp <> MSGPARAM_INVALID then
+                begin
+                ParseTeamCommand('+precise');
+                ParseTeamCommand('timer ' + inttostr(tmp mod 5 + 1));
+                bounceButtonPressed:= true;
+                end;
+            end;
+        end;
+    exit;
+    end;
+
 dec(buttonsDown);//no buttonsDown, undo the inc() above
 if buttonsDown = 0 then
     begin
@@ -496,6 +521,12 @@
             aimingDown:= false;
             end;
         end;
+
+if bounceButtonPressed then
+    begin
+    ParseTeamCommand('-precise');
+    bounceButtonPressed:= false;
+    end;
 end;
 
 function findFinger(id: TSDL_FingerId): PTouch_Data;
@@ -627,6 +658,7 @@
 begin
     buttonsDown:= 0;
     pointerCount:= 0;
+    bounceButtonPressed:= false;
 
     setLength(fingers, 4);
     for index := 0 to (Length(fingers)-1) do
--- a/hedgewars/uTypes.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uTypes.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -45,7 +45,7 @@
     TPathType = (ptNone, ptData, ptGraphics, ptThemes, ptCurrTheme, ptConfig, ptTeams, ptMaps,
             ptMapCurrent, ptDemos, ptSounds, ptGraves, ptFonts, ptForts, ptLocale,
             ptAmmoMenu, ptHedgehog, ptVoices, ptHats, ptFlags, ptMissionMaps,
-            ptSuddenDeath, ptButtons, ptShaders);
+            ptSuddenDeath, ptButtons, ptShaders, ptDefaultVoice, ptMisc);
 
     // Available sprites for displaying stuff
     TSprite = (sprWater, sprCloud, sprBomb, sprBigDigit, sprBigDigitGray, sprBigDigitGreen,
@@ -61,7 +61,7 @@
 {$IFDEF USE_TOUCH_INTERFACE}
             sprFireButton, sprArrowUp, sprArrowDown, sprArrowLeft, sprArrowRight,
             sprJumpWidget, sprAMWidget, sprPauseButton, sprTimerButton, sprTargetButton,
-            sprSwitchButton,
+            sprSwitchButton, sprBounceButton,
 {$ENDIF}
             sprFlake, sprHandRope, sprHandBazooka, sprHandShotgun,
             sprHandDEagle, sprHandAirAttack, sprHandBaseball, sprPHammer,
@@ -91,7 +91,10 @@
             sprSlider, sprBotlevels, sprHandKnife, sprKnife, sprStar, sprIceTexture, sprIceGun,
             sprFrozenHog, sprAmRubber, sprBoing, sprCustom1, sprCustom2, sprCustom3, sprCustom4,
             sprCustom5, sprCustom6, sprCustom7, sprCustom8, sprFrozenAirMine, sprAirMine, sprHandAirMine,
-            sprFlakeL, sprSDFlakeL, sprCloudL, sprSDCloudL, sprCreeper, sprHandCreeper, sprMinigun
+            sprFlakeL, sprSDFlakeL, sprCloudL, sprSDCloudL, sprCreeper, sprHandCreeper, sprMinigun,
+            sprSliderInverted, sprFingerBack, sprFingerBackInv, sprTargetPBack, sprTargetPBackInv,
+            sprHealthHud, sprHealthPoisonHud, sprVampHud, sprKarmaHud, sprMedicHud, sprMedicPoisonHud,
+            sprHaloHud, sprInvulnHUD, sprAmPiano, sprHandLandGun, sprFirePunch, sprThroughWrap
             );
 
     // Gears that interact with other Gears and/or Land
@@ -155,7 +158,7 @@
             sndLandGun, sndCaseImpact, sndExtraDamage, sndFirePunchHit, sndGrenade, sndThisOneIsMine,
             sndWhatThe, sndSoLong, sndOhDear, sndGonnaGetYou, sndDrat, sndBugger, sndAmazing,
             sndBrilliant, sndExcellent, sndFire, sndWatchThis, sndRunAway, sndRevenge, sndCutItOut,
-            sndLeaveMeAlone, sndOuch, sndHmm);
+            sndLeaveMeAlone, sndOuch, sndHmm, sndKiss, sndFlyAway, sndPlaneWater);
 
     // Available ammo types to be used by hedgehogs
     TAmmoType  = (amNothing, amGrenade, amClusterBomb, amBazooka, amBee, amShotgun, amPickHammer, // 6
@@ -168,6 +171,8 @@
             amPiano, amGasBomb, amSineGun, amFlamethrower, amSMine, amHammer, // 48
             amResurrector, amDrillStrike, amSnowball, amTardis, amLandGun, // 53
             amIceGun, amKnife, amRubber, amAirMine, amCreeper, amMinigun); // 59
+    // NOTE: If we ever reach 126 ammo types, make sure to skip ammo type number 126 because it's
+    // reserved as synonym for amNothing. See also chSetWeapon.
 
     // Different kind of crates that e.g. hedgehogs can pick up
     TCrateType = (HealthCrate, AmmoCrate, UtilityCrate);
@@ -254,6 +259,7 @@
             doStep: TGearStepProcedure; // Code the gear is running
             AmmoType : TAmmoType;       // Ammo type associated with this kind of gear
             RenderTimer: Boolean;       // Will visually display Timer if true
+            RenderHealth: Boolean;      // Will visually display Health if true
             Target : TPoint;            // Gear target. Will render in uGearsRender unless a special case is added
             AIHints: LongWord;          // hints for ai.
             LastDamage: PHedgehog;      // Used to track damage source for stats
@@ -341,6 +347,7 @@
         StepDied,                // whether hog died this turn
         Sacrificed,              // whether hog was sacrificed in suicide attack (kamikaze, piano)
         GotRevenge: boolean;     // whether hog got revenge in this turn
+        StepRevenge: boolean;    // whether hog's revenge mode was activated in this turn
         MaxStepDamageRecv,       // most damage received in one turn
         MaxStepDamageGiven,      // most damage dealt in one turn
         MaxStepKills: Longword;  // most kills in one turn
@@ -413,10 +420,12 @@
             InitialHealth: LongInt; // used for gfResetHealth
             King: boolean;  // Flag for a bunch of hedgehog attributes
             Unplaced: boolean;  // Flag for hog placing mode
+            UnplacedKing: boolean;  // Flag for king placing phase in King Mode
             Timer: Longword;
             HealthBarHealth: LongInt;
             Effects: array[THogEffect] of LongInt;
             RevengeHog: PHedgehog;   // For which hog this hog wants revenge most. For sndRevenge taunt
+            FlownOffMap: boolean; // When hedgehog has flown far away off the map left or right
             end;
 
     TTeam = record
@@ -444,6 +453,9 @@
             voicepack: PVoicepack;
             PlayerHash: shortstring;   // md5 hash of player name. For temporary enabling of hats as thank you. Hashed for privacy of players
             stats: TTeamStats;
+            Passive: boolean; // if true, team will not participate in game. It is treated as if all its hedgehogs are frozen.
+                              // updating this value requires updating Passive in TClan as well!
+            hasKing: boolean; // true if team has a living king
             hasGone: boolean;
             skippedTurns: Longword;
             isGoneFlagPendingToBeSet, isGoneFlagPendingToBeUnset: boolean;
@@ -464,6 +476,8 @@
             DeathLogged: boolean; // true if clan is dead and its latest death has been logged in the clan death log
             StatsHandled : boolean; // true if clan's rank has been handled for stats screen
             Flawless: boolean;
+            Passive: boolean; // informational. Must be set to true if all of the teams are passive
+            LocalOrAlly: boolean; // true if at least 1 team in the clan is a local team. A local team is a non-extdriven team controlled by a human
             end;
 
      cdeclPtr = procedure; cdecl;
@@ -501,7 +515,7 @@
             sidWinner2, sidWinner3, sidWinner4, sidWinner5, sidWinner6,
             sidWinner7, sidWinnerAll, sidTeamGone, sidTeamBack, sidAutoSkip,
             sidFPS, sidLuaParsingOff, sidLuaParsingOn, sidLuaParsingDenied,
-            sidAmmoCount, sidChat, sidChatTeam, sidChatHog);
+            sidAmmoCount, sidChat, sidChatTeam, sidChatHog, sidUnknownGearValue);
 
     TCmdHelpStrId = (
             sidCmdHeaderBasic, sidCmdTogglechat, sidCmdTeam, sidCmdMe,
@@ -511,7 +525,8 @@
             sidCmdHeaderTaunts, sidCmdSpeech, sidCmdThink, sidCmdYell,
             sidCmdSpeechNumberHint, sidCmdHsa, sidCmdHta, sidCmdHya,
             sidCmdHurrah, sidCmdIlovelotsoflemonade, sidCmdJuggle,
-            sidCmdRollup, sidCmdShrug, sidCmdWave, sidCmdUnknown);
+            sidCmdRollup, sidCmdShrug, sidCmdWave, sidCmdUnknown,
+            sidCmdHelpRoom, sidCmdHelpRoomFail);
 
     // Events that are important for the course of the game or at least interesting for other reasons
     TEventId = (eidDied, eidDrowned, eidRoundStart, eidRoundWin, eidRoundDraw,
--- a/hedgewars/uUtils.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uUtils.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -83,6 +83,9 @@
 
 function CalcWorldWrap(X, radius: LongInt): LongInt;
 
+procedure updateVolumeDelta(precise: boolean);
+procedure updateCursorMovementDelta(precise: boolean; dir: LongInt; var cursorVar: LongInt);
+
 function read1stLn(filePath: shortstring): shortstring;
 function readValueFromINI(key, filePath: shortstring): shortstring;
 
@@ -111,12 +114,12 @@
 
 
 implementation
-uses {$IFNDEF PAS2C}typinfo, {$ENDIF}Math, uConsts, uVariables, uPhysFSLayer, uDebug;
+uses {$IFNDEF PAS2C}typinfo, SDLh, {$ENDIF}Math, uConsts, uVariables, uPhysFSLayer, uDebug;
 
 {$IFDEF DEBUGFILE}
 var logFile: PFSFile;
 {$IFDEF USE_VIDEO_RECORDING}
-    logMutex: TRTLCriticalSection; // mutex for debug file
+    logMutex: PSDL_mutex; // mutex for debug file
 {$ENDIF}
 {$ENDIF}
 var CharArray: array[0..255] of Char;
@@ -506,7 +509,8 @@
 {$IFDEF DEBUGFILE}
 
 {$IFDEF USE_VIDEO_RECORDING}
-EnterCriticalSection(logMutex);
+if SDL_LockMutex(logMutex) <> 0 then
+    OutError('Logging mutex could not be locked!', true);
 {$ENDIF}
 if logFile <> nil then
     pfsWriteLn(logFile, inttostr(GameTicks)  + ': ' + s)
@@ -514,25 +518,37 @@
     WriteLn(stdout, inttostr(GameTicks)  + ': ' + s);
 
 {$IFDEF USE_VIDEO_RECORDING}
-LeaveCriticalSection(logMutex);
+if SDL_UnlockMutex(logMutex) <> 0 then
+    OutError('Logging mutex could not be unlocked!', true);
 {$ENDIF}
 
 {$ENDIF}
 end;
 
 procedure AddFileLogRaw(s: pchar); cdecl;
+var msgLine: PChar;
 begin
 s:= s;
 {$IFNDEF PAS2C}
 {$IFDEF DEBUGFILE}
 {$IFDEF USE_VIDEO_RECORDING}
-EnterCriticalSection(logMutex);
+if SDL_LockMutex(logMutex) <> 0 then
+    OutError('Logging mutex could not be locked!', true);
 {$ENDIF}
-// TODO: uncomment next two lines
-// write(logFile, s);
-// flush(logFile);
+msgLine:= Str2PChar(IntToStr(GameTicks) + ': ');
+if (logFile <> nil) then
+    begin
+    pfsWriteRaw(logFile, msgLine, StrLen(msgLine));
+    pfsWriteRaw(logFile, s, StrLen(s));
+    end
+else
+    begin
+    Write(stdout, msgLine);
+    Flush(stdout);
+    end;
 {$IFDEF USE_VIDEO_RECORDING}
-LeaveCriticalSection(logMutex);
+if SDL_UnlockMutex(logMutex) <> 0 then
+    OutError('Logging mutex could not be unlocked!', true);
 {$ENDIF}
 {$ENDIF}
 {$ENDIF}
@@ -694,6 +710,40 @@
     sanitizeCharForLog:= r
 end;
 
+// helper function for volume change controls
+procedure updateVolumeDelta(precise: boolean);
+begin
+if cVolumeUpKey and (not cVolumeDownKey) then
+    if precise then
+        cVolumeDelta:= 1
+    else
+        cVolumeDelta:= 3
+else if cVolumeDownKey and (not cVolumeUpKey) then
+    if precise then
+        cVolumeDelta:= -1
+    else
+        cVolumeDelta:= -3
+else
+    cVolumeDelta:= 0;
+end;
+
+// helper function for cursor movement change controls
+procedure updateCursorMovementDelta(precise: boolean; dir: LongInt; var cursorVar: LongInt);
+begin
+if dir > 0 then
+    if precise then
+        cursorVar:= cameraKeyboardSpeedSlow
+    else
+        cursorVar:= cameraKeyboardSpeed
+else if dir < 0 then
+    if precise then
+        cursorVar:= - cameraKeyboardSpeedSlow
+    else
+        cursorVar:= - cameraKeyboardSpeed
+else
+    cursorVar:= 0;
+end;
+
 function read1stLn(filePath: shortstring): shortstring;
 var f: pfsFile;
 begin
@@ -764,7 +814,9 @@
         logfileBase:= 'preview';
         {$ENDIF}
 {$IFDEF USE_VIDEO_RECORDING}
-    InitCriticalSection(logMutex);
+    logMutex:= SDL_CreateMutex();
+    if (logMutex = nil) then
+        OutError('Could not create mutex for logging', true);
 {$ENDIF}
     if not pfsExists('/Logs') then
         pfsMakeDir('/Logs');
@@ -809,7 +861,7 @@
 else
     WriteLn(stdout, 'halt at ' + inttostr(GameTicks) + ' ticks. TurnTimeLeft = ' + inttostr(TurnTimeLeft));
 {$IFDEF USE_VIDEO_RECORDING}
-    DoneCriticalSection(logMutex);
+    SDL_DestroyMutex(logMutex);
 {$ENDIF}
 {$ENDIF}
 end;
--- a/hedgewars/uVariables.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uVariables.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -33,6 +33,7 @@
     cFullscreenHeight  : LongInt;
     cWindowedWidth     : LongInt;
     cWindowedHeight    : LongInt;
+    cWindowedMaximized : boolean;
     cScreenWidth       : LongInt;
     cScreenHeight      : LongInt;
     cNewScreenWidth    : LongInt;
@@ -41,8 +42,8 @@
     ipcPort            : Word;
     AprilOne           : boolean;
     cFullScreen        : boolean;
-    cLocaleFName       : shortstring;
-    cLocale            : shortstring;
+    cLanguageFName     : shortstring;
+    cLanguage          : shortstring;
     cTimerInterval     : LongInt;
     PathPrefix         : ansistring;
     UserPathPrefix     : ansistring;
@@ -55,6 +56,7 @@
 
     cAltDamage         : boolean;
     cReducedQuality    : LongWord;
+    cHolidaySilliness  : boolean;
     UserNick           : shortstring;
     recordFileName     : shortstring;
     cReadyDelay        : Longword;
@@ -79,6 +81,7 @@
     isSpeed         : boolean;
     isAFK           : boolean;
     isShowMission   : boolean;
+    isShowGearInfo  : boolean;
     isForceMission  : boolean;
     SpeedStart      : LongWord;
 
@@ -88,6 +91,7 @@
 
     CheckSum        : LongWord;
     CampaignVariable: shortstring;
+    MissionVariable : shortstring;
     GameTicks       : LongWord;
     OuchTauntTimer  : LongWord; // Timer which blocks sndOuch from being played too often and fast
     GameState       : TGameState;
@@ -104,12 +108,17 @@
     IsGetAwayTime   : boolean;
     GameOver        : boolean;
     cSuddenDTurns   : LongInt;
+    LastSuddenDWarn : LongInt; // last round in which the last SD warning appeared. -2 = no warning so far
+    cInitHealth     : LongInt; // initial hedgehog health (from game scheme. note the real hog health is sent directly
+                               // from frontend, this is only used to inform Lua scripts)
     cDamagePercent  : LongInt;
     cMineDudPercent : LongWord;
     cTemplateFilter : LongInt;
     cFeatureSize    : LongInt;
     cMapGen         : TMapGen;
     cRopePercent    : LongWord;
+    cRopeNodeStep   : LongWord;
+    cRopeLayers     : LongInt;
     cGetAwayTime    : LongWord;
 
     cAdvancedMapGenMode: boolean;
@@ -128,8 +137,9 @@
 
     cTagsMask        : byte;
     cPrevTagsMask    : byte;
-    zoom             : GLfloat;
-    ZoomValue        : GLfloat;
+    zoom             : GLfloat; // current zoom
+    ZoomValue        : GLfloat; // aimed zoom
+    UserZoom         : GLfloat; // user-chosen initial and default zoom
 
     cWaterLine       : LongInt;
     cGearScrEdgesDist: LongInt;
@@ -163,6 +173,7 @@
 
     cCaseFactor     : Longword;
     cMaxCaseDrops   : Longword; // Max. number of crates which can be in the game when dropping
+
     cLandMines      : Longword;
     cAirMines       : Longword;
     cExplosives     : Longword;
@@ -172,6 +183,8 @@
     cSeed           : shortstring;
     cIsSoundEnabled : boolean; // If the sound system is enabled
     cVolumeDelta    : LongInt;
+    cVolumeUpKey    : boolean;
+    cVolumeDownKey  : boolean;
     cMuteToggle     : boolean; // Mute toggle requested
     cHasFocus       : boolean;
     cInactDelay     : Longword;
@@ -182,6 +195,7 @@
 
     CrosshairX      : LongInt;
     CrosshairY      : LongInt;
+    CrosshairGear   : PGear;
     CursorMovementX : LongInt;
     CursorMovementY : LongInt;
     cWaveHeight     : LongInt;
@@ -206,7 +220,9 @@
     cMaxZoomLevel   : real;
     cMinZoomLevel   : real;
     cZoomDelta      : real;
+    cZoomDeltaSmall : real;
     cMinMaxZoomLevelDelta : real;
+    cDemoClockFPSOffsetY : LongInt;
 
 
     flagMakeCapture : boolean;
@@ -222,6 +238,7 @@
 
     TargetCursorPoint     : TPoint;
     CursorPoint           : TPoint;
+    CursorPointDelta      : TPoint;
     TargetPoint           : TPoint;
 
     ScreenFade      : TScreenFade;
@@ -261,6 +278,12 @@
     LuaEndTurnRequested: boolean;
     LuaNoEndTurnTaunts: boolean;
 
+    // whether Lua requested to pause the clock
+    LuaClockPaused: boolean;
+
+    // whether /lua command was used
+    LuaCmdUsed: boolean;
+
     MaskedSounds : array[TSound] of boolean;
 
     LastVoice : TVoice;
@@ -276,10 +299,12 @@
 //Buttons
 {$IFDEF USE_TOUCH_INTERFACE}
     buttonScale: GLFloat;
+    bounceButtonPressed: boolean;
 
     arrowUp, arrowDown, arrowLeft, arrowRight : TOnScreenWidget;
     firebutton, jumpWidget, AMWidget          : TOnScreenWidget;
     pauseButton, utilityWidget                : TOnScreenWidget;
+    utilityWidget2                            : TOnScreenWidget;
 {$ENDIF}
 
 
@@ -293,7 +318,7 @@
         '//',                            // ptData
         '/Graphics',                     // ptGraphics
         '/Themes',                       // ptThemes
-        '/Themes/Bamboo',                // ptCurrTheme
+        '/Themes/Nature',                // ptCurrTheme
         '/Config',                       // ptConfig
         '/Config/Teams',                 // ptTeams
         '/Maps',                         // ptMaps
@@ -312,7 +337,9 @@
         '/Missions/Maps',                // ptMissionMaps
         '/Graphics/SuddenDeath',         // ptSuddenDeath
         '/Graphics/Buttons',             // ptButton
-        '/Shaders'                       // ptShaders
+        '/Shaders',                      // ptShaders
+        '/Sounds/voices/Default',        // ptDefaultVoice
+        '/misc'                          // ptMisc
     );
 
 var
@@ -440,13 +467,13 @@
             (FileName:     'hhMask'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
             Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHHTelepMask
             (FileName:     'Switch'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSwitch
+            Width:  40; Height: 40; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSwitch
             (FileName:  'Parachute'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
             Width:  48; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprParachute
             (FileName:     'Target'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
             Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprTarget
-            (FileName:   'RopeNode'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:   6; Height:  6; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprRopeNode
+            (FileName:   'RopeNode'; Path: ptCurrTheme; AltPath: ptGraphics; Texture: nil; Surface: nil;
+            Width:   16; Height:  16; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprRopeNode
             (FileName:   'thinking'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
             Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprQuestion
             (FileName:   'PowerBar'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
@@ -480,6 +507,8 @@
             Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprTargetButton
             (FileName: 'switchbutton'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil;
             Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprSwitchButton
+            (FileName: 'bouncebutton'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil;
+            Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprBounceButton
 {$ENDIF}
             (FileName:      'Flake'; Path:ptCurrTheme; AltPath: ptNone; Texture: nil; Surface: nil;
             Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprFlake
@@ -737,7 +766,7 @@
             (FileName:  'botlevels'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
             Width: 22; Height: 15; imageWidth: 22; imageHeight: 15; saveSurf: true; critical: true; checkSum: false; priority: tpLow; getDimensions: false; getImageDimensions: false), // sprBotlevels
             (FileName:  'amCleaver'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 64; imageWidth: 64; imageHeight: 64; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: false),// sprHandKnife
+            Width:  128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandKnife
             (FileName:  'cleaver'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
             Width: 64; Height: 64; imageWidth: 64; imageHeight: 128; saveSurf: false; critical: true; checkSum: false; priority: tpLow; getDimensions: false; getImageDimensions: false), // sprKnife
             (FileName:  'star'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
@@ -789,9 +818,44 @@
             (FileName:    'amDuck'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
             Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true), // sprHandCreeper
             (FileName: 'amMinigun'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width:  64; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true) // sprMinigun
+            Width:  64; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true), // sprMinigun
+            (FileName:  'sliderInverted'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
+            Width: 3; Height: 17; imageWidth: 3; imageHeight: 17; saveSurf: false; critical: true; checkSum: false; priority: tpLow; getDimensions: false; getImageDimensions: false), // sprSliderInverted
+            (FileName:     'FingerBack'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
+            Width:  32; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true), // sprFingerBack
+            (FileName:     'FingerBackInv'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
+            Width:  32; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprFingerBackInv
+            (FileName:    'TargetpBack'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprTargetPBack
+            (FileName:    'TargetpBackInv'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprTargetPBackInv
+            (FileName:    'HealthHUD'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
+            Width:  18; Height: 18; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHealthHud
+            (FileName:    'HealthPoisonHUD'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
+            Width:  18; Height: 18; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHealthPoisonHud
+            (FileName:    'VampHUD'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
+            Width:  24; Height: 18; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprVampHUD
+            (FileName:    'KarmaHUD'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
+            Width:  18; Height: 18; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprKarmaHUD
+            (FileName:    'MedicHUD'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
+            Width:  18; Height: 18; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprMedicHud
+            (FileName:    'MedicPoisonHUD'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
+            Width:  18; Height: 18; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprMedicPoisonHud
+            (FileName:    'HaloHUD'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
+            Width:  22; Height: 11; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHaloHUD
+            (FileName:    'InvulnHUD'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
+            Width:  18; Height: 18; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprInvulnHUD
+            (FileName: 'amPiano'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
+            Width:  42; Height: 42; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAmPiano
+            (FileName:  'amLandGun'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
+            Width:  64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true), // sprHandLandGun
+            (FileName: 'amShoryuken'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
+            Width:  32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprFirePunch
+            (FileName: 'throughWrap'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
+            Width:  16; Height: 13; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true) // sprTroughWrap
             );
 
+
 const
     Wavez: array [TWave] of record
             Sprite: TSprite;
@@ -850,8 +914,8 @@
             minAngle: 0;
             maxAngle: 0;
             isDamaging: false;
-            SkipTurns: 9999;
-            PosCount: 1;
+            SkipTurns: 0;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -879,7 +943,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -907,7 +971,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -933,7 +997,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0; //20;
             ejectY: -6),
@@ -946,7 +1010,9 @@
             Ammo: (Propz: ammoprop_Power or
                           ammoprop_NeedTarget or
                           ammoprop_NoTargetAfter or
+                          ammoprop_NoWrapTarget or
                           ammoprop_DontHold or
+                          ammoprop_AltUse or
                           ammoprop_NeedUpDown;
                 Count: 2;
                 NumPerTurn: 0;
@@ -987,7 +1053,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0; //26;
             ejectY: -6),
@@ -1015,7 +1081,7 @@
             maxAngle: 0;
             isDamaging: false;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -1042,7 +1108,7 @@
             maxAngle: 0;
             isDamaging: false;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -1072,7 +1138,7 @@
             maxAngle: cMaxAngle div 2;
             isDamaging: false;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -1100,7 +1166,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -1124,7 +1190,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0; //23;
             ejectY: -6),
@@ -1151,7 +1217,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -1177,7 +1243,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -1201,7 +1267,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -1226,7 +1292,7 @@
             maxAngle: cMaxAngle div 2;
             isDamaging: true;
             SkipTurns: 2;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -1243,6 +1309,7 @@
                           ammoprop_DontHold or
                           ammoprop_Utility or
                           ammoprop_AltAttack or
+                          ammoprop_ShowSelIcon or
                           ammoprop_NeedUpDown;
                 Count: 2;
                 NumPerTurn: 0;
@@ -1257,7 +1324,7 @@
             maxAngle: 0;
             isDamaging: false;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -1277,7 +1344,7 @@
                 Timer: 0;
                 Pos: 0;
                 AmmoType: amAirAttack;
-                AttackVoice: sndIncoming;
+                AttackVoice: sndNone; // handled in doStepAirAttack
                 Bounciness: defaultBounciness);
             Slot: 5;
             TimeAfterTurn: 0;
@@ -1305,7 +1372,7 @@
                 Timer: 0;
                 Pos: 0;
                 AmmoType: amMineStrike;
-                AttackVoice: sndIncoming;
+                AttackVoice: sndNone; // handled in doStepAirAttack
                 Bounciness: defaultBounciness);
             Slot: 5;
             TimeAfterTurn: 0;
@@ -1339,7 +1406,7 @@
             maxAngle: 1327;
             isDamaging: false;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -1381,6 +1448,7 @@
                           ammoprop_NoCrosshair or
                           ammoprop_NeedTarget or
                           ammoprop_AttackingPut or
+                          ammoprop_AttackInMove or
                           ammoprop_Utility or
                           ammoprop_DontHold;
                 Count: 2;
@@ -1410,6 +1478,7 @@
                           ammoprop_ForwMsgs or
                           ammoprop_NoCrosshair or
                           ammoprop_Utility or
+                          ammoprop_ShowSelIcon or
                           ammoprop_DontHold;
                     Count: 3;
                     NumPerTurn: 0;
@@ -1424,7 +1493,7 @@
             maxAngle: 0;
             isDamaging: false;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -1448,7 +1517,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0; //20;
             ejectY: -6),
@@ -1476,7 +1545,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -1503,7 +1572,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 4;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -1529,7 +1598,7 @@
             maxAngle: 0;
             isDamaging: false;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -1556,7 +1625,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -1582,7 +1651,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -1602,7 +1671,7 @@
                 Timer: 0;
                 Pos: 0;
                 AmmoType: amNapalm;
-                AttackVoice: sndIncoming;
+                AttackVoice: sndNone; // handled in doStepAirAttack
                 Bounciness: defaultBounciness);
             Slot: 5;
             TimeAfterTurn: 0;
@@ -1636,7 +1705,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprDrill;
             ejectX: 0; //20;
             ejectY: -6),
@@ -1662,7 +1731,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0; //20;
             ejectY: -3),
@@ -1689,7 +1758,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 4;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -1703,6 +1772,7 @@
                           ammoprop_NoCrosshair or
                           ammoprop_DontHold or
                           ammoprop_AltUse or
+                          ammoprop_ShowSelIcon or
                           ammoprop_Utility or
                           ammoprop_Effect;
                     Count: 1;
@@ -1718,7 +1788,7 @@
             maxAngle: 0;
             isDamaging: false;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -1732,6 +1802,7 @@
                           ammoprop_NoCrosshair or
                           ammoprop_DontHold or
                           ammoprop_AltUse or
+                          ammoprop_ShowSelIcon or
                           ammoprop_Utility or
                           ammoprop_Effect;
                     Count: 1;
@@ -1747,7 +1818,7 @@
             maxAngle: 0;
             isDamaging: false;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -1761,6 +1832,7 @@
                           ammoprop_NoCrosshair or
                           ammoprop_DontHold or
                           ammoprop_AltUse or
+                          ammoprop_ShowSelIcon or
                           ammoprop_Utility or
                           ammoprop_Effect;
                     Count: 1;
@@ -1776,7 +1848,7 @@
             maxAngle: 0;
             isDamaging: false;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -1790,6 +1862,7 @@
                           ammoprop_NoCrosshair or
                           ammoprop_DontHold or
                           ammoprop_AltUse or
+                          ammoprop_ShowSelIcon or
                           ammoprop_Utility or
                           ammoprop_Effect;
                     Count: 1;
@@ -1805,7 +1878,7 @@
             maxAngle: 0;
             isDamaging: false;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -1819,6 +1892,7 @@
                           ammoprop_NoCrosshair or
                           ammoprop_DontHold or
                           ammoprop_AltUse or
+                          ammoprop_ShowSelIcon or
                           ammoprop_Utility or
                           ammoprop_NeedUpDown or
                           ammoprop_Effect;
@@ -1835,7 +1909,7 @@
             maxAngle: 0;
             isDamaging: false;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -1864,7 +1938,7 @@
             maxAngle: 0;
             isDamaging: false;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -1891,7 +1965,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0; //40;
             ejectY: -5),
@@ -1907,6 +1981,7 @@
                           ammoprop_DontHold or
                           ammoprop_Utility or
                           ammoprop_NeedUpDown or
+                          ammoprop_ShowSelIcon or
                           ammoprop_AltAttack;
                 Count: 1;
                 NumPerTurn: 0;
@@ -1921,7 +1996,7 @@
             maxAngle: 0;
             isDamaging: false;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -1947,7 +2022,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -1960,6 +2035,7 @@
             Ammo: (Propz: ammoprop_ForwMsgs or
                           ammoprop_NoCrosshair or
                           ammoprop_NeedUpDown or
+                          ammoprop_ShowSelIcon or
                           ammoprop_DontHold;
                 Count: 1;
                 NumPerTurn: 0;
@@ -1974,7 +2050,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -2002,7 +2078,7 @@
             maxAngle: 0;
             isDamaging: false;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: -5; //29;
             ejectY: -7),
@@ -2014,7 +2090,7 @@
             NumberInCase: 1;
             Ammo: (Propz: ammoprop_NoCrosshair or
                             ammoprop_NeedTarget or
-                            ammoprop_NoTargetAfter or
+                            // NoTargetAfter is handled manually in doStepPiano
                             ammoprop_AttackingPut or
                             ammoprop_DontHold or
                             ammoprop_NotBorder or
@@ -2024,7 +2100,7 @@
                 Timer: 0;
                 Pos: 0;
                 AmmoType: amPiano;
-                AttackVoice: sndIncoming;
+                AttackVoice: sndNone; // handled in doStepPiano
                 Bounciness: defaultBounciness);
             Slot: 5;
             TimeAfterTurn: 0;
@@ -2033,7 +2109,7 @@
             isDamaging: true;
             SkipTurns: 7;
             PosCount: 1;
-            PosSprite: sprWater;
+            PosSprite: sprAmPiano;
             ejectX: 0;
             ejectY: 0),
 
@@ -2060,7 +2136,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -2085,7 +2161,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -2111,7 +2187,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0; //20;
             ejectY: -3),
@@ -2137,7 +2213,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -2161,7 +2237,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -2188,7 +2264,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -2209,7 +2285,7 @@
                 Timer: 5000;
                 Pos: 0;
                 AmmoType: amDrillStrike;
-                AttackVoice: sndIncoming;
+                AttackVoice: sndNone; // handled in doStepAirAttack
                 Bounciness: defaultBounciness);
             Slot: 5;
             TimeAfterTurn: 0;
@@ -2244,7 +2320,7 @@
             maxAngle: 0;
             isDamaging: false;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -2257,6 +2333,7 @@
             Ammo: (Propz: ammoprop_ForwMsgs or
                           ammoprop_NoCrosshair or
                           ammoprop_Utility or
+                          ammoprop_ShowSelIcon or
                           ammoprop_DontHold or
                           ammoprop_ForceTurnEnd;
                 Count: 2;
@@ -2298,7 +2375,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0; //20;
             ejectY: -3),
@@ -2323,7 +2400,7 @@
             maxAngle: 0;
             isDamaging: false;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0; //20;
             ejectY: -3),
@@ -2348,7 +2425,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -2400,7 +2477,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0;
             ejectY: 0),
@@ -2428,7 +2505,7 @@
             maxAngle: 0;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 15;
             ejectY: -7),
@@ -2451,7 +2528,7 @@
             maxAngle: 5 * cMaxAngle div 6;
             isDamaging: true;
             SkipTurns: 0;
-            PosCount: 1;
+            PosCount: 0;
             PosSprite: sprWater;
             ejectX: 0; //23;
             ejectY: 0) //-6;
@@ -2478,18 +2555,19 @@
     SpeechType: Longword;
     SpeechText: shortstring;
     PlacingHogs: boolean; // a convenience flag to indicate placement of hogs is still in progress
+    PlacingKings: boolean; // a convenience flag to indicate placement of kings in King Mode is still in progress
     StepSoundTimer: LongInt;
     StepSoundChannel: LongInt;
 
     CurrentTeam: PTeam;
     PreviousTeam: PTeam;
+    MissionTeam: PTeam;
     CurrentHedgehog: PHedgehog;
     TeamsArray: array[0..Pred(cMaxTeams)] of PTeam;
     TeamsCount: Longword; // number of teams on game start
     VisibleTeamsCount: Longword; // number of teams visible in team bar
     ClansArray, SpawnClansArray: TClansArray;
     ClansCount: Longword;
-    LocalClan: LongInt;  // last non-bot, non-extdriven clan
     LocalTeam: LongInt;  // last non-bot, non-extdriven clan first team
     LocalAmmo: LongInt;  // last non-bot, non-extdriven clan's first team's ammo index, updated to next upcoming hog for per-hog-ammo
     CurMinAngle, CurMaxAngle: Longword;
@@ -2499,6 +2577,7 @@
     bShowAmmoMenu: boolean;
     bSelected: boolean;
     bShowFinger: boolean;
+    bShowSwitcher: boolean;
     Frames: Longword;
     WaterColor, DeepWaterColor: TSDL_Color;
     SDTint, SkyColor, RQSkyColor, SDSkyColor: TSDL_Color;
@@ -2558,6 +2637,8 @@
     aTexCoord: GLint;
     aColor: GLint;
 
+    lDecimalSeparator: Char;
+
 var trammo:  array[TAmmoStrId] of ansistring;   // name of the weapon
     trammoc: array[TAmmoStrId] of ansistring;   // caption of the weapon
     trammod: array[TAmmoStrId] of ansistring;   // description of the weapon
@@ -2585,14 +2666,16 @@
     cFullscreenHeight := 0;
     cWindowedWidth    := 1024;
     cWindowedHeight   := 768;
+    cWindowedMaximized:= false;
     cScreenWidth      := cWindowedWidth;
     cScreenHeight     := cWindowedHeight;
 
     cShowFPS        := false;
     cAltDamage      := false;
+    cHolidaySilliness := true;
     cTimerInterval  := 8;
     cReducedQuality := rqNone;
-    cLocaleFName    := 'en.txt';
+    cLanguageFName  := 'en.txt';
     cFullScreen     := false;
 
     UserPathPrefix  := '';
@@ -2608,6 +2691,22 @@
     cScriptParam    := '';
     cTestLua        := False;
 
+    UserZoom        := cDefaultZoomLevel;
+    zoom            := cDefaultZoomLevel;
+    ZoomValue       := cDefaultZoomLevel;
+
+{$IFDEF MOBILE}
+    cMaxZoomLevel   := 0.5;
+    cMinZoomLevel   := 3.5;
+    cZoomDelta      := 0.20;
+    cZoomDeltaSmall := 0.10;
+{$ELSE}
+    cMaxZoomLevel   := 1.0;
+    cMinZoomLevel   := 3.0;
+    cZoomDelta      := 0.25;
+    cZoomDeltaSmall := 0.125;
+{$ENDIF}
+
 {$IFDEF USE_VIDEO_RECORDING}
     RecPrefix          := '';
     cAVFormat          := '';
@@ -2647,8 +2746,8 @@
     Move(AmmozInit, Ammoz, sizeof(Ammoz));
 
 
-    cLocale:= cLocaleFName;
-    SplitByChar(cLocale, s, '.');
+    cLanguage:= cLanguageFName;
+    SplitByChar(cLanguage, s, '.');
 
     cFlattenFlakes      := false;
     cFlattenClouds      := false;
@@ -2761,23 +2860,17 @@
     cDamageModifier         := _1;
     TargetPoint             := cTargetPointRef;
 
-{$IFDEF MOBILE}
-    cMaxZoomLevel:= 0.5;
-    cMinZoomLevel:= 3.5;
-    cZoomDelta:= 0.20;
-{$ELSE}
-    cMaxZoomLevel:= 1.0;
-    cMinZoomLevel:= 3.0;
-    cZoomDelta:= 0.25;
-    {$ENDIF}
-
     aVertex:= 0;
     aTexCoord:= 1;
     aColor:= 2;
 
+    lDecimalSeparator       := '.';
+
 
     cMinMaxZoomLevelDelta:= cMaxZoomLevel - cMinZoomLevel;
 
+    cDemoClockFPSOffsetY := 0;
+
     // int, longint longword and byte
     CursorMovementX     := 0;
     CursorMovementY     := 0;
@@ -2798,12 +2891,16 @@
     TurnClockActive     := true;
     TagTurnTimeLeft     := 0;
     cSuddenDTurns       := 15;
+    LastSuddenDWarn     := -2;
+    cInitHealth         := 100;
     cDamagePercent      := 100;
     cRopePercent        := 100;
+    cRopeNodeStep       := 4;
+    cRopeLayers         := 1;
     cGetAwayTime        := 100;
     cMineDudPercent     := 0;
     cTemplateFilter     := 0;
-    cFeatureSize        := 50;
+    cFeatureSize        := 12;
     cMapGen             := mgRandom;
     cHedgehogTurnTime   := 45000;
     cMinesTime          := 3000;
@@ -2826,8 +2923,6 @@
     cExplosives     := 2;
 
     GameState       := Low(TGameState);
-    zoom            := cDefaultZoomLevel;
-    ZoomValue       := cDefaultZoomLevel;
     WeaponTooltipTex:= nil;
     cLaserSighting  := false;
     cLaserSightingSniper := false;
@@ -2844,6 +2939,7 @@
     isSpeed         := false;
     isAFK           := false;
     isShowMission   := false;
+    isShowGearInfo  := false;
     isForceMission  := false;
     SpeedStart      := 0;
     fastUntilLag    := false;
@@ -2852,6 +2948,8 @@
     cSeed           := '';
     cIsSoundEnabled := false;
     cVolumeDelta    := 0;
+    cVolumeUpKey    := false;
+    cVolumeDownKey  := false;
     cMuteToggle     := false;
     cHasFocus       := true;
     cInactDelay     := 100;
@@ -2915,6 +3013,8 @@
     LuaEndTurnRequested:= false;
     LuaNoEndTurnTaunts:= false;
 
+    LuaCmdUsed:= false;
+
     for t:= Low(TSound) to High(TSound) do
         MaskedSounds[t]:= false;
 
@@ -2935,6 +3035,7 @@
     GearsList:= nil;
     CurrentTeam:= nil;
     PreviousTeam:= nil;
+    MissionTeam:= nil;
     CurrentHedgehog:= nil;
     FollowGear:= nil;
     lastVisualGearByUID:= nil;
--- a/hedgewars/uVideoRec.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uVideoRec.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -36,7 +36,7 @@
 var flagPrerecording: boolean = false;
 
 function BeginVideoRecording: Boolean;
-function LoadNextCameraPosition(out newRealTicks, newGameTicks: LongInt): Boolean;
+function LoadNextCameraPosition(var newRealTicks, newGameTicks: LongInt): Boolean;
 procedure EncodeFrame;
 procedure StopVideoRecording;
 
@@ -48,7 +48,7 @@
 procedure freeModule;
 
 implementation
-uses uVariables, GLunit, SDLh, SysUtils, uUtils, uIO, uMisc, uConsts, uTypes, uDebug;
+uses uVariables, GLunit, SDLh, SysUtils, uUtils, uSound, uIO, uMisc, uTypes, uDebug;
 
 type TAddFileLogRaw = procedure (s: pchar); cdecl;
 const AvwrapperLibName = 'libavwrapper';
@@ -68,7 +68,8 @@
               end;
 
 var RGB_Buffer: PByte;
-    cameraFile: File of TFrame;
+    cameraFile: File;
+    cameraFileName: shortstring;
     audioFile: File;
     numPixels: LongWord;
     startTime, numFrames, curTime, progress, maxProgress: LongWord;
@@ -78,18 +79,19 @@
 
 function BeginVideoRecording: Boolean;
 var filename, desc: shortstring;
+    filenameA, descA, soundFilePathA, cAVFormatA, cVideoCodecA, cAudioCodecA: ansistring;
 begin
     AddFileLog('BeginVideoRecording');
 
 {$IOCHECKS OFF}
     // open file with prerecorded camera positions
-    filename:= UserPathPrefix + '/VideoTemp/' + RecPrefix + '.txtin';
-    Assign(cameraFile, filename);
-    Reset(cameraFile);
+    cameraFileName:= shortstring(UserPathPrefix) + '/VideoTemp/' + shortstring(RecPrefix) + '.txtin';
+    Assign(cameraFile, cameraFileName);
+    Reset(cameraFile, SizeOf(TFrame));
     maxProgress:= FileSize(cameraFile);
     if IOResult <> 0 then
     begin
-        AddFileLog('Error: Could not read from ' + filename);
+        AddFileLog('Error: Could not read from ' + cameraFileName);
         exit(false);
     end;
 {$IOCHECKS ON}
@@ -113,21 +115,27 @@
         desc:= desc + 'Theme: ' + Theme + #10;
     desc:= desc + 'prefix[' + RecPrefix + ']prefix';
 
-    filename:= UserPathPrefix + '/VideoTemp/' + RecPrefix;
+    filename:= shortstring(UserPathPrefix) + '/VideoTemp/' + shortstring(RecPrefix);
 
     recordAudio:= (cAudioCodec <> 'no');
     if recordAudio then
-        soundFilePath:= UserPathPrefix + '/VideoTemp/' + RecPrefix + '.sw'
+        soundFilePath:= shortstring(UserPathPrefix) + '/VideoTemp/' + shortstring(RecPrefix) + '.sw'
     else
         soundFilePath:= '';
 
+    filenameA:= ansistring(filename);
+    descA:= ansistring(desc);
+    soundFilePathA:= ansistring(soundFilePath);
+    cAVFormatA:= ansistring(cAVFormat);
+    cVideoCodecA:= ansistring(cVideoCodec);
+    cAudioCodecA:= ansistring(cAudioCodec);
     if checkFails(AVWrapper_Init(@AddFileLogRaw
-        , PChar(ansistring(filename))
-        , PChar(ansistring(desc))
-        , PChar(ansistring(soundFilePath))
-        , PChar(ansistring(cAVFormat))
-        , PChar(ansistring(cVideoCodec))
-        , PChar(ansistring(cAudioCodec))
+        , PChar(filenameA)
+        , PChar(descA)
+        , PChar(soundFilePathA)
+        , PChar(cAVFormatA)
+        , PChar(cVideoCodecA)
+        , PChar(cAudioCodecA)
         , cScreenWidth, cScreenHeight, cVideoFramerateNum, cVideoFramerateDen, cVideoQuality) >= 0,
         'AVWrapper_Init failed',
         true) then exit(false);
@@ -154,14 +162,11 @@
     Close(cameraFile);
     if AVWrapper_Close() < 0 then
         begin
-        AddFileLog('AVWrapper_Close() has failed.');
-        halt(HaltVideoRec);
+        OutError('AVWrapper_Close() has failed.', true);
         end;
 {$IOCHECKS OFF}
-    // Provoke IOResult to be set
-    FileSize(cameraFile);
-    if IOResult = 0 then
-        Erase(cameraFile)
+    if FileExists(cameraFileName) then
+        DeleteFile(cameraFileName)
     else
         AddFileLog('Warning: Tried to delete the cameraFile but it was already deleted');
 {$IOCHECKS ON}
@@ -178,8 +183,7 @@
 
     if AVWrapper_WriteFrame(RGB_Buffer) < 0 then
         begin
-        AddFileLog('AVWrapper_WriteFrame(RGB_Buffer) has failed.');
-        halt(HaltVideoRec);
+        OutError('AVWrapper_WriteFrame(RGB_Buffer) has failed.', true);
         end;
 
     // inform frontend that we have encoded new frame
@@ -190,16 +194,18 @@
     inc(numFrames);
 end;
 
-function LoadNextCameraPosition(out newRealTicks, newGameTicks: LongInt): Boolean;
+function LoadNextCameraPosition(var newRealTicks, newGameTicks: LongInt): Boolean;
 var frame: TFrame = (realTicks: 0; gameTicks: 0; CamX: 0; CamY: 0; zoom: 0);
+    res: LongInt;
 begin
     // we need to skip or duplicate frames to match target framerate
     while Int64(curTime)*cVideoFramerateNum <= Int64(numFrames)*cVideoFramerateDen*1000 do
     begin
+    res:= 0;
     {$IOCHECKS OFF}
         if eof(cameraFile) then
             exit(false);
-        BlockRead(cameraFile, frame, 1);
+        BlockRead(cameraFile, frame, 1, res);
     {$IOCHECKS ON}
         curTime:= frame.realTicks;
         WorldDx:= frame.CamX;
@@ -216,10 +222,12 @@
 // Callback which records sound.
 // This procedure may be called from different thread.
 procedure RecordPostMix(udata: pointer; stream: PByte; len: LongInt); cdecl;
+var result: LongInt;
 begin
+    result:= 0; // avoid warning
     udata:= udata; // avoid warning
 {$IOCHECKS OFF}
-    BlockWrite(audioFile, stream^, len);
+    BlockWrite(audioFile, stream^, len, result);
 {$IOCHECKS ON}
 end;
 
@@ -227,7 +235,7 @@
 var thumbpath: shortstring;
     k: LongInt;
 begin
-    thumbpath:= '/VideoTemp/' + RecPrefix;
+    thumbpath:= '/VideoThumbnails/' + RecPrefix;
     AddFileLog('Saving thumbnail ' + thumbpath);
     k:= max(max(cScreenWidth, cScreenHeight) div 400, 1); // here 400 is minimum size of thumbnail
     MakeScreenshot(thumbpath, k, 0);
@@ -238,11 +246,12 @@
 procedure CopyFile(src, dest: shortstring);
 var inF, outF: file;
     buffer: array[0..1023] of byte;
-    result: LongInt;
+    result, result2: LongInt;
     i: integer;
 begin
 {$IOCHECKS OFF}
     result:= 0; // avoid compiler hint and warning
+    result2:= 0; // avoid compiler hint and warning
     for i:= 0 to 1023 do
         buffer[i]:= 0;
 
@@ -264,7 +273,7 @@
 
     repeat
         BlockRead(inF, buffer, 1024, result);
-        BlockWrite(outF, buffer, result);
+        BlockWrite(outF, buffer, result, result2);
     until result < 1024;
 {$IOCHECKS ON}
 end;
@@ -273,11 +282,21 @@
 var format: word;
     filename: shortstring;
     frequency, channels: LongInt;
+    result: LongInt;
 begin
+    result:= 0;
     AddFileLog('BeginPreRecording');
+    // Videos don't work if /lua command was used, so we forbid them
+    if luaCmdUsed then
+        begin
+        // TODO: Show message to player
+        PlaySound(sndDenied);
+        AddFileLog('Pre-recording prevented; /lua command was used before');
+        exit;
+        end;
 
     thumbnailSaved:= false;
-    RecPrefix:= 'hw-' + FormatDateTime('YYYY-MM-DD_HH-mm-ss-z', Now());
+    RecPrefix:= 'hw-' + FormatDateTime('YYYY-MM-DD_HH-mm-ss-z', TDateTime(Now()));
 
     // If this video is recorded from demo executed directly (without frontend)
     // then we need to copy demo so that frontend will be able to find it later.
@@ -285,7 +304,7 @@
     begin
         if GameType <> gmtDemo then // this is save and game demo is not recording, abort
             exit;
-        CopyFile(recordFileName, UserPathPrefix + '/VideoTemp/' + RecPrefix + '.hwd');
+        CopyFile(recordFileName, shortstring(UserPathPrefix) + '/VideoTemp/' + shortstring(RecPrefix) + '.hwd');
     end;
 
     if cIsSoundEnabled then
@@ -301,7 +320,7 @@
 
 {$IOCHECKS OFF}
         // create sound file
-        filename:= UserPathPrefix + '/VideoTemp/' + RecPrefix + '.sw';
+        filename:= shortstring(UserPathPrefix) + '/VideoTemp/' + shortstring(RecPrefix) + '.sw';
         Assign(audioFile, filename);
         Rewrite(audioFile, 1);
         if IOResult <> 0 then
@@ -312,9 +331,9 @@
         end;
 
     // create file with camera positions
-    filename:= UserPathPrefix + '/VideoTemp/' + RecPrefix + '.txtout';
+    filename:= shortstring(UserPathPrefix) + '/VideoTemp/' + shortstring(RecPrefix) + '.txtout';
     Assign(cameraFile, filename);
-    Rewrite(cameraFile);
+    Rewrite(cameraFile, SizeOf(TFrame));
     if IOResult <> 0 then
         begin
         AddFileLog('Error: Could not write to ' + filename);
@@ -324,8 +343,8 @@
     if cIsSoundEnabled then
         begin
         // save audio parameters in sound file
-        BlockWrite(audioFile, frequency, 4);
-        BlockWrite(audioFile, channels, 4);
+        BlockWrite(audioFile, frequency, 4, result);
+        BlockWrite(audioFile, channels, 4, result);
 {$IOCHECKS ON}
 
         // register callback for actual audio recording
@@ -360,7 +379,9 @@
 
 procedure SaveCameraPosition;
 var frame: TFrame;
+    result: LongInt;
 begin
+    result:= 0;
     if (not thumbnailSaved) and (ScreenFade = sfNone) then
         SaveThumbnail();
 
@@ -369,7 +390,7 @@
     frame.CamX:= WorldDx;
     frame.CamY:= WorldDy - cScreenHeight div 2;
     frame.zoom:= zoom/cScreenWidth;
-    BlockWrite(cameraFile, frame, 1);
+    BlockWrite(cameraFile, frame, 1, result);
 end;
 
 procedure initModule;
--- a/hedgewars/uVisualGears.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uVisualGears.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -74,7 +74,7 @@
 
 for i:= 0 to 6 do
     begin
-    t:= VisualGearLayers[i];
+    t:= VisualGearLayersStart[i];
     while t <> nil do
         begin
         Gear:= t;
@@ -93,7 +93,7 @@
 for i:= 2 to 6 do
     if i <> 3 then
         begin
-        t:= VisualGearLayers[i];
+        t:= VisualGearLayersStart[i];
         while t <> nil do
             begin
             Gear:= t;
@@ -154,7 +154,7 @@
 case Layer of
     // this layer is very distant in the background when stereo
     0: begin
-        Gear:= VisualGearLayers[0];
+        Gear:= VisualGearLayersStart[0];
         while Gear <> nil do
             begin
             if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
@@ -189,10 +189,9 @@
        end;
     // this layer is on the land level (which is close but behind the screen plane) when stereo
     1: begin
-       Gear:= VisualGearLayers[1];
+       Gear:= VisualGearLayersStart[1];
        while Gear <> nil do
           begin
-          //tinted:= false;
           if Gear^.Tint <> $FFFFFFFF then
               Tint(Gear^.Tint);
           case Gear^.Kind of
@@ -227,14 +226,13 @@
                              if Gear^.Angle <> 0 then
                                 DrawTextureRotatedF(spriteData^.Texture, Gear^.scale, 0, 0, round(Gear^.X + WorldDx + (((spriteData^.Height+8)*Gear^.Scale)/2) * (Gear^.Angle / abs(Gear^.Angle))), round(Gear^.Y + WorldDy), 19 - (Gear^.FrameTicks div Gear^.Timer div 37), 1, spriteData^.Width, spriteData^.Height, Gear^.Angle)
                              else
-                                //DrawSprite(sprite, round(Gear^.X) + WorldDx - 40, round(Gear^.Y) + WorldDy - 58, 19 - (Gear^.FrameTicks div 37))
                                 DrawTextureF(spriteData^.Texture, Gear^.scale, round(Gear^.X + WorldDx), round(Gear^.Y + WorldDy - ((spriteData^.Height+8)*Gear^.Scale)/2), 19 - (Gear^.FrameTicks div Gear^.Timer div 37), 1, spriteData^.Width, spriteData^.Height);
                              end;
                   vgtDroplet: begin
                               sprite:= GetSprite(sprDroplet, sprSDDroplet);
                               DrawSprite(sprite, round(Gear^.X) + WorldDx - 8, round(Gear^.Y) + WorldDy - 8, Gear^.Frame);
                               end;
-                  vgtBubble: DrawSprite(sprBubbles, round(Gear^.X) + WorldDx - 8, round(Gear^.Y) + WorldDy - 8, Gear^.Frame);//(RealTicks div 64 + Gear^.Frame) mod 8);
+                  vgtBubble: DrawSprite(sprBubbles, round(Gear^.X) + WorldDx - 8, round(Gear^.Y) + WorldDy - 8, Gear^.Frame);
                vgtStraightShot: begin
                                 if Gear^.dX < 0 then
                                     i:= -1
@@ -243,7 +241,6 @@
                                 DrawTextureRotatedF(SpritesData[TSprite(Gear^.State)].Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, i, SpritesData[TSprite(Gear^.State)].Width, SpritesData[TSprite(Gear^.State)].Height, Gear^.Angle);
                                 end;
               end;
-          //if (Gear^.Tint <> $FFFFFFFF) or tinted then untint;
           if (Gear^.Tint <> $FFFFFFFF) then
               untint;
           Gear:= Gear^.NextGear
@@ -251,21 +248,13 @@
        end;
     // this layer is on the screen plane (depth = 0) when stereo
     3: begin
-       Gear:= VisualGearLayers[3];
+       Gear:= VisualGearLayersStart[3];
        while Gear <> nil do
            begin
            tinted:= false;
            if Gear^.Tint <> $FFFFFFFF then
                Tint(Gear^.Tint);
            case Gear^.Kind of
-(*
-              vgtFlake: begin
-                        sprite:= GetSprite(sprFlake, sprSDFlake);
-                        if speedlessFlakes then
-                            DrawSprite(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
-                        else
-                            DrawSpriteRotatedF(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle)
-                        end;*)
                vgtSpeechBubble: if (Gear^.Angle <> 0) then
                                 // ^ Before this gear renders, Angle must be set to mark it ready (e.g. coordinates properly initialized)
                                     if (Gear^.Tex <> nil) and (((Gear^.State = 0) and (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.Team <> CurrentTeam)) or (Gear^.State = 1)) then
@@ -318,7 +307,7 @@
        end;
     // this layer is outside the screen when stereo
     2: begin
-       Gear:= VisualGearLayers[2];
+       Gear:= VisualGearLayersStart[2];
        while Gear <> nil do
            begin
            tinted:= false;
@@ -393,7 +382,7 @@
        end;
      // this layer is half-way between the screen plane (depth = 0) when in stereo, and the land
      4: begin
-        Gear:= VisualGearLayers[4];
+        Gear:= VisualGearLayersStart[4];
         while Gear <> nil do
             begin
             if Gear^.Tint <> $FFFFFFFF then
@@ -419,7 +408,7 @@
         end;
      // this layer is on the screen plane (depth = 0) when stereo, but just behind the land
      5: begin
-        Gear:= VisualGearLayers[5];
+        Gear:= VisualGearLayersStart[5];
         while Gear <> nil do
             begin
             if Gear^.Tint <> $FFFFFFFF then
@@ -445,7 +434,7 @@
         end;
      // this layer is on the screen plane (depth = 0) when stereo, but just in front of the land
     6: begin
-        Gear:= VisualGearLayers[6];
+        Gear:= VisualGearLayersStart[6];
         while Gear <> nil do
             begin
             if Gear^.Tint <> $FFFFFFFF then
@@ -485,7 +474,7 @@
     exit;
 for i:= 0 to 6 do
     begin
-    vg:= VisualGearLayers[i];
+    vg:= VisualGearLayersStart[i];
     while vg <> nil do
         if vg^.Kind = vgtCloud then
             begin
@@ -525,7 +514,7 @@
     exit;
 for i:= 0 to 6 do
     begin
-    vg:= VisualGearLayers[i];
+    vg:= VisualGearLayersStart[i];
     while vg <> nil do
         if vg^.Kind = vgtFlake then
             begin
@@ -548,7 +537,10 @@
 begin
 VGCounter:= 0;
 for i:= 0 to 6 do
-    VisualGearLayers[i]:= nil;
+    begin
+    VisualGearLayersStart[i]:= nil;
+    VisualGearLayersEnd[i]:= nil;
+    end;
 end;
 
 procedure freeModule;
@@ -556,7 +548,7 @@
 begin
 VGCounter:= 0;
 for i:= 0 to 6 do
-    while VisualGearLayers[i] <> nil do DeleteVisualGear(VisualGearLayers[i]);
+    while VisualGearLayersStart[i] <> nil do DeleteVisualGear(VisualGearLayersStart[i]);
 end;
 
 end.
--- a/hedgewars/uVisualGearsHandlers.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uVisualGearsHandlers.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -246,7 +246,6 @@
 
 Gear^.X:= Gear^.X + Gear^.dX * s;
 Gear^.Y:= Gear^.Y + Gear^.dY * s;
-//Gear^.dY:= Gear^.dY + cGravityf;
 
 if Gear^.FrameTicks <= Steps then
     if Gear^.Frame = 0 then
@@ -317,7 +316,7 @@
 begin
 Gear^.X:= Gear^.X + Gear^.dX * Steps;
 
-Gear^.Y:= Gear^.Y + Gear^.dY * Steps;// + cGravityf * (Steps * Steps);
+Gear^.Y:= Gear^.Y + Gear^.dY * Steps;
 if (Gear^.State and gstTmpFlag) = 0 then
     begin
     Gear^.dY:= Gear^.dY + cGravityf * Steps;
@@ -421,7 +420,6 @@
 Gear^.Y:= Gear^.Y - (cDrownSpeedf + Gear^.dY) * Steps;
 
 Gear^.dX := Gear^.dX + (cWindSpeedf * 0.3 * Steps);
-//Gear^.dY := Gear^.dY - (cDrownSpeedf * 0.995);
 
 if Gear^.FrameTicks <= Steps then
     if Gear^.Frame = 0 then
@@ -472,7 +470,7 @@
 Gear^.Y:= Gear^.Y + Gear^.dY * Steps;
 Gear^.dY:= Gear^.dY + cGravityf * Steps;
 
-if round(Gear^.Y) > cWaterLine then
+if CheckCoordInWater(round(Gear^.X), round(Gear^.Y)) then
     begin
     DeleteVisualGear(Gear);
     PlaySound(TSound(ord(sndDroplet1) + Random(3)));
@@ -624,7 +622,6 @@
 Gear^.Timer:= cSorterWorkTime;
 Gear^.doStep:= @doStepTeamHealthSorterWork;
 currsorter:= Gear;
-//doStepTeamHealthSorterWork(Gear, Steps)
 end;
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -709,8 +706,10 @@
 if round(Gear^.Y) - 10 < cWaterLine then
     DeleteVisualGear(Gear)
 else
-    Gear^.Y:= Gear^.Y - 0.08 * Steps;
-
+    begin
+    Gear^.X:= Gear^.X + Gear^.dX * Steps;
+    Gear^.Y:= Gear^.Y + Gear^.dY * Steps;
+    end;
 end;
 
 procedure doStepHealthTag(Gear: PVisualGear; Steps: Longword);
@@ -725,7 +724,7 @@
 
 Gear^.doStep:= @doStepHealthTagWork;
 
-if (round(Gear^.Y) > cWaterLine) and (Gear^.Frame = 0)  then
+if (round(Gear^.Y) > cWaterLine) and (Gear^.Frame = 0) and (Gear^.FrameTicks = 0) then
     Gear^.doStep:= @doStepHealthTagWorkUnderWater;
 
 Gear^.Y:= Gear^.Y - Gear^.Tex^.h;
@@ -849,9 +848,10 @@
 
 Gear^.Angle:= round(Gear^.Angle + Steps) mod cMaxAngle;
 
-if (round(Gear^.Y) > cWaterLine) and ((cReducedQuality and rqPlainSplash) = 0) then
+if CheckCoordInWater(round(Gear^.X), round(Gear^.Y)) then
     begin
-    AddVisualGear(round(Gear^.X), round(Gear^.Y), vgtDroplet);
+    if ((cReducedQuality and rqPlainSplash) = 0) then
+        AddVisualGear(round(Gear^.X), round(Gear^.Y), vgtDroplet);
     DeleteVisualGear(Gear);
     end
 end;
@@ -900,6 +900,7 @@
     currwindbar: PVisualGear = nil;
 
 procedure doStepSmoothWindBarWork(Gear: PVisualGear; Steps: Longword);
+const maxWindBarWidth = 73;
 begin
     if currwindbar = Gear then
     begin
@@ -912,6 +913,11 @@
             inc(WindBarWidth)
         else if WindBarWidth > Gear^.Tag then
             dec(WindBarWidth);
+        // Prevent wind bar from overflowing
+        if WindBarWidth > maxWindBarWidth then
+            WindBarWidth:= maxWindBarWidth;
+        if WindBarWidth < - maxWindBarWidth then
+            WindBarWidth:= - maxWindBarWidth;
         end;
     if cWindspeedf > Gear^.dAngle then
         begin
@@ -925,7 +931,7 @@
         end;
     end;
 
-    if ((WindBarWidth = Gear^.Tag) and (cWindspeedf = Gear^.dAngle)) or (currwindbar <> Gear) then
+    if (((WindBarWidth = Gear^.Tag) or (Abs(WindBarWidth) >= maxWindBarWidth)) and (cWindspeedf = Gear^.dAngle)) or (currwindbar <> Gear) then
     begin
         if currwindbar = Gear then currwindbar:= nil;
         DeleteVisualGear(Gear)
--- a/hedgewars/uVisualGearsList.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uVisualGearsList.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -33,7 +33,8 @@
     cExplFrameTicks = 110;
 
 var VGCounter: LongWord;
-    VisualGearLayers: array[0..6] of PVisualGear;
+    VisualGearLayersStart: array[0..6] of PVisualGear;
+    VisualGearLayersEnd: array[0..6] of PVisualGear;
 
 implementation
 uses uCollisions, uFloat, uVariables, uConsts, uTextures, uVisualGearsHandlers, uScript;
@@ -76,6 +77,7 @@
     vgtSpeechBubble,
     vgtHealthTag,
     vgtExplosion,
+    vgtBigExplosion,
     vgtSmokeTrace,
     vgtEvilTrace,
     vgtNote,
@@ -231,9 +233,6 @@
                 end;
     vgtDroplet:
                 begin
-                // old dx & dy calcs
-                // dx:= 0.001 * (random(180) - 90);
-                // dy:= -0.001 * (random(160) + 40);
                 // => min speed ~ 0.098, max speed ~ 0.218, speed range ~ 0.120
                 // => min angle(4096) ~ 129, max angle ~ 1919, angle range ~ 1790
                 dx:= 0.001 * (98 + random(121)); // speed
@@ -276,10 +275,10 @@
   vgtHealthTag:
                 begin
                 Frame:= 0;
+                FrameTicks:= 0;
                 Timer:= 1500;
                 dY:= -0.08;
                 dX:= 0;
-                //gear^.Z:= 2002;
                 end;
   vgtSmokeTrace,
   vgtEvilTrace:
@@ -287,7 +286,6 @@
                 gear^.X:= gear^.X - 16;
                 gear^.Y:= gear^.Y - 16;
                 gear^.State:= 8;
-                //gear^.Z:= cSmokeZ
                 end;
 vgtBigExplosion:
                 begin
@@ -433,12 +431,15 @@
 
 if Layer <> -1 then gear^.Layer:= Layer;
 
-if VisualGearLayers[gear^.Layer] <> nil then
+if VisualGearLayersStart[gear^.Layer] = nil then
+    VisualGearLayersStart[gear^.Layer]:= gear;
+
+if VisualGearLayersEnd[gear^.Layer] <> nil then
     begin
-    VisualGearLayers[gear^.Layer]^.PrevGear:= gear;
-    gear^.NextGear:= VisualGearLayers[gear^.Layer]
+    VisualGearLayersEnd[gear^.Layer]^.NextGear:= gear;
+    gear^.PrevGear:= VisualGearLayersEnd[gear^.Layer]
     end;
-VisualGearLayers[gear^.Layer]:= gear;
+VisualGearLayersEnd[gear^.Layer]:= gear;
 
 AddVisualGear:= gear;
 ScriptCall('onVisualGearAdd', gear^.uid);
@@ -449,12 +450,19 @@
     ScriptCall('onVisualGearDelete', Gear^.uid);
     FreeAndNilTexture(Gear^.Tex);
 
-    if Gear^.NextGear <> nil then
-        Gear^.NextGear^.PrevGear:= Gear^.PrevGear;
+    if (Gear^.NextGear = nil) and (Gear^.PrevGear = nil) then
+        begin
+        VisualGearLayersStart[Gear^.Layer]:= nil;
+        VisualGearLayersEnd[Gear^.Layer]:= nil;
+        end;
     if Gear^.PrevGear <> nil then
         Gear^.PrevGear^.NextGear:= Gear^.NextGear
-    else
-        VisualGearLayers[Gear^.Layer]:= Gear^.NextGear;
+    else if Gear^.NextGear <> nil then
+        VisualGearLayersStart[Gear^.Layer]:= Gear^.NextGear;
+    if Gear^.NextGear <> nil then
+        Gear^.NextGear^.PrevGear:= Gear^.PrevGear
+    else if Gear^.PrevGear <> nil then
+        VisualGearLayersEnd[Gear^.Layer]:= Gear^.PrevGear;
 
     if lastVisualGearByUID = Gear then
         lastVisualGearByUID:= nil;
@@ -477,7 +485,7 @@
 // search in an order that is more likely to return layers they actually use.  Could perhaps track statistically AddVisualGear in uScript, since that is most likely the ones they want
 for i:= 2 to 5 do
     begin
-    vg:= VisualGearLayers[i mod 4];
+    vg:= VisualGearLayersStart[i mod 4];
     while vg <> nil do
         begin
         if vg^.uid = uid then
--- a/hedgewars/uWorld.pas	Mon Jan 14 15:11:15 2019 -0500
+++ b/hedgewars/uWorld.pas	Fri Aug 16 10:59:50 2019 -0600
@@ -42,6 +42,7 @@
 procedure MoveCamera;
 procedure onFocusStateChanged;
 procedure updateCursorVisibility;
+procedure updateTouchWidgets(ammoType: TAmmoType);
 
 implementation
 uses
@@ -63,6 +64,7 @@
     , uCommands
     , uTeams
     , uDebug
+    , uInputHandler
 {$IFDEF USE_VIDEO_RECORDING}
     , uVideoRec
 {$ENDIF}
@@ -76,7 +78,7 @@
     timeTexture: PTexture;
     FPS: Longword;
     CountTicks: Longword;
-    prevPoint{, prevTargetPoint}: TPoint;
+    prevPoint: TPoint;
     amSel: TAmmoType = amNothing;
     missionTex: PTexture;
     missionTimer: LongInt;
@@ -105,7 +107,6 @@
       AMTypeMaskX     = $00000001;
       AMTypeMaskY     = $00000002;
       AMTypeMaskAlpha = $00000004;
-      //AMTypeMaskSlide = $00000008;
 
 {$IFDEF MOBILE}
       AMSlotSize = 48;
@@ -114,6 +115,22 @@
 {$ENDIF}
       AMSlotPadding = (AMSlotSize - 32) shr 1;
 
+{$IFDEF USE_LANDSCAPE_AMMOMENU}
+      amNumOffsetX = 0;
+      {$IFDEF USE_AM_NUMCOLUMN}
+      amNumOffsetY = AMSlotSize;
+      {$ELSE}
+      amNumOffsetY = 0;
+      {$ENDIF}
+{$ELSE}
+      amNumOffsetY = 0;
+      {$IFDEF USE_AM_NUMCOLUMN}
+      amNumOffsetX = AMSlotSize;
+      {$ELSE}
+      amNumOffsetX = 0;
+      {$ENDIF}
+{$ENDIF}
+
       cSendCursorPosTime = 50;
       cCursorEdgesDist   = 100;
 
@@ -155,15 +172,14 @@
             ClansArray[t]:= cp;
             ClansArray[t]^.ClanIndex:= t;
             ClansArray[0]^.ClanIndex:= 0;
-            if (LocalClan = t) then
-                LocalClan:= 0
-            else if (LocalClan = 0) then
-                LocalClan:= t
             end;
         end;
     CurrentTeam:= ClansArray[0]^.Teams[0];
     end;
 
+if (GameFlags and gfInvulnerable) <> 0 then
+    cTagsMask:= cTagsMask and (not htHealth);
+
 // if special game flags/settings are changed, add them to the game mode notice window and then show it
 g:= ''; // no text/things to note yet
 
@@ -172,10 +188,10 @@
     g:= LuaGoals + '|';
 
 // check different game flags
-g:= AddGoal(g, gfPlaceHog, gidPlaceHog); // placement?
 g:= AddGoal(g, gfKing, gidKing); // king?
 if ((GameFlags and gfKing) <> 0) and ((GameFlags and gfPlaceHog) = 0) then
     g:= AddGoal(g, gfAny, gidPlaceKing);
+g:= AddGoal(g, gfPlaceHog, gidPlaceHog); // placement?
 g:= AddGoal(g, gfTagTeam, gidTagTeam); // tag team mode?
 g:= AddGoal(g, gfSharedAmmo, gidSharedAmmo); // shared ammo?
 g:= AddGoal(g, gfPerHogAmmo, gidPerHogAmmo);
@@ -213,19 +229,21 @@
 
 // if the string has been set, show it for (default timeframe) seconds
 if length(g) > 0 then
-    ShowMission(trgoal[gidCaption], trgoal[gidSubCaption], g, 1, 0);
+    // choose icon
+    if ((GameFlags and gfKing) <> 0) then
+        // crown icon for King Mode
+        ShowMission(trgoal[gidCaption], trgoal[gidSubCaption], g, 0, 0)
+    else
+        // target icon for anything else
+        ShowMission(trgoal[gidCaption], trgoal[gidSubCaption], g, 1, 0);
 
-//cWaveWidth:= SpritesData[sprWater].Width;
-//cWaveHeight:= SpritesData[sprWater].Height;
 cWaveHeight:= 32;
 
 InitCameraBorders();
 uCursor.init();
 prevPoint.X:= 0;
 prevPoint.Y:= cScreenHeight div 2;
-//prevTargetPoint.X:= 0;
-//prevTargetPoint.Y:= 0;
-WorldDx:=  -(LongInt(leftX + (playWidth div 2))); // -(LAND_WIDTH div 2);// + cScreenWidth div 2;
+WorldDx:=  -(LongInt(leftX + (playWidth div 2)));
 WorldDy:=  -(LAND_HEIGHT - (playHeight div 2)) + (cScreenHeight div 2);
 
 //aligns it to the bottom of the screen, minus the border
@@ -395,6 +413,28 @@
         source.y:= frame.y;
         end;
     end;
+
+with utilityWidget2 do
+    begin
+    show:= false;
+    sprite:= sprBounceButton;
+    frame.w:= Round(spritesData[sprite].Texture^.w * buttonScale);
+    frame.h:= Round(spritesData[sprite].Texture^.h * buttonScale);
+    frame.x:= utilityWidget.frame.x + Round(frame.w * 1.25);
+    frame.y:= arrowLeft.frame.y - Round(frame.h * 1.25);
+    active.x:= frame.x;
+    active.y:= frame.y;
+    active.w:= frame.w;
+    active.h:= frame.h;
+    with moveAnim do
+        begin
+        target.x:= frame.x;
+        target.y:= frame.y;
+        source.x:= frame.x;
+        source.y:= frame.y;
+        end;
+    end;
+
 {$ENDIF}
 end;
 
@@ -415,7 +455,10 @@
     STurns: LongInt;
     amSurface: PSDL_Surface;
     AMRect: TSDL_Rect;
-{$IFDEF USE_AM_NUMCOLUMN}tmpsurf: PSDL_Surface;{$ENDIF}
+{$IFDEF USE_AM_NUMCOLUMN}
+    tmpsurf: PSDL_Surface;
+    usesDefaultSlotKeys: boolean;
+{$ENDIF}
 begin
     if cOnlyStats then exit(nil);
 
@@ -451,6 +494,9 @@
 
     x:= AMRect.x;
     y:= AMRect.y;
+{$IFDEF USE_AM_NUMCOLUMN}
+    usesDefaultSlotKeys:= CheckDefaultSlotKeys;
+{$ENDIF USE_AM_NUMCOLUMN}
     for i:= 0 to cMaxSlotIndex do
         if (i <> cHiddenSlotIndex) and (Ammo^[i, 0].Count > 0) then
             begin
@@ -460,7 +506,13 @@
             x:= AMRect.x;
 {$ENDIF}
 {$IFDEF USE_AM_NUMCOLUMN}
-            tmpsurf:= TTF_RenderUTF8_Blended(Fontz[fnt16].Handle, Str2PChar('F' + IntToStr(i+1)), cWhiteColorChannels);
+            // Ammo slot number column
+            if usesDefaultSlotKeys then
+                // F1, F2, F3, F4, ...
+                tmpsurf:= TTF_RenderUTF8_Blended(Fontz[fnt16].Handle, Str2PChar('F'+IntToStr(i+1)), cWhiteColorChannels)
+            else
+                // 1, 2, 3, 4, ...
+                tmpsurf:= TTF_RenderUTF8_Blended(Fontz[fnt16].Handle, Str2PChar(IntToStr(i+1)), cWhiteColorChannels);
             copyToXY(tmpsurf, amSurface,
                      x + AMSlotPadding + (AMSlotSize shr 1) - (tmpsurf^.w shr 1),
                      y + AMSlotPadding + (AMSlotSize shr 1) - (tmpsurf^.h shr 1));
@@ -600,12 +652,16 @@
 
 if AMState = AMShowingUp then // show ammo menu
     begin
-    if (cReducedQuality and rqSlowMenu) <> 0 then
+    // No "appear" animation in low quality or playing with very short turn time.
+    if ((cReducedQuality and rqSlowMenu) <> 0) or (cHedgehogTurnTime <= 10000) then
         begin
         AMShiftX:= 0;
         AMShiftY:= 0;
+        CursorPoint.X:= AmmoRect.x + AmmoRect.w - 3;
+        CursorPoint.Y:= cScreenHeight - AmmoRect.y - amNumOffsetY - 1;
         AMState:= AMShowing;
         end
+    // "Appear" animation
     else
         if AMAnimState < 1 then
             begin
@@ -618,19 +674,22 @@
             begin
             AMShiftX:= 0;
             AMShiftY:= 0;
-            CursorPoint.X:= AmmoRect.x + AmmoRect.w;
-            CursorPoint.Y:= AmmoRect.y;
+            CursorPoint.X:= AmmoRect.x + AmmoRect.w - 3;
+            CursorPoint.Y:= cScreenHeight - AmmoRect.y - amNumOffsetY - 1;
             AMState:= AMShowing;
             end;
     end;
 if AMState = AMHiding then // hide ammo menu
     begin
-    if (cReducedQuality and rqSlowMenu) <> 0 then
+    // No "disappear" animation (see above)
+    if ((cReducedQuality and rqSlowMenu) <> 0) or (cHedgehogTurnTime <= 10000) then
         begin
         AMShiftX:= AMShiftTargetX;
         AMShiftY:= AMShiftTargetY;
+        prevPoint:= CursorPoint;
         AMState:= AMHidden;
         end
+    // "Disappear" animation
     else
         if AMAnimState < 1 then
             begin
@@ -644,7 +703,6 @@
             AMShiftX:= AMShiftTargetX;
             AMShiftY:= AMShiftTargetY;
             prevPoint:= CursorPoint;
-            //prevTargetPoint:= TargetCursorPoint;
             AMState:= AMHidden;
             end;
     end;
@@ -742,23 +800,7 @@
                 SetWeapon(Ammo^[Slot, Pos].AmmoType);
                 bSelected:= false;
                 FreeAndNilTexture(WeaponTooltipTex);
-{$IFDEF USE_TOUCH_INTERFACE}//show the aiming buttons + animation
-                if (Ammo^[Slot, Pos].Propz and ammoprop_NeedUpDown) <> 0 then
-                    begin
-                    if (not arrowUp.show) then
-                        begin
-                        animateWidget(@arrowUp, true, true);
-                        animateWidget(@arrowDown, true, true);
-                        end;
-                    end
-                else
-                    if arrowUp.show then
-                        begin
-                        animateWidget(@arrowUp, true, false);
-                        animateWidget(@arrowDown, true, false);
-                        end;
-                SetUtilityWidgetState(Ammo^[Slot, Pos].AmmoType);
-{$ENDIF}
+                updateTouchWidgets(Ammo^[Slot, Pos].AmmoType);
                 exit
                 end;
             end
@@ -880,10 +922,8 @@
 
 procedure RenderWorldEdge;
 var
-    //VertexBuffer: array [0..3] of TVertex2f;
     tmp, w: LongInt;
     rect: TSDL_Rect;
-    //c1, c2: LongWord; // couple of colours for edges
 begin
 if (WorldEdge <> weNone) and (WorldEdge <> weSea) then
     begin
@@ -915,110 +955,6 @@
             DrawLineOnScreen(tmp - 1, ViewTopY, tmp - 1, ViewBottomY, 2, $54, $54, $FF, $FF);
         end;
 
-    (*
-    WARNING: the following render code is outdated and does not work with
-             current Render.pas ! - don't just uncomment without fixing it first
-
-    glDisable(GL_TEXTURE_2D);
-    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
-    if (WorldEdge = weWrap) or (worldEdge = weBounce) then
-        glColor4ub($00, $00, $00, $40)
-    else
-        begin
-        glEnableClientState(GL_COLOR_ARRAY);
-        glColorPointer(4, GL_UNSIGNED_BYTE, 0, @WorldFade[0]);
-        end;
-
-    glPushMatrix;
-    glTranslatef(WorldDx, WorldDy, 0);
-
-    VertexBuffer[0].X:= leftX-20;
-    VertexBuffer[0].Y:= -3500;
-    VertexBuffer[1].X:= leftX-20;
-    VertexBuffer[1].Y:= cWaterLine+cVisibleWater;
-    VertexBuffer[2].X:= leftX+30;
-    VertexBuffer[2].Y:= cWaterLine+cVisibleWater;
-    VertexBuffer[3].X:= leftX+30;
-    VertexBuffer[3].Y:= -3500;
-
-    glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]);
-    glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
-
-    VertexBuffer[0].X:= rightX+20;
-    VertexBuffer[1].X:= rightX+20;
-    VertexBuffer[2].X:= rightX-30;
-    VertexBuffer[3].X:= rightX-30;
-
-    glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]);
-    glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
-
-    glColorPointer(4, GL_UNSIGNED_BYTE, 0, @WorldEnd[0]);
-
-    VertexBuffer[0].X:= -5000;
-    VertexBuffer[1].X:= -5000;
-    VertexBuffer[2].X:= leftX-20;
-    VertexBuffer[3].X:= leftX-20;
-
-    glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]);
-    glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
-
-    VertexBuffer[0].X:= rightX+5000;
-    VertexBuffer[1].X:= rightX+5000;
-    VertexBuffer[2].X:= rightX+20;
-    VertexBuffer[3].X:= rightX+20;
-
-    glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]);
-    glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
-
-    glPopMatrix;
-    glDisableClientState(GL_COLOR_ARRAY);
-    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
-
-    glColor4ub($FF, $FF, $FF, $FF); // must not be Tint() as color array seems to stay active and color reset is required
-    glEnable(GL_TEXTURE_2D);
-
-    // I'd still like to have things happen to the border when a wrap or bounce just occurred, based on a timer
-    if WorldEdge = weBounce then
-        begin
-        // could maybe alternate order of these on a bounce, or maybe drop the outer ones.
-        if LeftImpactTimer mod 2 = 0 then
-            begin
-            c1:= $5454FFFF; c2:= $FFFFFFFF;
-            end
-        else begin
-            c1:= $FFFFFFFF; c2:= $5454FFFF;
-            end;
-        DrawLine(leftX, -3000, leftX, cWaterLine+cVisibleWater, 7.0,   c1);
-        DrawLine(leftX, -3000, leftX, cWaterLine+cVisibleWater, 5.0,   c2);
-        DrawLine(leftX, -3000, leftX, cWaterLine+cVisibleWater, 3.0,   c1);
-        DrawLine(leftX, -3000, leftX, cWaterLine+cVisibleWater, 1.0,   c2);
-        if RightImpactTimer mod 2 = 0 then
-            begin
-            c1:= $5454FFFF; c2:= $FFFFFFFF;
-            end
-        else begin
-            c1:= $FFFFFFFF; c2:= $5454FFFF;
-            end;
-        DrawLine(rightX, -3000, rightX, cWaterLine+cVisibleWater, 7.0, c1);
-        DrawLine(rightX, -3000, rightX, cWaterLine+cVisibleWater, 5.0, c2);
-        DrawLine(rightX, -3000, rightX, cWaterLine+cVisibleWater, 3.0, c1);
-        DrawLine(rightX, -3000, rightX, cWaterLine+cVisibleWater, 1.0, c2)
-        end
-    else if WorldEdge = weWrap then
-        begin
-        DrawLine(leftX, -3000, leftX, cWaterLine+cVisibleWater, 5.0, $A0, $30, $60, max(50,255-LeftImpactTimer));
-        DrawLine(leftX, -3000, leftX, cWaterLine+cVisibleWater, 2.0, $FF0000FF);
-        DrawLine(rightX, -3000, rightX, cWaterLine+cVisibleWater, 5.0, $A0, $30, $60, max(50,255-RightImpactTimer));
-        DrawLine(rightX, -3000, rightX, cWaterLine+cVisibleWater, 2.0, $FF0000FF);
-        end
-    else
-        begin
-        DrawLine(leftX, -3000, leftX, cWaterLine+cVisibleWater, 5.0, $2E8B5780);
-        DrawLine(rightX, -3000, rightX, cWaterLine+cVisibleWater, 5.0, $2E8B5780)
-        end;
-    if LeftImpactTimer > Lag then dec(LeftImpactTimer,Lag) else LeftImpactTimer:= 0;
-    if RightImpactTimer > Lag then dec(RightImpactTimer,Lag) else RightImpactTimer:= 0
-    *)
     end;
 end;
 
@@ -1072,25 +1008,29 @@
 
         TeamHealthBarWidth:= cTeamHealthWidth * TeamHealthBarHealth div MaxTeamHealth;
 
-        // draw health bar
+        // draw team health bar
         r.x:= 0;
         r.y:= 0;
         r.w:= 2 + TeamHealthBarWidth;
         r.h:= htex^.h;
         DrawTextureFromRect(14, cScreenHeight + DrawHealthY + smallScreenOffset, @r, htex);
 
-        // draw health bars right border
+        // draw health bar's right border
         inc(r.x, cTeamHealthWidth + 2);
         r.w:= 3;
         DrawTextureFromRect(TeamHealthBarWidth + 15, cScreenHeight + DrawHealthY + smallScreenOffset, @r, htex);
 
+        // draw hedgehog health separators in team health bar
         h:= 0;
         if not hasGone then
             for i:= 0 to cMaxHHIndex do
                 begin
                 inc(h, Hedgehogs[i].HealthBarHealth);
                 if (h < TeamHealthBarHealth) and (Hedgehogs[i].HealthBarHealth > 0) then
-                    DrawTexture(15 + h * TeamHealthBarWidth div TeamHealthBarHealth, cScreenHeight + DrawHealthY + smallScreenOffset + 1, SpritesData[sprSlider].Texture);
+                    if (IsTooDarkToRead(Clan^.Color)) then
+                        DrawTexture(15 + h * TeamHealthBarWidth div TeamHealthBarHealth, cScreenHeight + DrawHealthY + smallScreenOffset + 1, SpritesData[sprSlider].Texture)
+                    else
+                        DrawTexture(15 + h * TeamHealthBarWidth div TeamHealthBarHealth, cScreenHeight + DrawHealthY + smallScreenOffset + 1, SpritesData[sprSliderInverted].Texture);
                 end;
 
         // draw Lua value, if set
@@ -1146,7 +1086,13 @@
             h:= -NameTagTex^.w - 24;
             if OwnerTex <> nil then
                 h:= h - OwnerTex^.w - 4;
+            if (IsTooDarkToRead(TeamsArray[t]^.Clan^.Color)) then
+                DrawSpriteRotatedF(sprFingerBackInv, h, cScreenHeight + DrawHealthY + smallScreenOffset + 2 + SpritesData[sprFingerBackInv].Width div 4, 0, 1, -90)
+            else
+                DrawSpriteRotatedF(sprFingerBack, h, cScreenHeight + DrawHealthY + smallScreenOffset + 2 + SpritesData[sprFingerBack].Width div 4, 0, 1, -90);
+            Tint(TeamsArray[t]^.Clan^.Color shl 8 or $FF);
             DrawSpriteRotatedF(sprFinger, h, cScreenHeight + DrawHealthY + smallScreenOffset + 2 + SpritesData[sprFinger].Width div 4, 0, 1, -90);
+            untint;
             end;
         end;
       end;
@@ -1198,7 +1144,7 @@
     r: TSDL_Rect;
     s: shortstring;
     offsetX, offsetY, screenBottom: LongInt;
-    replicateToLeft, replicateToRight, tmp: boolean;
+    replicateToLeft, replicateToRight, isNotHiddenByCinematic: boolean;
 {$IFDEF USE_VIDEO_RECORDING}
     a: Byte;
 {$ENDIF}
@@ -1279,9 +1225,6 @@
 
 DrawWater(255, 0, 0);
 
-tmp:= bShowFinger;
-bShowFinger:= false;
-
 if replicateToLeft then
     begin
     ShiftWorld(-1);
@@ -1300,8 +1243,6 @@
     UnshiftWorld();
     end;
 
-bShowFinger:= tmp;
-
 DrawVisualGears(1, false);
 DrawGears;
 DrawVisualGears(6, false);
@@ -1336,6 +1277,12 @@
     else
         DrawWaves(-1, 50, cWaveHeight div 2, cWaveHeight div 2, 0);
 
+// line at airplane height for certain airstrike types (when spawning height is important)
+with CurrentHedgehog^ do
+    if (isCursorVisible) and ((CurAmmoType = amNapalm) or (CurAmmoType = amMineStrike) or (((GameFlags and gfMoreWind) <> 0) and ((CurAmmoType = amDrillStrike) or (CurAmmoType = amAirAttack)))) then
+        DrawLine(-3000, topY-300, 7000, topY-300, 3.0, (Team^.Clan^.Color shr 16), (Team^.Clan^.Color shr 8) and $FF, Team^.Clan^.Color and $FF, $FF);
+
+// gear HUD extras (fuel indicator, secondary ammo, etc.)
 if replicateToLeft then
     begin
     ShiftWorld(-1);
@@ -1404,18 +1351,48 @@
         if replicateToLeft then
             begin
             ShiftWorld(-1);
+            if spr = sprTargetP then
+                begin
+                if IsTooDarkToRead(Team^.Clan^.Color) then
+                    DrawSpriteRotatedF(sprTargetPBackInv, TargetPoint.X + WorldDx, TargetPoint.Y + WorldDy, 0, 0, (RealTicks shr 3) mod 360)
+                else
+                    DrawSpriteRotatedF(sprTargetPBack, TargetPoint.X + WorldDx, TargetPoint.Y + WorldDy, 0, 0, (RealTicks shr 3) mod 360);
+                Tint(Team^.Clan^.Color shl 8 or $FF);
+                end;
             DrawSpriteRotatedF(spr, TargetPoint.X + WorldDx, TargetPoint.Y + WorldDy, 0, 0, (RealTicks shr 3) mod 360);
+            if spr = sprTargetP then
+                untint;
             UnshiftWorld();
             end;
 
         if replicateToRight then
             begin
             ShiftWorld(1);
+            if spr = sprTargetP then
+                begin
+                if IsTooDarkToRead(Team^.Clan^.Color) then
+                    DrawSpriteRotatedF(sprTargetPBackInv, TargetPoint.X + WorldDx, TargetPoint.Y + WorldDy, 0, 0, (RealTicks shr 3) mod 360)
+                else
+                    DrawSpriteRotatedF(sprTargetPBack, TargetPoint.X + WorldDx, TargetPoint.Y + WorldDy, 0, 0, (RealTicks shr 3) mod 360);
+                Tint(Team^.Clan^.Color shl 8 or $FF);
+                end;
             DrawSpriteRotatedF(spr, TargetPoint.X + WorldDx, TargetPoint.Y + WorldDy, 0, 0, (RealTicks shr 3) mod 360);
+            if spr = sprTargetP then
+                untint;
             UnshiftWorld();
             end;
 
+        if spr = sprTargetP then
+            begin
+            if IsTooDarkToRead(Team^.Clan^.Color) then
+                DrawSpriteRotatedF(sprTargetPBackInv, TargetPoint.X + WorldDx, TargetPoint.Y + WorldDy, 0, 0, (RealTicks shr 3) mod 360)
+            else
+                DrawSpriteRotatedF(sprTargetPBack, TargetPoint.X + WorldDx, TargetPoint.Y + WorldDy, 0, 0, (RealTicks shr 3) mod 360);
+            Tint(Team^.Clan^.Color shl 8 or $FF);
+            end;
         DrawSpriteRotatedF(spr, TargetPoint.X + WorldDx, TargetPoint.Y + WorldDy, 0, 0, (RealTicks shr 3) mod 360);
+        if spr = sprTargetP then
+            untint;
         end;
     end;
 
@@ -1442,7 +1419,8 @@
 // This scale is used to keep the various widgets at the same dimension at all zoom levels
 SetScale(cDefaultZoomLevel);
 
-// Cinematic Mode: Effects
+isNotHiddenByCinematic:= true;
+// Cinematic Mode: Determine effects and state
 if CinematicScript or (InCinematicMode and autoCameraOn
     and ((CurrentHedgehog = nil) or CurrentHedgehog^.Team^.ExtDriven
     or (CurrentHedgehog^.BotLevel <> 0) or (GameType = gmtDemo))) then
@@ -1451,7 +1429,10 @@
         begin
         inc(CinematicSteps, Lag);
         if CinematicSteps > 300 then
-        CinematicSteps:= 300;
+            begin
+            CinematicSteps:= 300;
+            isNotHiddenByCinematic:= false;
+            end;
         end;
     end
 else if CinematicSteps > 0 then
@@ -1461,22 +1442,8 @@
         CinematicSteps:= 0;
     end;
 
-// Cinematic Mode: Render black bars
-if CinematicSteps > 0 then
-    begin
-    r.x:= ViewLeftX;
-    r.w:= ViewWidth;
-    r.y:= ViewTopY;
-    CinematicBarH:= (ViewHeight * CinematicSteps) div 2048;
-    r.h:= CinematicBarH;
-    DrawRect(r, 0, 0, 0, $FF, true);
-    r.y:= ViewBottomY - r.h;
-    DrawRect(r, 0, 0, 0, $FF, true);
-    end;
-
-
 // Turn time
-if UIDisplay <> uiNone then
+if (UIDisplay <> uiNone) and (isNotHiddenByCinematic) then
     begin
 {$IFDEF USE_TOUCH_INTERFACE}
     offsetX:= cScreenHeight - 13;
@@ -1515,34 +1482,79 @@
         DrawSprite(sprFrame, -(cScreenWidth shr 1) + t - 4 + offsetY, cScreenHeight - offsetX, 0);
         end;
 
-// Captions
-    DrawCaptions
     end;
 
+// Team bars
+if (UIDisplay = uiAll) and (isNotHiddenByCinematic) then
+    RenderTeamsHealth;
+
+// Current hedgehog health in top left corner
+if ((UIDisplay = uiAll) or (UIDisplay = uiNoTeams)) and (isNotHiddenByCinematic) and
+        (CurrentHedgehog <> nil) and (CurrentHedgehog^.Gear <> nil) and
+        (CurrentHedgehog^.HealthTagTex <> nil) and
+        ((CurrentHedgehog^.Gear^.State and gstHHDriven) <> 0) then
+    begin
+    t:= 11;
+    i:= t;
 {$IFDEF USE_TOUCH_INTERFACE}
-// Draw buttons Related to the Touch interface
-DrawScreenWidget(@arrowLeft);
-DrawScreenWidget(@arrowRight);
-DrawScreenWidget(@arrowUp);
-DrawScreenWidget(@arrowDown);
-
-DrawScreenWidget(@fireButton);
-DrawScreenWidget(@jumpWidget);
-DrawScreenWidget(@AMWidget);
-DrawScreenWidget(@pauseButton);
-DrawScreenWidget(@utilityWidget);
+    i:= t + pauseButton.frame.y + pauseButton.frame.h;
 {$ENDIF}
 
-// Team bars
-if UIDisplay = uiAll then
-    RenderTeamsHealth;
+    // Hide health and healh icons in gfInvulnerable mode (except heResurrectable)
+    if ((GameFlags and gfInvulnerable) = 0) then
+    begin
+    // Health tag
+    DrawTexture(cScreenWidth div 2 - CurrentHedgehog^.HealthTagTex^.w - 16, i, CurrentHedgehog^.HealthTagTex);
+    inc(t, CurrentHedgehog^.HealthTagTex^.h);
+    cDemoClockFPSOffsetY:= t;
+
+    t:= SpritesData[sprHealthHud].Width + 18;
+    // Main health icon. Appearance depends on game mode and poisoning state
+    if ((GameFlags and gfResetHealth) = 0) then
+        if (CurrentHedgehog^.Effects[hePoisoned] <> 0) then
+            DrawSprite(sprHealthPoisonHud, (cScreenWidth div 2 - CurrentHedgehog^.HealthTagTex^.w - t), i, 0)
+        else
+            DrawSprite(sprHealthHud, (cScreenWidth div 2 - CurrentHedgehog^.HealthTagTex^.w - t), i, 0)
+    else
+        if (CurrentHedgehog^.Effects[hePoisoned] <> 0) then
+            DrawSprite(sprMedicPoisonHud, (cScreenWidth div 2 - CurrentHedgehog^.HealthTagTex^.w - t), i, 0)
+        else
+            DrawSprite(sprMedicHud, (cScreenWidth div 2 - CurrentHedgehog^.HealthTagTex^.w - t), i, 0);
+    // Put halo above health icon for resurrectable hog
+    if (CurrentHedgehog^.Effects[heResurrectable] <> 0) then
+        DrawSprite(sprHaloHud, (cScreenWidth div 2 - CurrentHedgehog^.HealthTagTex^.w - t - 2), i - SpritesData[sprHaloHud].Height + 1, 0);
 
-// Lag alert
-if isInLag then
-    DrawSprite(sprLag, 32 - (cScreenWidth shr 1), 32, (RealTicks shr 7) mod 12);
+    // Additional health-related states
+    inc(t, 2);
+    // Invulnerable
+    if (CurrentHedgehog^.Effects[heInvulnerable] <> 0) then
+        begin
+        inc(t, SpritesData[sprInvulnHud].Width + 2);
+        DrawSprite(sprInvulnHud, (cScreenWidth div 2 - CurrentHedgehog^.HealthTagTex^.w - t), i, 0)
+        end
+    // Karma
+    else if ((GameFlags and gfKarma) <> 0) then
+        begin
+        inc(t, SpritesData[sprKarmaHud].Width + 2);
+        DrawSprite(sprKarmaHud, (cScreenWidth div 2 - CurrentHedgehog^.HealthTagTex^.w - t), i, 0)
+        end;
+    // Vampirism
+    if cVampiric then
+        begin
+        inc(t, SpritesData[sprVampHud].Width + 2);
+        DrawSprite(sprVampHud, (cScreenWidth div 2 - CurrentHedgehog^.HealthTagTex^.w - t), i, 0);
+        end;
+    end
+    // in gfInvulnerable mode ...
+    else if (CurrentHedgehog^.Effects[heResurrectable] <> 0) then
+        // show halo for resurrectable hog
+        DrawSprite(sprHaloHud, (cScreenWidth div 2 - CurrentHedgehog^.HealthTagTex^.w - t - 2), i, 0);
+    end
+else
+    cDemoClockFPSOffsetY:= 0;
 
 // Wind bar
-if UIDisplay <> uiNone then
+if (UIDisplay <> uiNone) and (isNotHiddenByCinematic) then
     begin
 {$IFDEF USE_TOUCH_INTERFACE}
     offsetX:= cScreenHeight - 13;
@@ -1555,7 +1567,7 @@
     if WindBarWidth > 0 then
         begin
         {$WARNINGS OFF}
-        r.x:= 8 - (RealTicks shr 6) mod 8;
+        r.x:= 8 - (RealTicks shr 6) mod 9;
         {$WARNINGS ON}
         r.y:= 0;
         r.w:= WindBarWidth;
@@ -1566,7 +1578,7 @@
         if WindBarWidth < 0 then
         begin
         {$WARNINGS OFF}
-        r.x:= (Longword(WindBarWidth) + RealTicks shr 6) mod 8;
+        r.x:= (Longword(WindBarWidth) + RealTicks shr 6) mod 9;
         {$WARNINGS ON}
         r.y:= 0;
         r.w:= - WindBarWidth;
@@ -1576,7 +1588,7 @@
     end;
 
 // Indicators for global effects (extra damage, low gravity)
-if UIDisplay <> uiNone then
+if (UIDisplay <> uiNone) and (isNotHiddenByCinematic) then
     begin
 {$IFDEF USE_TOUCH_INTERFACE}
     offsetX:= (cScreenWidth shr 1) - 95;
@@ -1600,9 +1612,55 @@
         begin
             DrawTextureF(ropeIconTex, 1, (cScreenWidth shr 1) - offsetX, cScreenHeight - offsetY, 0, 1, 32, 32);
             DrawTextureF(SpritesData[sprAMAmmos].Texture, 0.90, (cScreenWidth shr 1) - offsetX, cScreenHeight - offsetY, ord(amLowGravity) - 1, 1, 32, 32);
+{$IFDEF USE_TOUCH_INTERFACE}
+            offsetX := offsetX - 33
+{$ELSE}
+            offsetX := offsetX + 33
+{$ENDIF}
+        end;
+    if cLaserSighting then
+        begin
+            DrawTextureF(ropeIconTex, 1, (cScreenWidth shr 1) - offsetX, cScreenHeight - offsetY, 0, 1, 32, 32);
+            DrawTextureF(SpritesData[sprAMAmmos].Texture, 0.90, (cScreenWidth shr 1) - offsetX, cScreenHeight - offsetY, ord(amLaserSight) - 1, 1, 32, 32);
         end;
     end;
 
+// Cinematic Mode: Render black bars
+if CinematicSteps > 0 then
+    begin
+    r.x:= ViewLeftX;
+    r.w:= ViewWidth;
+    r.y:= ViewTopY;
+    CinematicBarH:= (ViewHeight * CinematicSteps) div 2048;
+    r.h:= CinematicBarH;
+    DrawRect(r, 0, 0, 0, $FF, true);
+    r.y:= ViewBottomY - r.h;
+    DrawRect(r, 0, 0, 0, $FF, true);
+    end;
+
+// Touchscreen interface widgets
+{$IFDEF USE_TOUCH_INTERFACE}
+DrawScreenWidget(@arrowLeft);
+DrawScreenWidget(@arrowRight);
+DrawScreenWidget(@arrowUp);
+DrawScreenWidget(@arrowDown);
+
+DrawScreenWidget(@fireButton);
+DrawScreenWidget(@jumpWidget);
+DrawScreenWidget(@AMWidget);
+DrawScreenWidget(@utilityWidget);
+DrawScreenWidget(@utilityWidget2);
+DrawScreenWidget(@pauseButton);
+{$ENDIF}
+
+// Captions
+if UIDisplay <> uiNone then
+    DrawCaptions;
+
+// Lag alert
+if isInLag then
+    DrawSprite(sprLag, 32 - (cScreenWidth shr 1), 32, (RealTicks shr 7) mod 12);
+
 // Chat
 DrawChat;
 
@@ -1655,11 +1713,11 @@
 
 // FPS and demo replay time
 {$IFDEF USE_TOUCH_INTERFACE}
-offsetX:= pauseButton.frame.y + pauseButton.frame.h + 12;
+offsetY:= cDemoClockFPSOffsetY + 10 + pauseButton.frame.y + pauseButton.frame.h;
 {$ELSE}
-offsetX:= 10;
+offsetY:= cDemoClockFPSOffsetY + 10;
 {$ENDIF}
-offsetY:= cOffsetY;
+offsetX:= cOffsetY;
 if (RM = rmDefault) or (RM = rmRightEye) then
     begin
     inc(Frames);
@@ -1690,11 +1748,11 @@
         SDL_FreeSurface(tmpSurface)
         end;
 
-    if timeTexture <> nil then
-        DrawTexture((cScreenWidth shr 1) - 20 - timeTexture^.w - offsetY, offsetX + timeTexture^.h+5, timeTexture);
+    if (timeTexture <> nil) and (UIDisplay <> uiNone) then
+        DrawTexture((cScreenWidth shr 1) - 20 - timeTexture^.w - offsetX, offsetY, timeTexture);
 
     // FPS counter
-    if cShowFPS then
+    if cShowFPS and (UIDisplay <> uiNone) then
         begin
         if CountTicks >= 1000 then
             begin
@@ -1709,7 +1767,13 @@
             SDL_FreeSurface(tmpSurface)
             end;
         if fpsTexture <> nil then
-            DrawTexture((cScreenWidth shr 1) - 60 - offsetY, offsetX, fpsTexture);
+            begin
+            if timeTexture <> nil then
+                i:= fpsTexture^.h + 5
+            else
+                i:= 0;
+            DrawTexture((cScreenWidth shr 1) - 20 - fpsTexture^.w - offsetX, offsetY + i, fpsTexture);
+            end;
         end;
 end;
 
@@ -1762,7 +1826,8 @@
         end;
     DrawTexture( -(cScreenWidth shr 1) + 50, 20, recTexture);
 
-    a:= Byte(min(255, abs(-255 + ((RealTicks div 2) and 511))));
+    t:= -255 + ((RealTicks div 2) and 511);
+    a:= Byte(min(255, abs(t)));
 
     // draw red circle
     DrawCircleFilled(-(cScreenWidth shr 1) + 30, 35, 10, $FF, $00, $00, a);
@@ -1778,11 +1843,9 @@
     with CurrentHedgehog^ do
         if (Gear <> nil) and ((Gear^.State and gstChooseTarget) <> 0) then
             begin
-        if (CurAmmoType = amNapalm) or (CurAmmoType = amMineStrike) or (((GameFlags and gfMoreWind) <> 0) and ((CurAmmoType = amDrillStrike) or (CurAmmoType = amAirAttack))) then
-            DrawLine(-3000, topY-300, 7000, topY-300, 3.0, (Team^.Clan^.Color shr 16), (Team^.Clan^.Color shr 8) and $FF, Team^.Clan^.Color and $FF, $FF);
         i:= GetCurAmmoEntry(CurrentHedgehog^)^.Pos;
         with Ammoz[CurAmmoType] do
-            if PosCount > 1 then
+            if PosCount > 0 then
                 begin
                 if (CurAmmoType = amGirder) or (CurAmmoType = amTeleport) then
                     begin
@@ -1794,6 +1857,13 @@
                     end;
                 DrawSprite(PosSprite, TargetCursorPoint.X - (SpritesData[PosSprite].Width shr 1), cScreenHeight - TargetCursorPoint.Y - (SpritesData[PosSprite].Height shr 1),i);
                 Untint();
+                if (WorldEdge = weWrap) and (CurAmmoType = amBee) then
+                    begin
+                    if (TargetCursorPoint.X - WorldDx > rightX) then
+                        DrawSprite(sprThroughWrap, TargetCursorPoint.X - (SpritesData[sprThroughWrap].Width shr 1), cScreenHeight - TargetCursorPoint.Y - (SpritesData[PosSprite].Height shr 1) - SpritesData[sprThroughWrap].Height - 2, 0)
+                    else if (TargetCursorPoint.X - WorldDx < leftX) then
+                        DrawSprite(sprThroughWrap, TargetCursorPoint.X - (SpritesData[sprThroughWrap].Width shr 1), cScreenHeight - TargetCursorPoint.Y - (SpritesData[PosSprite].Height shr 1) - SpritesData[sprThroughWrap].Height - 2, 1);
+                    end;
                 end;
             end;
     DrawTextureF(SpritesData[sprArrow].Texture, cDefaultZoomLevel / cScaleFactor, TargetCursorPoint.X + round(SpritesData[sprArrow].Width / cScaleFactor), cScreenHeight + round(SpritesData[sprArrow].Height / cScaleFactor) - TargetCursorPoint.Y, (RealTicks shr 6) mod 8, 1, SpritesData[sprArrow].Width, SpritesData[sprArrow].Height);
@@ -1815,7 +1885,7 @@
 var PrevSentPointTime: LongWord = 0;
 
 procedure MoveCamera;
-var EdgesDist, wdy, shs,z, amNumOffsetX, amNumOffsetY, dstX: LongInt;
+var EdgesDist, wdy, shs,z, dstX: LongInt;
     inbtwnTrgtAttks: Boolean;
 begin
 {$IFNDEF MOBILE}
@@ -1872,22 +1942,6 @@
 
 if (AMState = AMShowingUp) or (AMState = AMShowing) then
 begin
-{$IFDEF USE_LANDSCAPE_AMMOMENU}
-    amNumOffsetX:= 0;
-    {$IFDEF USE_AM_NUMCOLUMN}
-    amNumOffsetY:= AMSlotSize;
-    {$ELSE}
-    amNumOffsetY:= 0;
-    {$ENDIF}
-{$ELSE}
-    amNumOffsetY:= 0;
-    {$IFDEF USE_AM_NUMCOLUMN}
-    amNumOffsetX:= AMSlotSize;
-    {$ELSE}
-    amNumOffsetX:= 0;
-    {$ENDIF}
-
-{$ENDIF}
     if CursorPoint.X < AmmoRect.x + amNumOffsetX + 3 then//check left
         CursorPoint.X:= AmmoRect.x + amNumOffsetX + 3;
     if CursorPoint.X > AmmoRect.x + AmmoRect.w - 3 then//check right
@@ -1897,7 +1951,6 @@
     if CursorPoint.Y < cScreenHeight - (AmmoRect.y + AmmoRect.h - AMSlotSize - 5) then//check bottom
         CursorPoint.Y:= cScreenHeight - (AmmoRect.y + AmmoRect.h - AMSlotSize - 5);
     prevPoint:= CursorPoint;
-    //if cHasFocus then SDL_WarpMouse(CursorPoint.X + cScreenWidth div 2, cScreenHeight - CursorPoint.Y);
     exit
 end;
 
@@ -1953,7 +2006,6 @@
 
 // this moves the camera according to CursorPoint X and Y
 prevPoint:= CursorPoint;
-//if cHasFocus then SDL_WarpMouse(CursorPoint.X + (cScreenWidth shr 1), cScreenHeight - CursorPoint.Y);
 if WorldDy > LAND_HEIGHT + 1024 then
     WorldDy:= LAND_HEIGHT + 1024;
 if WorldDy < wdy then
@@ -2043,8 +2095,6 @@
 amount:= Max(1, round(amount*zoom/2));
 WorldDx:= WorldDx - amount + LongInt(random(1 + amount * 2));
 WorldDy:= WorldDy - amount + LongInt(random(1 + amount * 2));
-//CursorPoint.X:= CursorPoint.X - amount + LongInt(random(1 + amount * 2));
-//CursorPoint.Y:= CursorPoint.Y - amount + LongInt(random(1 + amount * 2))
 end;
 
 
@@ -2071,10 +2121,51 @@
 
 procedure updateCursorVisibility;
 begin
-    if isPaused or isAFK then
-        SDL_ShowCursor(1)
+    if isPaused or isAFK or (GameState = gsConfirm) then
+        begin
+{$IFNDEF USE_TOUCH_INTERFACE}
+        SDL_SetRelativeMouseMode(SDL_FALSE);
+{$ENDIF}
+        if SDL_ShowCursor(SDL_QUERY) = SDL_DISABLE then
+            begin
+            uCursor.resetPosition;
+{$IFNDEF USE_TOUCH_INTERFACE}
+            SDL_ShowCursor(SDL_ENABLE);
+{$ENDIF}
+            end;
+        end
     else
-        SDL_ShowCursor(ord(GameState = gsConfirm))
+        begin
+        uCursor.resetPositionDelta;
+{$IFNDEF USE_TOUCH_INTERFACE}
+        SDL_ShowCursor(SDL_DISABLE);
+        SDL_SetRelativeMouseMode(SDL_TRUE);
+{$ENDIF}
+        end;
+end;
+
+procedure updateTouchWidgets(ammoType: TAmmoType);
+begin
+{$IFDEF USE_TOUCH_INTERFACE}
+//show the aiming buttons + animation
+if (Ammoz[ammoType].Ammo.Propz and ammoprop_NeedUpDown) <> 0 then
+    begin
+    if (not arrowUp.show) then
+        begin
+        animateWidget(@arrowUp, true, true);
+        animateWidget(@arrowDown, true, true);
+        end;
+    end
+else
+    if arrowUp.show then
+        begin
+        animateWidget(@arrowUp, true, false);
+        animateWidget(@arrowDown, true, false);
+        end;
+SetUtilityWidgetState(ammoType);
+{$ELSE}
+ammoType:= ammoType; // avoid hint
+{$ENDIF}
 end;
 
 procedure SetUtilityWidgetState(ammoType: TAmmoType);
@@ -2087,20 +2178,32 @@
     if ((Ammoz[ammoType].Ammo.Propz and ammoprop_Timerable) <> 0) and (ammoType <> amDrillStrike) then
         begin
         utilityWidget.sprite:= sprTimerButton;
-        animateWidget(@utilityWidget, true, true);
+        if (not utilityWidget.show) then
+            animateWidget(@utilityWidget, true, true);
         end
     else if (Ammoz[ammoType].Ammo.Propz and ammoprop_NeedTarget) <> 0 then
         begin
         utilityWidget.sprite:= sprTargetButton;
-        animateWidget(@utilityWidget, true, true);
+        if (not utilityWidget.show) then
+            animateWidget(@utilityWidget, true, true);
         end
     else if ammoType = amSwitch then
         begin
         utilityWidget.sprite:= sprSwitchButton;
-        animateWidget(@utilityWidget, true, true);
+        if (not utilityWidget.show) then
+            animateWidget(@utilityWidget, true, true);
         end
     else if utilityWidget.show then
         animateWidget(@utilityWidget, true, false);
+
+    if ((Ammoz[ammoType].Ammo.Propz and ammoprop_SetBounce) <> 0) then
+        begin
+        utilityWidget2.sprite:= sprBounceButton;
+        if (not utilityWidget2.show) then
+            animateWidget(@utilityWidget2, true, true);
+        end
+    else if utilityWidget2.show then
+        animateWidget(@utilityWidget2, true, false);
 {$ELSE}
 ammoType:= ammoType; // avoid hint
 {$ENDIF}
Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/bouncebutton.png has changed
--- a/project_files/hwc/CMakeLists.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/project_files/hwc/CMakeLists.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -32,12 +32,14 @@
 
 #get the list of pas files that are going to be converted and compiled
 file(GLOB engine_sources_pas "${CMAKE_SOURCE_DIR}/hedgewars/*.pas")
-list(REMOVE_ITEM engine_sources_pas "${CMAKE_SOURCE_DIR}/hedgewars/uVideoRec.pas")
 list(REMOVE_ITEM engine_sources_pas "${CMAKE_SOURCE_DIR}/hedgewars/uTouch.pas")
 list(REMOVE_ITEM engine_sources_pas "${CMAKE_SOURCE_DIR}/hedgewars/PNGh.pas")
 list(REMOVE_ITEM engine_sources_pas "${CMAKE_SOURCE_DIR}/hedgewars/pas2cSystem.pas")
 list(REMOVE_ITEM engine_sources_pas "${CMAKE_SOURCE_DIR}/hedgewars/pas2cRedo.pas")
 list(REMOVE_ITEM engine_sources_pas "${CMAKE_SOURCE_DIR}/hedgewars/hwLibrary.pas")
+if(NOVIDEOREC)
+	list(REMOVE_ITEM engine_sources_pas "${CMAKE_SOURCE_DIR}/hedgewars/uVideoRec.pas")
+endif()
 if(NOT GL2)
     list(REMOVE_ITEM engine_sources_pas "${CMAKE_SOURCE_DIR}/hedgewars/uMatrix.pas")
 endif()
@@ -73,6 +75,12 @@
     set(pas2c_args ${pas2c_args} -d GL2)
 endif()
 
+if(LIBAV_FOUND)
+    add_subdirectory(${CMAKE_SOURCE_DIR}/hedgewars/avwrapper ${CMAKE_CURRENT_BINARY_DIR}/avwrapper)
+    list(APPEND HW_LINK_LIBS avwrapper)
+    set(pas2c_args ${pas2c_args} -d USE_VIDEO_RECORDING)
+endif()
+
 #invoke pas2c on main module, it will call all the others
 add_custom_command(OUTPUT ${engine_sources}
                    COMMAND "${EXECUTABLE_OUTPUT_PATH}/pas2c${CMAKE_EXECUTABLE_SUFFIX}"
@@ -111,6 +119,7 @@
                                 physfs
                                 physlayer
                                 m
+                                ${HW_LINK_LIBS}
                                 #TODO: add other libraries
                             )
 install(PROGRAMS "${EXECUTABLE_OUTPUT_PATH}/hwengine${CMAKE_EXECUTABLE_SUFFIX}" DESTINATION ${target_binary_install_dir})
--- a/project_files/hwc/rtl/GL.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/project_files/hwc/rtl/GL.h	Fri Aug 16 10:59:50 2019 -0600
@@ -33,5 +33,6 @@
 void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
 GLuint glCreateShader(GLenum shaderType);
 void glCompileShader(GLuint shader);
-void glShaderSource(GLuint shader, GLsizei count,/* const dropped for pas2c compat */ GLchar **string, const GLint *length);
+//void glShaderSource(GLuint shader, GLsizei count,/* const dropped for pas2c compat */ GLchar **string, const GLint *length);
+void glShaderSource(GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
 #endif
--- a/project_files/hwc/rtl/SysUtils.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/project_files/hwc/rtl/SysUtils.h	Fri Aug 16 10:59:50 2019 -0600
@@ -6,8 +6,12 @@
 // EFFECTS: return the current date time in pascal notation
 //          http://www.merlyn.demon.co.uk/del-prgg.htm#TDT
 TDateTime   fpcrtl_now();
-#define     now                     fpcrtl_now
-#define     Now                     fpcrtl_now
+#define     fpcrtl_Now              fpcrtl_now
+#define     now                     fpcrtl_Now
+#define     Now                     fpcrtl_Now
+
+string255   fpcrtl_formatDateTime(string255 FormatStr, TDateTime DateTime);
+#define     fpcrtl_FormatDateTime   fpcrtl_formatDateTime
 
 // EFFECTS: return the current time
 //          http://www.merlyn.demon.co.uk/del-prgg.htm#TDT
--- a/project_files/hwc/rtl/fileio.c	Mon Jan 14 15:11:15 2019 -0500
+++ b/project_files/hwc/rtl/fileio.c	Fri Aug 16 10:59:50 2019 -0600
@@ -241,3 +241,35 @@
     fflush(f);
 }
 
+Int64 fpcrtl_fileSize(File f)
+{
+    assert(f->record_len > 0);
+
+    IOResult = IO_NO_ERROR;
+    int i = fseek(f->fp, 0, SEEK_END);
+    if (i == -1) {
+        IOResult = IO_ERROR_DUMMY;
+        return -1;
+    }
+    long size = ftell(f->fp);
+    if (size == -1) {
+        IOResult = IO_ERROR_DUMMY;
+        return -1;
+    }
+    return size / f->record_len;
+}
+
+bool fpcrtl_deleteFile(string255 filename)
+{
+    FIX_STRING(filename);
+
+    int ret = remove(filename.str);
+    if(ret == 0) {
+       IOResult = IO_NO_ERROR;
+       return true;
+    } else {
+       IOResult = IO_ERROR_DUMMY;
+       return false;
+    }
+}
+
--- a/project_files/hwc/rtl/fileio.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/project_files/hwc/rtl/fileio.h	Fri Aug 16 10:59:50 2019 -0600
@@ -78,4 +78,10 @@
 char *      fpcrtl_getCurrentDir(void);
 #define     fpcrtl_GetCurrentDir                        fpcrtl_getCurrentDir
 
+Int64       fpcrtl_fileSize(File f);
+#define     fpcrtl_FileSize                             fpcrtl_fileSize
+
+bool        fpcrtl_deleteFile(string255 filename);
+#define     fpcrtl_DeleteFile                           fpcrtl_deleteFile
+
 #endif /* FILEIO_H_ */
--- a/project_files/hwc/rtl/misc.c	Mon Jan 14 15:11:15 2019 -0500
+++ b/project_files/hwc/rtl/misc.c	Fri Aug 16 10:59:50 2019 -0600
@@ -225,3 +225,7 @@
     return GLEW_OK;
 }
 #endif
+
+void fpcrtl_glShaderSource(GLuint shader, GLsizei count,/* const dropped for pas2c compat */ GLchar **string, const GLint *length) {
+    glShaderSource(shader, count, (const char * const *)string, length);
+}
--- a/project_files/hwc/rtl/sysutils.c	Mon Jan 14 15:11:15 2019 -0500
+++ b/project_files/hwc/rtl/sysutils.c	Fri Aug 16 10:59:50 2019 -0600
@@ -80,13 +80,24 @@
     return fpcrtl_date() + fpcrtl_time();
 }
 
-/*
- * XXX: dummy
- */
+// Semi-dummy implementation of FormatDateTime
 string255 fpcrtl_formatDateTime(string255 FormatStr, TDateTime DateTime)
 {
-    string255 result = STRINIT("2012 01-01");
-    return result;
+    string255 buffer = STRINIT(FormatStr.str);
+    time_t rawtime;
+    struct tm* my_tm;
+
+    // DateTime is ignored, always uses current time.
+    // TODO: Use DateTime argument properly.
+    time(&rawtime);
+    my_tm = localtime(&rawtime);
+
+    // Currently uses a hardcoded format string, FormatStr is ignored.
+    // The format strings for C and Pascal differ!
+    // TODO: Use FormatStr argument properly.
+    size_t len = strftime(buffer.str, sizeof(buffer.str), "%Y-%m-%d-%H-%M-%S-0", my_tm);
+    buffer.len = len;
+    return buffer;
 }
 
 string255 fpcrtl_trim(string255 s)
--- a/qmlfrontend/CMakeLists.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/qmlfrontend/CMakeLists.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -15,6 +15,11 @@
     "team.cpp" "team.h"
     "engine_instance.cpp" "engine_instance.h"
     "preview_image_provider.cpp" "preview_image_provider.h"
-    "engine_interface.h")
+    "engine_interface.h"
+    "preview_acceptor.cpp" "preview_acceptor.h"
+    "net_session.cpp" "net_session.h"
+    "players_model.cpp" "players_model.h"
+    "rooms_model.cpp" "rooms_model.h"
+    )
 
-target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Quick)
+target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Network Qt5::Quick)
--- a/qmlfrontend/Page1.qml	Mon Jan 14 15:11:15 2019 -0500
+++ b/qmlfrontend/Page1.qml	Fri Aug 16 10:59:50 2019 -0600
@@ -2,24 +2,66 @@
 import Hedgewars.Engine 1.0
 
 Page1Form {
-  tickButton.onClicked: {
-    gameView.tick(100)
+  focus: true
+
+  property HWEngine hwEngine
+  property NetSession netSession
+
+  Component {
+    id: hwEngineComponent
+
+    HWEngine {
+      engineLibrary: "./libhedgewars_engine.so"
+      previewAcceptor: PreviewAcceptor
+      onPreviewImageChanged: previewImage.source = "image://preview/image"
+      onPreviewIsRendering: previewImage.source = "qrc:/res/iconTime.png"
+    }
   }
-  gameButton.onClicked: {
-    var engineInstance = HWEngine.runQuickGame()
-    gameView.engineInstance = engineInstance
+
+  Component {
+    id: netSessionComponent
+
+    NetSession {
+      nickname: "test0272"
+      url: "hwnet://gameserver.hedgewars.org:46632"
+    }
   }
-  button1.onClicked: {
-    HWEngine.getPreview()
+
+  Component.onCompleted: {
+    hwEngine = hwEngineComponent.createObject()
   }
 
-  Connections {
-    target: HWEngine
-    onPreviewImageChanged: {
-      previewImage.source = "image://preview/image"
+  tickButton {
+    onClicked: {
+      tickButton.visible = false
+      gameView.tick(100)
     }
-    onPreviewIsRendering: {
-      previewImage.source = "qrc:/res/iconTime.png"
+  }
+  gameButton {
+    visible: !gameView.engineInstance
+    onClicked: {
+      var engineInstance = hwEngine.runQuickGame()
+      gameView.engineInstance = engineInstance
     }
   }
+  button1 {
+    visible: !gameView.engineInstance
+    onClicked: {
+      hwEngine.getPreview()
+    }
+  }
+  netButton.onClicked: {
+    netSession = netSessionComponent.createObject()
+    netSession.open()
+  }
+
+  Keys.onPressed: {
+    if (event.key === Qt.Key_Enter)
+      gameView.engineInstance.longEvent(Engine.Attack, Engine.Set)
+  }
+
+  Keys.onReleased: {
+    if (event.key === Qt.Key_Enter)
+      gameView.engineInstance.longEvent(Engine.Attack, Engine.Unset)
+  }
 }
--- a/qmlfrontend/Page1Form.ui.qml	Mon Jan 14 15:11:15 2019 -0500
+++ b/qmlfrontend/Page1Form.ui.qml	Fri Aug 16 10:59:50 2019 -0600
@@ -5,11 +5,13 @@
 import Hedgewars.Engine 1.0
 
 Item {
+  id: element
   property alias button1: button1
   property alias previewImage: previewImage
   property alias gameButton: gameButton
   width: 1024
   height: 800
+  property alias netButton: netButton
   property alias tickButton: tickButton
   property alias gameView: gameView
 
@@ -80,4 +82,13 @@
       Layout.fillHeight: true
     }
   }
+
+  Button {
+    id: netButton
+    text: qsTr("Net")
+    anchors.bottom: parent.bottom
+    anchors.bottomMargin: 8
+    anchors.left: parent.left
+    anchors.leftMargin: 8
+  }
 }
--- a/qmlfrontend/engine_instance.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/qmlfrontend/engine_instance.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -1,6 +1,7 @@
 #include "engine_instance.h"
 
 #include <QDebug>
+#include <QLibrary>
 #include <QOpenGLFunctions>
 #include <QSurface>
 
@@ -12,37 +13,122 @@
     return currentOpenglContext->getProcAddress(fn);
 }
 
-EngineInstance::EngineInstance(QObject* parent)
-    : QObject(parent), m_instance(Engine::start_engine()) {}
+EngineInstance::EngineInstance(const QString& libraryPath, QObject* parent)
+    : QObject(parent) {
+  QLibrary hwlib(libraryPath);
+
+  if (!hwlib.load())
+    qWarning() << "Engine library not found" << hwlib.errorString();
+
+  hedgewars_engine_protocol_version =
+      reinterpret_cast<Engine::hedgewars_engine_protocol_version_t*>(
+          hwlib.resolve("hedgewars_engine_protocol_version"));
+  start_engine =
+      reinterpret_cast<Engine::start_engine_t*>(hwlib.resolve("start_engine"));
+  generate_preview = reinterpret_cast<Engine::generate_preview_t*>(
+      hwlib.resolve("generate_preview"));
+  dispose_preview = reinterpret_cast<Engine::dispose_preview_t*>(
+      hwlib.resolve("dispose_preview"));
+  cleanup = reinterpret_cast<Engine::cleanup_t*>(hwlib.resolve("cleanup"));
+
+  send_ipc = reinterpret_cast<Engine::send_ipc_t*>(hwlib.resolve("send_ipc"));
+  read_ipc = reinterpret_cast<Engine::read_ipc_t*>(hwlib.resolve("read_ipc"));
 
-EngineInstance::~EngineInstance() { Engine::cleanup(m_instance); }
+  setup_current_gl_context =
+      reinterpret_cast<Engine::setup_current_gl_context_t*>(
+          hwlib.resolve("setup_current_gl_context"));
+  render_frame =
+      reinterpret_cast<Engine::render_frame_t*>(hwlib.resolve("render_frame"));
+  advance_simulation = reinterpret_cast<Engine::advance_simulation_t*>(
+      hwlib.resolve("advance_simulation"));
+  move_camera =
+      reinterpret_cast<Engine::move_camera_t*>(hwlib.resolve("move_camera"));
+  simple_event =
+      reinterpret_cast<Engine::simple_event_t*>(hwlib.resolve("simple_event"));
+  long_event =
+      reinterpret_cast<Engine::long_event_t*>(hwlib.resolve("long_event"));
+  positioned_event = reinterpret_cast<Engine::positioned_event_t*>(
+      hwlib.resolve("positioned_event"));
+
+  m_isValid = hedgewars_engine_protocol_version && start_engine &&
+              generate_preview && dispose_preview && cleanup && send_ipc &&
+              read_ipc && setup_current_gl_context && render_frame &&
+              advance_simulation && move_camera && simple_event && long_event &&
+              positioned_event;
+
+  emit isValidChanged(m_isValid);
+
+  if (isValid()) {
+    qDebug() << "Loaded engine library with protocol version"
+             << hedgewars_engine_protocol_version();
+
+    m_instance = start_engine();
+  } else {
+    qDebug("Engine library load failed");
+  }
+}
+
+EngineInstance::~EngineInstance() {
+  if (m_isValid) cleanup(m_instance);
+}
 
 void EngineInstance::sendConfig(const GameConfig& config) {
   for (auto b : config.config()) {
-    Engine::send_ipc(m_instance, reinterpret_cast<uint8_t*>(b.data()),
-                     static_cast<size_t>(b.size()));
+    send_ipc(m_instance, reinterpret_cast<uint8_t*>(b.data()),
+             static_cast<size_t>(b.size()));
   }
 }
 
 void EngineInstance::advance(quint32 ticks) {
-  Engine::advance_simulation(m_instance, ticks);
+  advance_simulation(m_instance, ticks);
+}
+
+void EngineInstance::moveCamera(const QPoint& delta) {
+  move_camera(m_instance, delta.x(), delta.y());
+}
+
+void EngineInstance::simpleEvent(Engine::SimpleEventType event_type) {
+  simple_event(m_instance, event_type);
 }
 
-void EngineInstance::renderFrame() { Engine::render_frame(m_instance); }
+void EngineInstance::longEvent(Engine::LongEventType event_type,
+                               Engine::LongEventState state) {
+  long_event(m_instance, event_type, state);
+}
+
+void EngineInstance::positionedEvent(Engine::PositionedEventType event_type,
+                                     qint32 x, qint32 y) {
+  positioned_event(m_instance, event_type, x, y);
+}
+
+void EngineInstance::renderFrame() { render_frame(m_instance); }
 
 void EngineInstance::setOpenGLContext(QOpenGLContext* context) {
   currentOpenglContext = context;
 
   auto size = context->surface()->size();
-  Engine::setup_current_gl_context(
-      m_instance, static_cast<quint16>(size.width()),
-      static_cast<quint16>(size.height()), &getProcAddress);
+  setup_current_gl_context(m_instance, static_cast<quint16>(size.width()),
+                           static_cast<quint16>(size.height()),
+                           &getProcAddress);
 }
 
-Engine::PreviewInfo EngineInstance::generatePreview() {
+QImage EngineInstance::generatePreview() {
   Engine::PreviewInfo pinfo;
 
-  Engine::generate_preview(m_instance, &pinfo);
+  generate_preview(m_instance, &pinfo);
+
+  QVector<QRgb> colorTable;
+  colorTable.resize(256);
+  for (int i = 0; i < 256; ++i) colorTable[i] = qRgba(255, 255, 0, i);
 
-  return pinfo;
+  QImage previewImage(pinfo.land, static_cast<int>(pinfo.width),
+                      static_cast<int>(pinfo.height), QImage::Format_Indexed8);
+  previewImage.setColorTable(colorTable);
+
+  // Cannot use it here, since QImage refers to original bytes
+  // dispose_preview(m_instance);
+
+  return previewImage;
 }
+
+bool EngineInstance::isValid() const { return m_isValid; }
--- a/qmlfrontend/engine_instance.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/qmlfrontend/engine_instance.h	Fri Aug 16 10:59:50 2019 -0600
@@ -1,31 +1,61 @@
 #ifndef ENGINEINSTANCE_H
 #define ENGINEINSTANCE_H
 
-#include "engine_interface.h"
-
+#include <QImage>
 #include <QObject>
 #include <QOpenGLContext>
 
+#include "engine_interface.h"
 #include "game_config.h"
 
 class EngineInstance : public QObject {
   Q_OBJECT
+
  public:
-  explicit EngineInstance(QObject* parent = nullptr);
+  explicit EngineInstance(const QString& libraryPath,
+                          QObject* parent = nullptr);
   ~EngineInstance();
 
+  Q_PROPERTY(bool isValid READ isValid NOTIFY isValidChanged)
+
   void sendConfig(const GameConfig& config);
-  void advance(quint32 ticks);
   void renderFrame();
   void setOpenGLContext(QOpenGLContext* context);
-  Engine::PreviewInfo generatePreview();
+  QImage generatePreview();
+
+  bool isValid() const;
 
  signals:
+  void isValidChanged(bool isValid);
 
  public slots:
+  void advance(quint32 ticks);
+  void moveCamera(const QPoint& delta);
+  void simpleEvent(Engine::SimpleEventType event_type);
+  void longEvent(Engine::LongEventType event_type,
+                 Engine::LongEventState state);
+  void positionedEvent(Engine::PositionedEventType event_type, qint32 x,
+                       qint32 y);
 
  private:
   Engine::EngineInstance* m_instance;
+
+  Engine::hedgewars_engine_protocol_version_t*
+      hedgewars_engine_protocol_version;
+  Engine::start_engine_t* start_engine;
+  Engine::generate_preview_t* generate_preview;
+  Engine::dispose_preview_t* dispose_preview;
+  Engine::cleanup_t* cleanup;
+  Engine::send_ipc_t* send_ipc;
+  Engine::read_ipc_t* read_ipc;
+  Engine::setup_current_gl_context_t* setup_current_gl_context;
+  Engine::render_frame_t* render_frame;
+  Engine::advance_simulation_t* advance_simulation;
+  Engine::move_camera_t* move_camera;
+  Engine::simple_event_t* simple_event;
+  Engine::long_event_t* long_event;
+  Engine::positioned_event_t* positioned_event;
+  bool m_isValid;
 };
 
 #endif  // ENGINEINSTANCE_H
--- a/qmlfrontend/engine_interface.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/qmlfrontend/engine_interface.h	Fri Aug 16 10:59:50 2019 -0600
@@ -5,8 +5,24 @@
 #include <stdint.h>
 
 #ifdef __cplusplus
+#define ENUM_CLASS enum
+
+#ifndef Q_NAMESPACE
+#define Q_NAMESPACE
+#endif
+
+#ifndef Q_ENUM_NS
+#define Q_ENUM_NS(x)
+#endif
+
+#ifndef Q_DECLARE_METATYPE
+#define Q_DECLARE_METATYPE(x)
+#endif
+
 namespace Engine {
 extern "C" {
+#else
+#define ENUM_CLASS enum class
 #endif
 
 typedef struct _EngineInstance EngineInstance;
@@ -18,10 +34,11 @@
   unsigned char* land;
 } PreviewInfo;
 
-typedef uint32_t protocol_version_t();
+typedef uint32_t hedgewars_engine_protocol_version_t();
 typedef EngineInstance* start_engine_t();
 typedef void generate_preview_t(EngineInstance* engine_state,
                                 PreviewInfo* preview);
+typedef void dispose_preview_t(EngineInstance* engine_state);
 typedef void cleanup_t(EngineInstance* engine_state);
 
 typedef void send_ipc_t(EngineInstance* engine_state, uint8_t* buf,
@@ -36,21 +53,50 @@
 
 typedef bool advance_simulation_t(EngineInstance* engine_state, uint32_t ticks);
 
-extern protocol_version_t* protocol_version;
-extern start_engine_t* start_engine;
-extern generate_preview_t* generate_preview;
-extern cleanup_t* cleanup;
+typedef void move_camera_t(EngineInstance* engine_state, int32_t delta_x,
+                           int32_t delta_y);
+
+ENUM_CLASS SimpleEventType{
+    SwitchHedgehog, Timer, LongJump, HighJump, Accept, Deny,
+};
+
+ENUM_CLASS LongEventType{
+    ArrowUp, ArrowDown, ArrowLeft, ArrowRight, Precision, Attack,
+};
 
-extern send_ipc_t* send_ipc;
-extern read_ipc_t* read_ipc;
+ENUM_CLASS LongEventState{
+    Set,
+    Unset,
+};
 
-extern setup_current_gl_context_t* setup_current_gl_context;
-extern render_frame_t* render_frame;
-extern advance_simulation_t* advance_simulation;
+ENUM_CLASS PositionedEventType{
+    CursorMove,
+    CursorClick,
+};
+
+typedef void simple_event_t(EngineInstance* engine_state,
+                            SimpleEventType event_type);
+typedef void long_event_t(EngineInstance* engine_state,
+                          LongEventType event_type, LongEventState state);
+typedef void positioned_event_t(EngineInstance* engine_state,
+                                PositionedEventType event_type, int32_t x,
+                                int32_t y);
+}  // extern "C"
 
 #ifdef __cplusplus
-}
-};
+Q_NAMESPACE
+
+Q_ENUM_NS(SimpleEventType)
+Q_ENUM_NS(LongEventType)
+Q_ENUM_NS(LongEventState)
+Q_ENUM_NS(PositionedEventType)
+
+};  // namespace
+
+Q_DECLARE_METATYPE(Engine::SimpleEventType)
+Q_DECLARE_METATYPE(Engine::LongEventType)
+Q_DECLARE_METATYPE(Engine::LongEventState)
+Q_DECLARE_METATYPE(Engine::PositionedEventType)
 #endif
 
 #endif  // ENGINE_H
--- a/qmlfrontend/game_view.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/qmlfrontend/game_view.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -6,7 +6,8 @@
 #include <QtGui/QOpenGLContext>
 #include <QtGui/QOpenGLShaderProgram>
 
-GameView::GameView() : m_delta(0), m_windowChanged(true) {
+GameView::GameView(QQuickItem* parent)
+    : QQuickItem(parent), m_delta(0), m_windowChanged(true) {
   connect(this, &QQuickItem::windowChanged, this,
           &GameView::handleWindowChanged);
 }
@@ -58,17 +59,21 @@
             &GameViewRenderer::paint, Qt::DirectConnection);
   }
 
-  if (m_windowChanged) {
-    QSize windowSize = window()->size();
-    m_renderer->setViewportSize(windowSize * window()->devicePixelRatio());
-    m_centerX = windowSize.width() / 2;
-    m_centerY = windowSize.height() / 2;
+  if (m_windowChanged || (m_viewportSize != window()->size())) {
+    m_windowChanged = false;
+
+    if (m_engineInstance)
+      m_engineInstance->setOpenGLContext(window()->openglContext());
+
+    m_viewportSize = window()->size();
+    m_centerPoint = QPoint(m_viewportSize.width(), m_viewportSize.height()) / 2;
   }
 
-  // QPoint mousePos = mapFromGlobal(QCursor::pos()).toPoint();
-  // if (flibUpdateMousePosition(m_centerX, m_centerY, mousePos.x(),
-  // mousePos.y()))
-  //  QCursor::setPos(mapToGlobal(QPointF(m_centerX, m_centerY)).toPoint());
+  if (m_engineInstance) {
+    QPoint mousePos = mapFromGlobal(QCursor::pos()).toPoint();
+    m_engineInstance->moveCamera(mousePos - m_centerPoint);
+    QCursor::setPos(mapToGlobal(m_centerPoint).toPoint());
+  }
 
   if (m_renderer) m_renderer->tick(m_delta);
 }
@@ -80,10 +85,6 @@
 
 void GameViewRenderer::tick(quint32 delta) { m_delta = delta; }
 
-void GameViewRenderer::setViewportSize(const QSize& size) {
-  // flibResizeWindow(size.width(), size.height());
-}
-
 void GameViewRenderer::setEngineInstance(EngineInstance* engineInstance) {
   m_engineInstance = engineInstance;
 }
@@ -98,3 +99,8 @@
 
   // m_window->resetOpenGLState();
 }
+
+void GameViewRenderer::onViewportSizeChanged(QQuickWindow* window) {
+  if (m_engineInstance)
+    m_engineInstance->setOpenGLContext(window->openglContext());
+}
--- a/qmlfrontend/game_view.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/qmlfrontend/game_view.h	Fri Aug 16 10:59:50 2019 -0600
@@ -13,15 +13,15 @@
 class GameViewRenderer : public QObject, protected QOpenGLFunctions {
   Q_OBJECT
  public:
-  GameViewRenderer();
-  ~GameViewRenderer();
+  explicit GameViewRenderer();
+  ~GameViewRenderer() override;
 
   void tick(quint32 delta);
-  void setViewportSize(const QSize& size);
   void setEngineInstance(EngineInstance* engineInstance);
 
  public slots:
   void paint();
+  void onViewportSizeChanged(QQuickWindow* window);
 
  private:
   quint32 m_delta;
@@ -35,7 +35,7 @@
                  setEngineInstance NOTIFY engineInstanceChanged)
 
  public:
-  GameView();
+  explicit GameView(QQuickItem* parent = nullptr);
 
   Q_INVOKABLE void tick(quint32 delta);
 
@@ -56,9 +56,9 @@
   quint32 m_delta;
   QScopedPointer<GameViewRenderer> m_renderer;
   bool m_windowChanged;
-  qint32 m_centerX;
-  qint32 m_centerY;
   QPointer<EngineInstance> m_engineInstance;
+  QSize m_viewportSize;
+  QPoint m_centerPoint;
 };
 
 #endif  // GAMEVIEW_H
--- a/qmlfrontend/hwengine.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/qmlfrontend/hwengine.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -1,64 +1,33 @@
+#include "hwengine.h"
+
 #include <QDebug>
-#include <QLibrary>
-#include <QQmlEngine>
+#include <QImage>
 #include <QUuid>
 
 #include "engine_instance.h"
 #include "engine_interface.h"
 #include "game_view.h"
-#include "preview_image_provider.h"
-
-#include "hwengine.h"
+#include "preview_acceptor.h"
 
-HWEngine::HWEngine(QQmlEngine* engine, QObject* parent)
-    : QObject(parent),
-      m_engine(engine),
-      m_previewProvider(new PreviewImageProvider()) {
-  m_engine->addImageProvider(QLatin1String("preview"), m_previewProvider);
-}
+HWEngine::HWEngine(QObject* parent) : QObject(parent) {}
 
 HWEngine::~HWEngine() {}
 
-static QObject* hwengine_singletontype_provider(QQmlEngine* engine,
-                                                QJSEngine* scriptEngine) {
-  Q_UNUSED(scriptEngine)
-
-  HWEngine* hwengine = new HWEngine(engine);
-  return hwengine;
-}
-
-void HWEngine::exposeToQML() {
-  qDebug("HWEngine::exposeToQML");
-  qmlRegisterSingletonType<HWEngine>("Hedgewars.Engine", 1, 0, "HWEngine",
-                                     hwengine_singletontype_provider);
-  qmlRegisterType<GameView>("Hedgewars.Engine", 1, 0, "GameView");
-  qmlRegisterUncreatableType<EngineInstance>("Hedgewars.Engine", 1, 0,
-                                             "EngineInstance",
-                                             "Create by HWEngine run methods");
-}
-
 void HWEngine::getPreview() {
   emit previewIsRendering();
 
   m_gameConfig = GameConfig();
   m_gameConfig.cmdSeed(QUuid::createUuid().toByteArray());
 
-  EngineInstance engine;
+  EngineInstance engine(m_engineLibrary);
+  if (!engine.isValid())  // TODO: error notification
+    return;
+
   engine.sendConfig(m_gameConfig);
 
-  Engine::PreviewInfo preview = engine.generatePreview();
-
-  QVector<QRgb> colorTable;
-  colorTable.resize(256);
-  for (int i = 0; i < 256; ++i) colorTable[i] = qRgba(255, 255, 0, i);
+  QImage previewImage = engine.generatePreview();
 
-  QImage previewImage(preview.land, static_cast<int>(preview.width),
-                      static_cast<int>(preview.height),
-                      QImage::Format_Indexed8);
-  previewImage.setColorTable(colorTable);
-  previewImage.detach();
-
-  m_previewProvider->setImage(previewImage);
+  if (m_previewAcceptor) m_previewAcceptor->setImage(previewImage);
 
   emit previewImageChanged();
   // m_runQueue->queue(m_gameConfig);
@@ -74,9 +43,28 @@
   m_gameConfig.cmdTeam(team1);
   m_gameConfig.cmdTeam(team2);
 
-  EngineInstance* engine = new EngineInstance(this);
+  EngineInstance* engine = new EngineInstance(m_engineLibrary, this);
+
   return engine;
   // m_runQueue->queue(m_gameConfig);
 }
 
 int HWEngine::previewHedgehogsCount() const { return m_previewHedgehogsCount; }
+
+PreviewAcceptor* HWEngine::previewAcceptor() const { return m_previewAcceptor; }
+
+QString HWEngine::engineLibrary() const { return m_engineLibrary; }
+
+void HWEngine::setPreviewAcceptor(PreviewAcceptor* previewAcceptor) {
+  if (m_previewAcceptor == previewAcceptor) return;
+
+  m_previewAcceptor = previewAcceptor;
+  emit previewAcceptorChanged(m_previewAcceptor);
+}
+
+void HWEngine::setEngineLibrary(const QString& engineLibrary) {
+  if (m_engineLibrary == engineLibrary) return;
+
+  m_engineLibrary = engineLibrary;
+  emit engineLibraryChanged(m_engineLibrary);
+}
--- a/qmlfrontend/hwengine.h	Mon Jan 14 15:11:15 2019 -0500
+++ b/qmlfrontend/hwengine.h	Fri Aug 16 10:59:50 2019 -0600
@@ -8,25 +8,33 @@
 #include "game_config.h"
 
 class QQmlEngine;
-class PreviewImageProvider;
 class EngineInstance;
+class PreviewAcceptor;
 
 class HWEngine : public QObject {
   Q_OBJECT
 
   Q_PROPERTY(int previewHedgehogsCount READ previewHedgehogsCount NOTIFY
                  previewHedgehogsCountChanged)
+  Q_PROPERTY(PreviewAcceptor* previewAcceptor READ previewAcceptor WRITE
+                 setPreviewAcceptor NOTIFY previewAcceptorChanged)
+  Q_PROPERTY(QString engineLibrary READ engineLibrary WRITE setEngineLibrary
+                 NOTIFY engineLibraryChanged)
 
  public:
-  explicit HWEngine(QQmlEngine* engine, QObject* parent = nullptr);
+  explicit HWEngine(QObject* parent = nullptr);
   ~HWEngine();
 
-  static void exposeToQML();
-
   Q_INVOKABLE void getPreview();
   Q_INVOKABLE EngineInstance* runQuickGame();
 
   int previewHedgehogsCount() const;
+  PreviewAcceptor* previewAcceptor() const;
+  QString engineLibrary() const;
+
+ public slots:
+  void setPreviewAcceptor(PreviewAcceptor* previewAcceptor);
+  void setEngineLibrary(const QString& engineLibrary);
 
  signals:
   void previewIsRendering();
@@ -34,12 +42,15 @@
   void previewHogCountChanged(int count);
   void gameFinished();
   void previewHedgehogsCountChanged(int previewHedgehogsCount);
+  void previewAcceptorChanged(PreviewAcceptor* previewAcceptor);
+  void engineLibraryChanged(const QString& engineLibrary);
 
  private:
   QQmlEngine* m_engine;
-  PreviewImageProvider* m_previewProvider;
   GameConfig m_gameConfig;
   int m_previewHedgehogsCount;
+  PreviewAcceptor* m_previewAcceptor;
+  QString m_engineLibrary;
 };
 
 #endif  // HWENGINE_H
--- a/qmlfrontend/main.cpp	Mon Jan 14 15:11:15 2019 -0500
+++ b/qmlfrontend/main.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -4,66 +4,42 @@
 #include <QQmlApplicationEngine>
 
 #include "engine_interface.h"
+#include "game_view.h"
 #include "hwengine.h"
-
-namespace Engine {
-protocol_version_t* protocol_version;
-start_engine_t* start_engine;
-generate_preview_t* generate_preview;
-cleanup_t* cleanup;
-send_ipc_t* send_ipc;
-read_ipc_t* read_ipc;
-setup_current_gl_context_t* setup_current_gl_context;
-render_frame_t* render_frame;
-advance_simulation_t* advance_simulation;
-};  // namespace Engine
-
-void loadEngineLibrary() {
-#ifdef Q_OS_WIN
-  QLibrary hwlib("./libhedgewars_engine.dll");
-#else
-  QLibrary hwlib("./libhedgewars_engine.so");
-#endif
-
-  if (!hwlib.load())
-    qWarning() << "Engine library not found" << hwlib.errorString();
+#include "net_session.h"
+#include "preview_acceptor.h"
 
-  Engine::protocol_version = reinterpret_cast<Engine::protocol_version_t*>(
-      hwlib.resolve("protocol_version"));
-  Engine::start_engine =
-      reinterpret_cast<Engine::start_engine_t*>(hwlib.resolve("start_engine"));
-  Engine::generate_preview = reinterpret_cast<Engine::generate_preview_t*>(
-      hwlib.resolve("generate_preview"));
-  Engine::cleanup =
-      reinterpret_cast<Engine::cleanup_t*>(hwlib.resolve("cleanup"));
+static QObject* previewacceptor_singletontype_provider(
+    QQmlEngine* engine, QJSEngine* scriptEngine) {
+  Q_UNUSED(scriptEngine)
 
-  Engine::send_ipc =
-      reinterpret_cast<Engine::send_ipc_t*>(hwlib.resolve("send_ipc"));
-  Engine::read_ipc =
-      reinterpret_cast<Engine::read_ipc_t*>(hwlib.resolve("read_ipc"));
-
-  Engine::setup_current_gl_context =
-      reinterpret_cast<Engine::setup_current_gl_context_t*>(
-          hwlib.resolve("setup_current_gl_context"));
-  Engine::render_frame =
-      reinterpret_cast<Engine::render_frame_t*>(hwlib.resolve("render_frame"));
-  Engine::advance_simulation = reinterpret_cast<Engine::advance_simulation_t*>(
-      hwlib.resolve("advance_simulation"));
-
-  if (Engine::protocol_version)
-    qDebug() << "Loaded engine library with protocol version"
-             << Engine::protocol_version();
+  PreviewAcceptor* acceptor = new PreviewAcceptor(engine);
+  return acceptor;
 }
 
 int main(int argc, char* argv[]) {
   QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
   QGuiApplication app(argc, argv);
 
-  loadEngineLibrary();
-
   QQmlApplicationEngine engine;
 
-  HWEngine::exposeToQML();
+  qRegisterMetaType<Engine::SimpleEventType>();
+  qRegisterMetaType<Engine::LongEventType>();
+  qRegisterMetaType<Engine::LongEventState>();
+  qRegisterMetaType<Engine::PositionedEventType>();
+
+  qmlRegisterSingletonType<PreviewAcceptor>(
+      "Hedgewars.Engine", 1, 0, "PreviewAcceptor",
+      previewacceptor_singletontype_provider);
+  qmlRegisterType<HWEngine>("Hedgewars.Engine", 1, 0, "HWEngine");
+  qmlRegisterType<GameView>("Hedgewars.Engine", 1, 0, "GameView");
+  qmlRegisterType<NetSession>("Hedgewars.Engine", 1, 0, "NetSession");
+  qmlRegisterUncreatableType<EngineInstance>("Hedgewars.Engine", 1, 0,
+                                             "EngineInstance",
+                                             "Create by HWEngine run methods");
+
+  qmlRegisterUncreatableMetaObject(Engine::staticMetaObject, "Hedgewars.Engine",
+                                   1, 0, "Engine", "Namespace: only enums");
 
   engine.load(QUrl(QLatin1String("qrc:/main.qml")));
   if (engine.rootObjects().isEmpty()) return -1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/qmlfrontend/net_session.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,367 @@
+#include "net_session.h"
+
+#include <QUuid>
+
+#include "players_model.h"
+#include "rooms_model.h"
+
+NetSession::NetSession(QObject *parent)
+    : QObject(parent),
+      m_playersModel(new PlayersListModel()),
+      m_roomsModel(new RoomsListModel()),
+      m_sessionState(NotConnected) {}
+
+NetSession::~NetSession() { close(); }
+
+QUrl NetSession::url() const { return m_url; }
+
+QAbstractSocket::SocketState NetSession::state() const {
+  if (m_socket)
+    return m_socket->state();
+  else
+    return QAbstractSocket::UnconnectedState;
+}
+
+void NetSession::open() {
+  m_socket.reset(new QTcpSocket());
+
+  connect(m_socket.data(), &QAbstractSocket::stateChanged, this,
+          &NetSession::stateChanged);
+  connect(m_socket.data(), &QTcpSocket::readyRead, this,
+          &NetSession::onReadyRead);
+
+  m_socket->connectToHost(m_url.host(),
+                          static_cast<quint16>(m_url.port(46631)));
+}
+
+QString NetSession::nickname() const { return m_nickname; }
+
+NetSession::SessionState NetSession::sessionState() const {
+  return m_sessionState;
+}
+
+QString NetSession::room() const { return m_room; }
+
+QString NetSession::passwordHash() const { return m_passwordHash; }
+
+void NetSession::setUrl(const QUrl &url) {
+  if (m_url == url) return;
+
+  m_url = url;
+  emit urlChanged(m_url);
+}
+
+void NetSession::setNickname(const QString &nickname) {
+  if (m_nickname == nickname) return;
+
+  m_nickname = nickname;
+  emit nicknameChanged(m_nickname);
+}
+
+void NetSession::setPasswordHash(const QString &passwordHash) {
+  if (m_passwordHash == passwordHash) return;
+
+  m_passwordHash = passwordHash;
+  emit passwordHashChanged(m_passwordHash);
+
+  if (m_sessionState == Authentication) sendPassword();
+}
+
+void NetSession::setRoom(const QString &room) {
+  if (m_room == room) return;
+
+  m_room = room;
+  emit roomChanged(m_room);
+}
+
+void NetSession::close() {
+  if (!m_socket.isNull()) {
+    m_socket->disconnectFromHost();
+    m_socket.clear();
+
+    setSessionState(NotConnected);
+    setRoom({});
+  }
+}
+
+void NetSession::onReadyRead() {
+  while (m_socket->canReadLine()) {
+    auto line = QString::fromUtf8(m_socket->readLine().simplified());
+
+    if (line.isEmpty()) {
+      parseNetMessage(m_buffer);
+      m_buffer.clear();
+    } else {
+      m_buffer.append(line);
+    }
+  }
+}
+
+void NetSession::parseNetMessage(const QStringList &message) {
+  if (message.isEmpty()) {
+    qWarning() << "Empty net message received";
+    return;
+  }
+
+  qDebug() << "[SERVER]" << message;
+
+  using Handler = std::function<void(NetSession *, const QStringList &)>;
+  static QMap<QString, Handler> commandsMap{
+      {"ADD_TEAM", &NetSession::handleAddTeam},
+      {"ASKPASSWORD", &NetSession::handleAskPassword},
+      {"BANLIST", &NetSession::handleBanList},
+      {"BYE", &NetSession::handleBye},
+      {"CFG", &NetSession::handleCfg},
+      {"CHAT", &NetSession::handleChat},
+      {"CLIENT_FLAGS", &NetSession::handleClientFlags},
+      {"CONNECTED", &NetSession::handleConnected},
+      {"EM", &NetSession::handleEm},
+      {"ERROR", &NetSession::handleError},
+      {"HH_NUM", &NetSession::handleHhNum},
+      {"INFO", &NetSession::handleInfo},
+      {"JOINED", &NetSession::handleJoined},
+      {"JOINING", &NetSession::handleJoining},
+      {"KICKED", &NetSession::handleKicked},
+      {"LEFT", &NetSession::handleLeft},
+      {"LOBBY:JOINED", &NetSession::handleLobbyJoined},
+      {"LOBBY:LEFT", &NetSession::handleLobbyLeft},
+      {"NICK", &NetSession::handleNick},
+      {"NOTICE", &NetSession::handleNotice},
+      {"PING", &NetSession::handlePing},
+      {"PONG", &NetSession::handlePong},
+      {"PROTO", &NetSession::handleProto},
+      {"REDIRECT", &NetSession::handleRedirect},
+      {"REMOVE_TEAM", &NetSession::handleRemoveTeam},
+      {"REPLAY_START", &NetSession::handleReplayStart},
+      {"ROOMABANDONED", &NetSession::handleRoomAbandoned},
+      {"ROOM", &NetSession::handleRoom},
+      {"ROOMS", &NetSession::handleRooms},
+      {"ROUND_FINISHED", &NetSession::handleRoundFinished},
+      {"RUN_GAME", &NetSession::handleRunGame},
+      {"SERVER_AUTH", &NetSession::handleServerAuth},
+      {"SERVER_MESSAGE", &NetSession::handleServerMessage},
+      {"SERVER_VARS", &NetSession::handleServerVars},
+      {"TEAM_ACCEPTED", &NetSession::handleTeamAccepted},
+      {"TEAM_COLOR", &NetSession::handleTeamColor},
+      {"WARNING", &NetSession::handleWarning},
+  };
+
+  auto handler =
+      commandsMap.value(message[0], &NetSession::handleUnknownCommand);
+
+  handler(this, message.mid(1));
+}
+
+void NetSession::handleConnected(const QStringList &parameters) {
+  if (parameters.length() < 2 || parameters[1].toInt() < cMinServerVersion) {
+    send("QUIT", "Server too old");
+    emit error(tr("Server too old"));
+    close();
+  } else {
+    setSessionState(Login);
+
+    send("NICK", m_nickname);
+    send("PROTO", QString::number(cProtocolVersion));
+  }
+}
+
+void NetSession::handlePing(const QStringList &parameters) {
+  send("PONG", parameters);
+}
+
+void NetSession::handleBye(const QStringList &parameters) { close(); }
+
+void NetSession::handleUnknownCommand(const QStringList &parameters) {
+  Q_UNUSED(parameters);
+
+  qWarning() << "Command is not recognized";
+}
+
+void NetSession::handleAddTeam(const QStringList &parameters) {}
+
+void NetSession::handleAskPassword(const QStringList &parameters) {
+  if (parameters.length() != 1 || parameters[0].length() < 16) {
+    qWarning("Bad ASKPASSWORD message");
+    return;
+  }
+
+  setSessionState(Authentication);
+
+  m_serverSalt = parameters[0];
+  m_clientSalt = QUuid::createUuid().toString();
+
+  if (m_passwordHash.isEmpty()) {
+    emit passwordAsked();
+  } else {
+    sendPassword();
+  }
+}
+
+void NetSession::handleBanList(const QStringList &parameters) {}
+
+void NetSession::handleCfg(const QStringList &parameters) {}
+
+void NetSession::handleChat(const QStringList &parameters) {}
+
+void NetSession::handleClientFlags(const QStringList &parameters) {}
+
+void NetSession::handleEm(const QStringList &parameters) {}
+
+void NetSession::handleError(const QStringList &parameters) {}
+
+void NetSession::handleHhNum(const QStringList &parameters) {}
+
+void NetSession::handleInfo(const QStringList &parameters) {}
+
+void NetSession::handleJoined(const QStringList &parameters) {}
+
+void NetSession::handleJoining(const QStringList &parameters) {}
+
+void NetSession::handleKicked(const QStringList &parameters) {}
+
+void NetSession::handleLeft(const QStringList &parameters) {}
+
+void NetSession::handleLobbyJoined(const QStringList &parameters) {
+  for (auto player : parameters) {
+    if (player == m_nickname) {
+      // check if server is authenticated or no authentication was performed at
+      // all
+      if (!m_serverAuthHash.isEmpty()) {
+        emit error(tr("Server authentication error"));
+
+        close();
+      }
+
+      setSessionState(Lobby);
+    }
+
+    m_playersModel->addPlayer(player, false);
+  }
+}
+
+void NetSession::handleLobbyLeft(const QStringList &parameters) {
+  if (parameters.length() == 1) {
+    m_playersModel->removePlayer(parameters[0]);
+  } else if (parameters.length() == 2) {
+    m_playersModel->removePlayer(parameters[0], parameters[1]);
+  } else {
+    qWarning("Malformed LOBBY:LEFT message");
+  }
+}
+
+void NetSession::handleNick(const QStringList &parameters) {
+  if (parameters.length()) setNickname(parameters[0]);
+}
+
+void NetSession::handleNotice(const QStringList &parameters) {}
+
+void NetSession::handlePong(const QStringList &parameters) {
+  Q_UNUSED(parameters)
+}
+
+void NetSession::handleProto(const QStringList &parameters) {}
+
+void NetSession::handleRedirect(const QStringList &parameters) {}
+
+void NetSession::handleRemoveTeam(const QStringList &parameters) {}
+
+void NetSession::handleReplayStart(const QStringList &parameters) {}
+
+void NetSession::handleRoomAbandoned(const QStringList &parameters) {}
+
+void NetSession::handleRoom(const QStringList &parameters) {
+  if (parameters.size() == 10 && parameters[0] == "ADD") {
+    m_roomsModel->addRoom(parameters.mid(1));
+  } else if (parameters.length() == 11 && parameters[0] == "UPD") {
+    m_roomsModel->updateRoom(parameters[1], parameters.mid(2));
+
+    // keep track of room name so correct name is displayed
+    if (m_room == parameters[1]) {
+      setRoom(parameters[2]);
+    }
+  } else if (parameters.size() == 2 && parameters[0] == "DEL") {
+    m_roomsModel->removeRoom(parameters[1]);
+  }
+}
+
+void NetSession::handleRooms(const QStringList &parameters) {
+  if (parameters.size() % 9) {
+    qWarning("Net: Malformed ROOMS message");
+    return;
+  }
+
+  m_roomsModel->setRoomsList(parameters);
+}
+
+void NetSession::handleRoundFinished(const QStringList &parameters) {}
+
+void NetSession::handleRunGame(const QStringList &parameters) {}
+
+void NetSession::handleServerAuth(const QStringList &parameters) {}
+
+void NetSession::handleServerMessage(const QStringList &parameters) {}
+
+void NetSession::handleServerVars(const QStringList &parameters) {}
+
+void NetSession::handleTeamAccepted(const QStringList &parameters) {}
+
+void NetSession::handleTeamColor(const QStringList &parameters) {}
+
+void NetSession::handleWarning(const QStringList &parameters) {}
+
+void NetSession::send(const QString &message) { send(QStringList(message)); }
+
+void NetSession::send(const QString &message, const QString &param) {
+  send(QStringList{message, param});
+}
+
+void NetSession::send(const QString &message, const QStringList &parameters) {
+  send(QStringList(message) + parameters);
+}
+
+void NetSession::send(const QStringList &message) {
+  Q_ASSERT(!m_socket.isNull());
+
+  qDebug() << "[CLIENT]" << message;
+
+  m_socket->write(message.join('\n').toUtf8() + "\n\n");
+}
+
+void NetSession::sendPassword() {
+  /* When we got password hash, and server asked us for a password, perform
+   * mutual authentication: at this point we have salt chosen by server. Client
+   * sends client salt and hash of secret (password hash) salted with client
+   * salt, server salt, and static salt (predefined string + protocol number).
+   * Server should respond with hash of the same set in different order.
+   */
+
+  if (m_passwordHash.isEmpty() || m_serverSalt.isEmpty()) return;
+
+  QString hash =
+      QCryptographicHash::hash(m_clientSalt.toLatin1()
+                                   .append(m_serverSalt.toLatin1())
+                                   .append(m_passwordHash)
+                                   .append(QByteArray::number(cProtocolVersion))
+                                   .append("!hedgewars"),
+                               QCryptographicHash::Sha1)
+          .toHex();
+
+  m_serverHash =
+      QCryptographicHash::hash(m_serverSalt.toLatin1()
+                                   .append(m_clientSalt.toLatin1())
+                                   .append(m_passwordHash)
+                                   .append(QByteArray::number(cProtocolVersion))
+                                   .append("!hedgewars"),
+                               QCryptographicHash::Sha1)
+          .toHex();
+
+  send("PASSWORD", QStringList{hash, m_clientSalt});
+}
+
+void NetSession::setSessionState(NetSession::SessionState sessionState) {
+  if (m_sessionState == sessionState) return;
+
+  m_sessionState = sessionState;
+
+  emit sessionStateChanged(sessionState);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/qmlfrontend/net_session.h	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,130 @@
+#ifndef NET_SESSION_H
+#define NET_SESSION_H
+
+#include <QSharedPointer>
+#include <QSslSocket>
+#include <QStringList>
+#include <QUrl>
+
+class PlayersListModel;
+class RoomsListModel;
+class NetSession : public QObject {
+  Q_OBJECT
+
+  const int cMinServerVersion = 3;
+  const int cProtocolVersion = 60;
+
+  // clang-format off
+  Q_PROPERTY(QUrl url READ url WRITE setUrl NOTIFY urlChanged)
+  Q_PROPERTY(QAbstractSocket::SocketState state READ state NOTIFY stateChanged)
+  Q_PROPERTY(QString nickname READ nickname WRITE setNickname NOTIFY nicknameChanged)
+  Q_PROPERTY(SessionState sessionState READ sessionState NOTIFY sessionStateChanged)
+  Q_PROPERTY(QString room READ room NOTIFY roomChanged)
+  Q_PROPERTY(QString passwordHash READ passwordHash WRITE setPasswordHash NOTIFY passwordHashChanged)
+  // clang-format on
+
+ public:
+  enum SessionState { NotConnected, Login, Authentication, Lobby, Room, Game };
+  Q_ENUMS(SessionState)
+
+  explicit NetSession(QObject *parent = nullptr);
+  ~NetSession() override;
+
+  QUrl url() const;
+  QAbstractSocket::SocketState state() const;
+
+  QString nickname() const;
+  SessionState sessionState() const;
+  QString room() const;
+  QString passwordHash() const;
+
+ public slots:
+  void open();
+  void close();
+
+  void setUrl(const QUrl &url);
+  void setNickname(const QString &nickname);
+  void setPasswordHash(const QString &passwordHash);
+
+ signals:
+  void urlChanged(const QUrl url);
+  void stateChanged(QAbstractSocket::SocketState state);
+  void nicknameChanged(const QString &nickname);
+  void sessionStateChanged(SessionState sessionState);
+  void warning(const QString &message);
+  void error(const QString &message);
+  void roomChanged(const QString &room);
+  void passwordHashChanged(const QString &passwordHash);
+  void passwordAsked();
+
+ private slots:
+  void onReadyRead();
+  void parseNetMessage(const QStringList &message);
+  void handleConnected(const QStringList &parameters);
+  void handlePing(const QStringList &parameters);
+  void handleBye(const QStringList &parameters);
+  void handleUnknownCommand(const QStringList &parameters);
+  void handleAddTeam(const QStringList &parameters);
+  void handleAskPassword(const QStringList &parameters);
+  void handleBanList(const QStringList &parameters);
+  void handleCfg(const QStringList &parameters);
+  void handleChat(const QStringList &parameters);
+  void handleClientFlags(const QStringList &parameters);
+  void handleEm(const QStringList &parameters);
+  void handleError(const QStringList &parameters);
+  void handleHhNum(const QStringList &parameters);
+  void handleInfo(const QStringList &parameters);
+  void handleJoined(const QStringList &parameters);
+  void handleJoining(const QStringList &parameters);
+  void handleKicked(const QStringList &parameters);
+  void handleLeft(const QStringList &parameters);
+  void handleLobbyJoined(const QStringList &parameters);
+  void handleLobbyLeft(const QStringList &parameters);
+  void handleNick(const QStringList &parameters);
+  void handleNotice(const QStringList &parameters);
+  void handlePong(const QStringList &parameters);
+  void handleProto(const QStringList &parameters);
+  void handleRedirect(const QStringList &parameters);
+  void handleRemoveTeam(const QStringList &parameters);
+  void handleReplayStart(const QStringList &parameters);
+  void handleRoomAbandoned(const QStringList &parameters);
+  void handleRoom(const QStringList &parameters);
+  void handleRooms(const QStringList &parameters);
+  void handleRoundFinished(const QStringList &parameters);
+  void handleRunGame(const QStringList &parameters);
+  void handleServerAuth(const QStringList &parameters);
+  void handleServerMessage(const QStringList &parameters);
+  void handleServerVars(const QStringList &parameters);
+  void handleTeamAccepted(const QStringList &parameters);
+  void handleTeamColor(const QStringList &parameters);
+  void handleWarning(const QStringList &parameters);
+
+  void send(const QString &message);
+  void send(const QString &message, const QString &param);
+  void send(const QString &message, const QStringList &parameters);
+  void send(const QStringList &message);
+
+  void sendPassword();
+
+  void setSessionState(SessionState sessionState);
+  void setRoom(const QString &room);
+
+ private:
+  QUrl m_url;
+  QSharedPointer<QTcpSocket> m_socket;
+  QSharedPointer<PlayersListModel> m_playersModel;
+  QSharedPointer<RoomsListModel> m_roomsModel;
+  QString m_nickname;
+  QStringList m_buffer;
+  SessionState m_sessionState;
+  QString m_serverAuthHash;
+  QString m_room;
+  QString m_serverSalt;
+  QString m_serverHash;
+  QString m_clientSalt;
+  QString m_passwordHash;
+
+  Q_DISABLE_COPY(NetSession)
+};
+
+#endif  // NET_SESSION_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/qmlfrontend/players_model.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,364 @@
+#include <QDebug>
+#include <QFile>
+#include <QModelIndex>
+#include <QModelIndexList>
+#include <QPainter>
+#include <QTextStream>
+
+#include "players_model.h"
+
+PlayersListModel::PlayersListModel(QObject *parent)
+    : QAbstractListModel(parent) {
+  m_fontInRoom = QFont();
+  m_fontInRoom.setItalic(true);
+}
+
+int PlayersListModel::rowCount(const QModelIndex &parent) const {
+  if (parent.isValid())
+    return 0;
+  else
+    return m_data.size();
+}
+
+QVariant PlayersListModel::data(const QModelIndex &index, int role) const {
+  if (!index.isValid() || index.row() < 0 || index.row() >= rowCount() ||
+      index.column() != 0)
+    return QVariant(QVariant::Invalid);
+
+  return m_data.at(index.row()).value(role);
+}
+
+bool PlayersListModel::setData(const QModelIndex &index, const QVariant &value,
+                               int role) {
+  if (!index.isValid() || index.row() < 0 || index.row() >= rowCount() ||
+      index.column() != 0)
+    return false;
+
+  m_data[index.row()].insert(role, value);
+
+  emit dataChanged(index, index);
+
+  return true;
+}
+
+bool PlayersListModel::insertRows(int row, int count,
+                                  const QModelIndex &parent) {
+  if (parent.isValid() || row > rowCount() || row < 0 || count < 1)
+    return false;
+
+  beginInsertRows(parent, row, row + count - 1);
+
+  for (int i = 0; i < count; ++i) m_data.insert(row, DataEntry());
+
+  endInsertRows();
+
+  return true;
+}
+
+bool PlayersListModel::removeRows(int row, int count,
+                                  const QModelIndex &parent) {
+  if (parent.isValid() || row + count > rowCount() || row < 0 || count < 1)
+    return false;
+
+  beginRemoveRows(parent, row, row + count - 1);
+
+  for (int i = 0; i < count; ++i) m_data.removeAt(row);
+
+  endRemoveRows();
+
+  return true;
+}
+
+QModelIndex PlayersListModel::nicknameIndex(const QString &nickname) {
+  QModelIndexList mil =
+      match(index(0), Qt::DisplayRole, nickname, 1, Qt::MatchExactly);
+
+  if (mil.size() > 0)
+    return mil[0];
+  else
+    return QModelIndex();
+}
+
+void PlayersListModel::addPlayer(const QString &nickname, bool notify) {
+  insertRow(rowCount());
+
+  QModelIndex mi = index(rowCount() - 1);
+  setData(mi, nickname);
+
+  checkFriendIgnore(mi);
+
+  emit nickAddedLobby(nickname, notify);
+}
+
+void PlayersListModel::removePlayer(const QString &nickname,
+                                    const QString &msg) {
+  if (msg.isEmpty())
+    emit nickRemovedLobby(nickname, QString());
+  else
+    emit nickRemovedLobby(nickname, msg);
+
+  QModelIndex mi = nicknameIndex(nickname);
+
+  if (mi.isValid()) removeRow(mi.row());
+}
+
+void PlayersListModel::playerJoinedRoom(const QString &nickname, bool notify) {
+  QModelIndex mi = nicknameIndex(nickname);
+
+  if (mi.isValid()) {
+    setData(mi, true, RoomFilterRole);
+    updateIcon(mi);
+    updateSortData(mi);
+  }
+
+  emit nickAdded(nickname, notify);
+}
+
+void PlayersListModel::playerLeftRoom(const QString &nickname) {
+  emit nickRemoved(nickname);
+
+  QModelIndex mi = nicknameIndex(nickname);
+
+  if (mi.isValid()) {
+    setData(mi, false, RoomFilterRole);
+    setData(mi, false, RoomAdmin);
+    setData(mi, false, Ready);
+    setData(mi, false, InGame);
+    updateIcon(mi);
+  }
+}
+
+void PlayersListModel::setFlag(const QString &nickname, StateFlag flagType,
+                               bool isSet) {
+  if (flagType == Friend) {
+    if (isSet)
+      m_friendsSet.insert(nickname.toLower());
+    else
+      m_friendsSet.remove(nickname.toLower());
+
+    // FIXME: set proper file name
+    // saveSet(m_friendsSet, "friends");
+  } else if (flagType == Ignore) {
+    if (isSet)
+      m_ignoredSet.insert(nickname.toLower());
+    else
+      m_ignoredSet.remove(nickname.toLower());
+
+    // FIXME: set proper file name
+    // saveSet(m_ignoredSet, "ignore");
+  }
+
+  QModelIndex mi = nicknameIndex(nickname);
+
+  if (mi.isValid()) {
+    setData(mi, isSet, flagType);
+
+    if (flagType == Friend || flagType == ServerAdmin || flagType == Ignore ||
+        flagType == RoomAdmin)
+      updateSortData(mi);
+
+    updateIcon(mi);
+  }
+}
+
+bool PlayersListModel::isFlagSet(const QString &nickname, StateFlag flagType) {
+  QModelIndex mi = nicknameIndex(nickname);
+
+  if (mi.isValid())
+    return mi.data(flagType).toBool();
+  else if (flagType == Friend)
+    return isFriend(nickname);
+  else if (flagType == Ignore)
+    return isIgnored(nickname);
+  else
+    return false;
+}
+
+void PlayersListModel::resetRoomFlags() {
+  for (int i = rowCount() - 1; i >= 0; --i) {
+    QModelIndex mi = index(i);
+
+    if (mi.data(RoomFilterRole).toBool()) {
+      setData(mi, false, RoomFilterRole);
+      setData(mi, false, RoomAdmin);
+      setData(mi, false, Ready);
+      setData(mi, false, InGame);
+
+      updateSortData(mi);
+      updateIcon(mi);
+    }
+  }
+}
+
+void PlayersListModel::updateIcon(const QModelIndex &index) {
+  quint32 iconNum = 0;
+
+  QList<bool> flags;
+  flags << index.data(Ready).toBool() << index.data(ServerAdmin).toBool()
+        << index.data(RoomAdmin).toBool() << index.data(Registered).toBool()
+        << index.data(Friend).toBool() << index.data(Ignore).toBool()
+        << index.data(InGame).toBool() << index.data(RoomFilterRole).toBool()
+        << index.data(InRoom).toBool() << index.data(Contributor).toBool();
+
+  for (int i = flags.size() - 1; i >= 0; --i)
+    if (flags[i]) iconNum |= 1 << i;
+
+  if (m_icons().contains(iconNum)) {
+    setData(index, m_icons().value(iconNum), Qt::DecorationRole);
+  } else {
+    QPixmap result(24, 16);
+    result.fill(Qt::transparent);
+
+    QPainter painter(&result);
+
+    if (index.data(RoomFilterRole).toBool()) {
+      if (index.data(InGame).toBool()) {
+        painter.drawPixmap(0, 0, 16, 16, QPixmap(":/res/chat/ingame.png"));
+      } else {
+        if (index.data(Ready).toBool())
+          painter.drawPixmap(0, 0, 16, 16, QPixmap(":/res/chat/lamp.png"));
+        else
+          painter.drawPixmap(0, 0, 16, 16, QPixmap(":/res/chat/lamp_off.png"));
+      }
+    } else {  // we're in lobby
+      if (!index.data(InRoom).toBool())
+        painter.drawPixmap(0, 0, 16, 16, QPixmap(":/res/Flake.png"));
+    }
+
+    QString mainIconName(":/res/chat/");
+
+    if (index.data(ServerAdmin).toBool())
+      mainIconName += "serveradmin";
+    else {
+      if (index.data(RoomAdmin).toBool())
+        mainIconName += "roomadmin";
+      else
+        mainIconName += "hedgehog";
+
+      if (index.data(Contributor).toBool()) mainIconName += "contributor";
+    }
+
+    if (!index.data(Registered).toBool()) mainIconName += "_gray";
+
+    painter.drawPixmap(8, 0, 16, 16, QPixmap(mainIconName + ".png"));
+
+    if (index.data(Ignore).toBool())
+      painter.drawPixmap(8, 0, 16, 16, QPixmap(":/res/chat/ignore.png"));
+    else if (index.data(Friend).toBool())
+      painter.drawPixmap(8, 0, 16, 16, QPixmap(":/res/chat/friend.png"));
+
+    painter.end();
+
+    QIcon icon(result);
+
+    setData(index, icon, Qt::DecorationRole);
+    m_icons().insert(iconNum, icon);
+  }
+
+  if (index.data(Ignore).toBool())
+    setData(index, QColor(Qt::gray), Qt::ForegroundRole);
+  else if (index.data(Friend).toBool())
+    setData(index, QColor(Qt::green), Qt::ForegroundRole);
+  else
+    setData(index, QBrush(QColor(0xff, 0xcc, 0x00)), Qt::ForegroundRole);
+}
+
+QHash<quint32, QIcon> &PlayersListModel::m_icons() {
+  static QHash<quint32, QIcon> iconsCache;
+
+  return iconsCache;
+}
+
+void PlayersListModel::updateSortData(const QModelIndex &index) {
+  QString result =
+      QString("%1%2%3%4%5%6")
+          // room admins go first, then server admins, then friends
+          .arg(1 - index.data(RoomAdmin).toInt())
+          .arg(1 - index.data(ServerAdmin).toInt())
+          .arg(1 - index.data(Friend).toInt())
+          // ignored at bottom
+          .arg(index.data(Ignore).toInt())
+          // keep nicknames starting from non-letter character at bottom within
+          // group assume there are no empty nicks in list
+          .arg(index.data(Qt::DisplayRole).toString().at(0).isLetter() ? 0 : 1)
+          // sort ignoring case
+          .arg(index.data(Qt::DisplayRole).toString().toLower());
+
+  setData(index, result, SortRole);
+}
+
+void PlayersListModel::setNickname(const QString &nickname) {
+  m_nickname = nickname;
+
+  // FIXME: set proper file names
+  // loadSet(m_friendsSet, "friends");
+  // loadSet(m_ignoredSet, "ignore");
+
+  for (int i = rowCount() - 1; i >= 0; --i) checkFriendIgnore(index(i));
+}
+
+bool PlayersListModel::isFriend(const QString &nickname) {
+  return m_friendsSet.contains(nickname.toLower());
+}
+
+bool PlayersListModel::isIgnored(const QString &nickname) {
+  return m_ignoredSet.contains(nickname.toLower());
+}
+
+void PlayersListModel::checkFriendIgnore(const QModelIndex &mi) {
+  setData(mi, isFriend(mi.data().toString()), Friend);
+  setData(mi, isIgnored(mi.data().toString()), Ignore);
+
+  updateIcon(mi);
+  updateSortData(mi);
+}
+
+void PlayersListModel::loadSet(QSet<QString> &set, const QString &fileName) {
+  set.clear();
+
+  QFile txt(fileName);
+  if (!txt.open(QIODevice::ReadOnly)) return;
+
+  QTextStream stream(&txt);
+  stream.setCodec("UTF-8");
+
+  while (!stream.atEnd()) {
+    QString str = stream.readLine();
+    if (str.startsWith(";") || str.isEmpty()) continue;
+
+    set.insert(str.trimmed());
+  }
+
+  txt.close();
+}
+
+void PlayersListModel::saveSet(const QSet<QString> &set,
+                               const QString &fileName) {
+  qDebug("saving set");
+
+  QFile txt(fileName);
+
+  // list empty? => rather have no file for the list than an empty one
+  if (set.isEmpty()) {
+    if (txt.exists()) {
+      // try to remove file, if successful we're done here.
+      if (txt.remove()) return;
+    } else
+      // there is no file
+      return;
+  }
+
+  if (!txt.open(QIODevice::WriteOnly | QIODevice::Truncate)) return;
+
+  QTextStream stream(&txt);
+  stream.setCodec("UTF-8");
+
+  stream << "; this list is used by Hedgewars - do not edit it unless you know "
+            "what you're doing!"
+         << endl;
+
+  foreach (const QString &nick, set.values())
+    stream << nick << endl;
+
+  txt.close();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/qmlfrontend/players_model.h	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,83 @@
+#ifndef PLAYERSLISTMODEL_H
+#define PLAYERSLISTMODEL_H
+
+#include <QAbstractListModel>
+#include <QFont>
+#include <QHash>
+#include <QIcon>
+#include <QModelIndex>
+#include <QSet>
+
+class PlayersListModel : public QAbstractListModel {
+  Q_OBJECT
+
+ public:
+  enum StateFlag {
+    Ready = Qt::UserRole,
+    ServerAdmin = Qt::UserRole + 1,
+    RoomAdmin = Qt::UserRole + 2,
+    Registered = Qt::UserRole + 3,
+    Friend = Qt::UserRole + 4,
+    Ignore = Qt::UserRole + 5,
+    InGame = Qt::UserRole + 6,
+    InRoom = Qt::UserRole + 7,
+    Contributor = Qt::UserRole + 8
+    // if you add a role that will affect the player icon,
+    // then also add it to the flags Qlist in updateIcon()!
+  };
+
+  enum SpecialRoles {
+    SortRole = Qt::UserRole + 100,
+    RoomFilterRole = Qt::UserRole + 101
+  };
+
+  explicit PlayersListModel(QObject *parent = 0);
+
+  int rowCount(const QModelIndex &parent = QModelIndex()) const override;
+
+  QVariant data(const QModelIndex &index, int role) const override;
+  bool setData(const QModelIndex &index, const QVariant &value,
+               int role = Qt::DisplayRole) override;
+
+  void setFlag(const QString &nickname, StateFlag flagType, bool isSet);
+  bool isFlagSet(const QString &nickname, StateFlag flagType);
+
+  bool insertRows(int row, int count,
+                  const QModelIndex &parent = QModelIndex()) override;
+  bool removeRows(int row, int count,
+                  const QModelIndex &parent = QModelIndex()) override;
+
+  QModelIndex nicknameIndex(const QString &nickname);
+
+ public slots:
+  void addPlayer(const QString &nickname, bool notify);
+  void removePlayer(const QString &nickname, const QString &msg = QString());
+  void playerJoinedRoom(const QString &nickname, bool notify);
+  void playerLeftRoom(const QString &nickname);
+  void resetRoomFlags();
+  void setNickname(const QString &nickname);
+
+ signals:
+  void nickAdded(const QString &nick, bool notifyNick);
+  void nickRemoved(const QString &nick);
+  void nickAddedLobby(const QString &nick, bool notifyNick);
+  void nickRemovedLobby(const QString &nick, const QString &message);
+
+ private:
+  QHash<quint32, QIcon> &m_icons();
+  using DataEntry = QHash<int, QVariant>;
+  QList<DataEntry> m_data;
+  QSet<QString> m_friendsSet, m_ignoredSet;
+  QString m_nickname;
+  QFont m_fontInRoom;
+
+  void updateIcon(const QModelIndex &index);
+  void updateSortData(const QModelIndex &index);
+  void loadSet(QSet<QString> &set, const QString &fileName);
+  void saveSet(const QSet<QString> &set, const QString &fileName);
+  void checkFriendIgnore(const QModelIndex &mi);
+  bool isFriend(const QString &nickname);
+  bool isIgnored(const QString &nickname);
+};
+
+#endif  // PLAYERSLISTMODEL_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/qmlfrontend/preview_acceptor.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,15 @@
+#include "preview_acceptor.h"
+
+#include <QImage>
+#include <QQmlEngine>
+
+#include "preview_image_provider.h"
+
+PreviewAcceptor::PreviewAcceptor(QQmlEngine *engine, QObject *parent)
+    : QObject(parent), m_previewProvider(new PreviewImageProvider()) {
+  engine->addImageProvider(QLatin1String("preview"), m_previewProvider);
+}
+
+void PreviewAcceptor::setImage(const QImage &preview) {
+  m_previewProvider->setImage(preview);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/qmlfrontend/preview_acceptor.h	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,21 @@
+#ifndef PREVIEW_ACCEPTOR_H
+#define PREVIEW_ACCEPTOR_H
+
+#include <QObject>
+
+class QQmlEngine;
+class PreviewImageProvider;
+
+class PreviewAcceptor : public QObject {
+  Q_OBJECT
+ public:
+  explicit PreviewAcceptor(QQmlEngine *engine, QObject *parent = nullptr);
+
+ public slots:
+  void setImage(const QImage &preview);
+
+ private:
+  PreviewImageProvider *m_previewProvider;
+};
+
+#endif  // PREVIEW_ACCEPTOR_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/qmlfrontend/rooms_model.cpp	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,231 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2004-2015 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program 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; version 2 of the License
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+/**
+ * @file
+ * @brief RoomsListModel class implementation
+ */
+
+#include <QBrush>
+#include <QColor>
+#include <QIcon>
+
+#include "rooms_model.h"
+
+RoomsListModel::RoomsListModel(QObject *parent)
+    : QAbstractTableModel(parent), c_nColumns(9) {
+  m_headerData = QStringList();
+  m_headerData << tr("In progress");
+  m_headerData << tr("Room Name");
+  //: Caption of the column for the number of connected clients in the list of
+  // rooms
+  m_headerData << tr("C");
+  //: Caption of the column for the number of teams in the list of rooms
+  m_headerData << tr("T");
+  m_headerData << tr("Owner");
+  m_headerData << tr("Map");
+  m_headerData << tr("Script");
+  m_headerData << tr("Rules");
+  m_headerData << tr("Weapons");
+
+  // m_staticMapModel = DataManager::instance().staticMapModel();
+  // m_missionMapModel = DataManager::instance().missionMapModel();
+}
+
+QVariant RoomsListModel::headerData(int section, Qt::Orientation orientation,
+                                    int role) const {
+  if (orientation == Qt::Vertical || role != Qt::DisplayRole)
+    return QVariant();
+  else
+    return QVariant(m_headerData.at(section));
+}
+
+int RoomsListModel::rowCount(const QModelIndex &parent) const {
+  if (parent.isValid())
+    return 0;
+  else
+    return m_data.size();
+}
+
+int RoomsListModel::columnCount(const QModelIndex &parent) const {
+  if (parent.isValid())
+    return 0;
+  else
+    return c_nColumns;
+}
+
+QVariant RoomsListModel::data(const QModelIndex &index, int role) const {
+  int column = index.column();
+  int row = index.row();
+
+  // invalid index
+  if (!index.isValid()) return QVariant();
+
+  // invalid row
+  if ((row < 0) || (row >= m_data.size())) return QVariant();
+
+  // invalid column
+  if ((column < 0) || (column >= c_nColumns)) return QVariant();
+
+  // not a role we have data for
+  if (role != Qt::DisplayRole)
+    // only custom-align counters
+    if ((role != Qt::TextAlignmentRole) ||
+        ((column != PlayerCountColumn) && (column != TeamCountColumn)))
+      // only decorate name column
+      if ((role != Qt::DecorationRole) || (column != NameColumn))
+        // only dye map column
+        if ((role != Qt::ForegroundRole) || (column != MapColumn))
+          return QVariant();
+
+  // decorate room name based on room state
+  if (role == Qt::DecorationRole) {
+    const QIcon roomBusyIcon(":/res/iconDamage.png");
+    const QIcon roomBusyIconGreen(":/res/iconDamageLockG.png");
+    const QIcon roomBusyIconRed(":/res/iconDamageLockR.png");
+    const QIcon roomWaitingIcon(":/res/iconTime.png");
+    const QIcon roomWaitingIconGreen(":/res/iconTimeLockG.png");
+    const QIcon roomWaitingIconRed(":/res/iconTimeLockR.png");
+
+    QString flags = m_data.at(row).at(StateColumn);
+
+    if (flags.contains("g")) {
+      if (flags.contains("j"))
+        return QVariant(roomBusyIconRed);
+      else if (flags.contains("p"))
+        return QVariant(roomBusyIconGreen);
+      else
+        return QVariant(roomBusyIcon);
+    } else {
+      if (flags.contains("j"))
+        return QVariant(roomWaitingIconRed);
+      else if (flags.contains("p"))
+        return QVariant(roomWaitingIconGreen);
+      else
+        return QVariant(roomWaitingIcon);
+    }
+  }
+
+  QString content = m_data.at(row).at(column);
+
+  if (role == Qt::DisplayRole) {
+    // display room names
+    if (column == 5) {
+      // special names
+      if (content[0] == '+') {
+        if (content == "+rnd+") return tr("Random Map");
+        if (content == "+maze+") return tr("Random Maze");
+        if (content == "+perlin+") return tr("Random Perlin");
+        if (content == "+drawn+") return tr("Hand-drawn");
+        if (content == "+forts+") return tr("Forts");
+      }
+
+      // prefix ? if map not available
+      /*if (!m_staticMapModel->mapExists(content) &&
+          !m_missionMapModel->mapExists(content))
+        return QString("? %1").arg(content);*/
+    }
+
+    return content;
+  }
+
+  // dye map names red if map not available
+  /*if (role == Qt::ForegroundRole) {
+    if (content == "+rnd+" || content == "+maze+" || content == "+perlin+" ||
+        content == "+drawn+" || content == "+forts+" ||
+        m_staticMapModel->mapExists(content) ||
+        m_missionMapModel->mapExists(content))
+      return QVariant();
+    else
+      return QBrush(QColor("darkred"));
+  }*/
+
+  if (role == Qt::TextAlignmentRole) {
+    return (int)(Qt::AlignHCenter | Qt::AlignVCenter);
+  }
+
+  Q_ASSERT(false);
+  return QVariant();
+}
+
+void RoomsListModel::setRoomsList(const QStringList &rooms) {
+  beginResetModel();
+
+  m_data.clear();
+
+  int nRooms = rooms.size();
+
+  for (int i = 0; i < nRooms; i += c_nColumns) {
+    QStringList l;
+    l.reserve(c_nColumns);
+
+    for (int t = 0; t < c_nColumns; t++) {
+      l.append(rooms[i + t]);
+    }
+
+    m_data.append(l);
+  }
+
+  endResetModel();
+}
+
+void RoomsListModel::addRoom(const QStringList &info) {
+  beginInsertRows(QModelIndex(), 0, 0);
+
+  m_data.prepend(info);
+
+  endInsertRows();
+}
+
+int RoomsListModel::rowOfRoom(const QString &name) {
+  int size = m_data.size();
+
+  if (size < 1) return -1;
+
+  int i = 0;
+
+  // search for record with matching room name
+  while (m_data[i].at(NameColumn) != name) {
+    i++;
+    if (i >= size) return -1;
+  }
+
+  return i;
+}
+
+void RoomsListModel::removeRoom(const QString &name) {
+  int i = rowOfRoom(name);
+
+  if (i < 0) return;
+
+  beginRemoveRows(QModelIndex(), i, i);
+
+  m_data.removeAt(i);
+
+  endRemoveRows();
+}
+
+void RoomsListModel::updateRoom(const QString &name, const QStringList &info) {
+  int i = rowOfRoom(name);
+
+  if (i < 0) return;
+
+  m_data[i] = info;
+
+  emit dataChanged(index(i, 0), index(i, columnCount(QModelIndex()) - 1));
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/qmlfrontend/rooms_model.h	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,69 @@
+/*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2004-2015 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * This program 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; version 2 of the License
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+/**
+ * @file
+ * @brief RoomsListModel class definition
+ */
+
+#ifndef HEDGEWARS_ROOMSLISTMODEL_H
+#define HEDGEWARS_ROOMSLISTMODEL_H
+
+#include <QAbstractTableModel>
+#include <QStringList>
+
+class RoomsListModel : public QAbstractTableModel {
+  Q_OBJECT
+ public:
+  // if you add a column here, also incr. c_nColumns in constructor
+  // also adjust header in constructor to changes
+  enum Column {
+    StateColumn,
+    NameColumn,
+    PlayerCountColumn,
+    TeamCountColumn,
+    OwnerColumn,
+    MapColumn,
+    SchemeColumn,
+    WeaponsColumn
+  };
+
+  explicit RoomsListModel(QObject *parent = 0);
+
+  QVariant headerData(int section, Qt::Orientation orientation,
+                      int role) const override;
+  int rowCount(const QModelIndex &parent) const override;
+  int columnCount(const QModelIndex &parent) const override;
+  QVariant data(const QModelIndex &index, int role) const override;
+
+ public slots:
+  void setRoomsList(const QStringList &rooms);
+  void addRoom(const QStringList &info);
+  void removeRoom(const QString &name);
+  void updateRoom(const QString &name, const QStringList &info);
+  int rowOfRoom(const QString &name);
+
+ private:
+  const int c_nColumns;
+  QList<QStringList> m_data;
+  QStringList m_headerData;
+  // MapModel * m_staticMapModel;
+  // MapModel * m_missionMapModel;
+};
+
+#endif  // HEDGEWARS_ROOMSLISTMODEL_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/chat_sanitizer/Cargo.toml	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,9 @@
+[package]
+name = "chat_sanitizer"
+version = "0.1.0"
+authors = ["Andrey Korotaev <a.korotaev@hedgewars.org>"]
+edition = "2018"
+
+[dependencies]
+unicode_skeleton = "0.1"
+itertools = "0.8.0"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/chat_sanitizer/src/bad_words.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,58 @@
+use crate::{normalized_message, MessageChecker, Severity};
+
+use std::marker::PhantomData;
+
+struct BadWordsChecker<T> {
+    blacklist: Vec<String>,
+    whitelist: Vec<String>,
+    player_id_type: PhantomData<T>,
+}
+
+impl<T> BadWordsChecker<T> {
+    pub fn new(blacklist: &[&str], whitelist: &[&str]) -> Self {
+        Self {
+            blacklist: blacklist.iter().map(|s| normalized_message(*s)).collect(),
+            whitelist: whitelist.iter().map(|s| normalized_message(*s)).collect(),
+            player_id_type: PhantomData,
+        }
+    }
+}
+
+impl<T> MessageChecker<T> for BadWordsChecker<T> {
+    fn check(&self, _player_id: T, message: &str) -> Severity {
+        let msg = normalized_message(message);
+
+        // silly implementation, allows bad messages with a single good word
+        for bad_word in &self.blacklist {
+            if msg.contains(bad_word) {
+                if !self
+                    .whitelist
+                    .iter()
+                    .any(|good_word| msg.contains(good_word))
+                {
+                    return Severity::Warn;
+                }
+            }
+        }
+
+        Severity::Pass
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    #[test]
+    fn it_works() {
+        let checker = BadWordsChecker::new(&["fsck", "poop"], &["fsck -y"]);
+        assert_eq!(checker.check(0, "group hug"), Severity::Pass);
+        assert_eq!(checker.check(0, "fpoopf"), Severity::Warn);
+        assert_eq!(checker.check(0, "PooP"), Severity::Warn);
+
+        // this one fails
+        //assert_eq!(checker.check(0, "poop 'fsck -y' poop"), Severity::Warn);
+
+        // ideally this one shouldn't fail, need a better confusables check
+        // assert_eq!(checker.check(0, "P00P"), Severity::Warn);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/chat_sanitizer/src/caps_abuse.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,9 @@
+use crate::{MessageChecker, Severity};
+
+struct CapsAbuseChecker {}
+
+impl<T> MessageChecker<T> for CapsAbuseChecker {
+    fn check(&self, player_id: T, message: &str) -> Severity {
+        Severity::Pass
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/chat_sanitizer/src/flood.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,9 @@
+use crate::{MessageChecker, Severity};
+
+struct FloodChecker {}
+
+impl<T> MessageChecker<T> for FloodChecker {
+    fn check(&self, player_id: T, message: &str) -> Severity {
+        Severity::Pass
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/chat_sanitizer/src/letter_repeat.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,45 @@
+use crate::{MessageChecker, Severity};
+
+use itertools::Itertools;
+use std::marker::PhantomData;
+
+struct LetterRepeatChecker<T> {
+    threshold: usize,
+    player_id_type: PhantomData<T>,
+}
+
+impl<T> LetterRepeatChecker<T> {
+    pub fn new(threshold: usize) -> Self {
+        Self {
+            threshold,
+            player_id_type: PhantomData,
+        }
+    }
+}
+
+impl<T> MessageChecker<T> for LetterRepeatChecker<T> {
+    fn check(&self, _player_id: T, message: &str) -> Severity {
+        for (_key, group) in &message.chars().into_iter().group_by(|c| *c) {
+            if group.count() >= self.threshold {
+                return Severity::Warn;
+            }
+        }
+
+        Severity::Pass
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    #[test]
+    fn it_works() {
+        let checker = LetterRepeatChecker::new(3);
+        assert_eq!(checker.check(0, "Hello world!"), Severity::Pass);
+        assert_eq!(checker.check(0, "ooops"), Severity::Warn);
+        assert_eq!(
+            checker.check(0, "жираф - длинношеее животное"),
+            Severity::Warn
+        );
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/chat_sanitizer/src/lib.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,26 @@
+pub mod bad_words;
+pub mod letter_repeat;
+
+use unicode_skeleton::UnicodeSkeleton;
+
+#[derive(PartialEq, Debug)]
+enum Severity {
+    Pass,
+    Warn,
+    Silence,
+    Ban,
+}
+
+trait MessageChecker<T> {
+    fn check(&self, player_id: T, message: &str) -> Severity;
+    fn fix(&self, player_id: T, message: &str) -> Option<String> {
+        None
+    }
+}
+
+fn normalized_message(s: &str) -> String {
+    s.chars()
+        .flat_map(|c| c.to_lowercase())
+        .skeleton_chars()
+        .collect::<String>()
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/chat_sanitizer/src/part_repeat.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,9 @@
+use crate::{MessageChecker, Severity};
+
+struct PartRepeatChecker {}
+
+impl<T> MessageChecker<T> for PartRepeatChecker {
+    fn check(&self, player_id: T, message: &str) -> Severity {
+        Severity::Pass
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/chat_sanitizer/src/url.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,9 @@
+use crate::{MessageChecker, Severity};
+
+struct URLChecker {}
+
+impl<T> MessageChecker<T> for URLChecker {
+    fn check(&self, player_id: T, message: &str) -> Severity {
+        Severity::Pass
+    }
+}
--- a/rust/fpnum/src/lib.rs	Mon Jan 14 15:11:15 2019 -0500
+++ b/rust/fpnum/src/lib.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -1,12 +1,20 @@
-use std::{
-    cmp,
-    ops,
-    ops::Shl
-};
+use std::{cmp, ops, ops::Shl};
+
+const POSITIVE_MASK: u64 = 0x0000_0000_0000_0000;
+const NEGATIVE_MASK: u64 = 0xFFFF_FFFF_FFFF_FFFF;
+
+#[inline]
+fn bool_mask(is_negative: bool) -> u64 {
+    if is_negative {
+        NEGATIVE_MASK
+    } else {
+        POSITIVE_MASK
+    }
+}
 
 #[derive(Clone, Debug, Copy)]
 pub struct FPNum {
-    is_negative: bool,
+    sign_mask: u64,
     value: u64,
 }
 
@@ -18,106 +26,92 @@
 
     #[inline]
     pub fn signum(&self) -> i8 {
-        if self.is_negative {
-            -1
-        } else {
-            1
-        }
+        (1u64 ^ self.sign_mask).wrapping_sub(self.sign_mask) as i8
     }
 
     #[inline]
-    pub fn is_negative(&self) -> bool {
-        self.is_negative
+    pub const fn is_negative(&self) -> bool {
+        self.sign_mask != POSITIVE_MASK
     }
 
     #[inline]
-    pub fn is_positive(&self) -> bool {
-        !self.is_negative
+    pub const fn is_positive(&self) -> bool {
+        self.sign_mask == POSITIVE_MASK
     }
 
     #[inline]
-    pub fn is_zero(&self) -> bool {
+    pub const fn is_zero(&self) -> bool {
         self.value == 0
     }
 
     #[inline]
-    pub fn abs(&self) -> Self {
+    pub const fn abs(&self) -> Self {
         Self {
-            is_negative: false,
+            sign_mask: POSITIVE_MASK,
             value: self.value,
         }
     }
 
     #[inline]
     pub fn round(&self) -> i32 {
-        if self.is_negative {
-            -((self.value >> 32) as i32)
-        } else {
-            (self.value >> 32) as i32
-        }
+        ((self.value >> 32) as i32 ^ self.sign_mask as i32).wrapping_sub(self.sign_mask as i32)
     }
 
     #[inline]
-    pub fn abs_round(&self) -> u32 {
+    pub const fn abs_round(&self) -> u32 {
         (self.value >> 32) as u32
     }
 
     #[inline]
     pub fn sqr(&self) -> Self {
         Self {
-            is_negative: false,
+            sign_mask: 0,
             value: ((self.value as u128).pow(2) >> 32) as u64,
         }
     }
 
+    #[inline]
     pub fn sqrt(&self) -> Self {
-        debug_assert!(!self.is_negative);
-
-        let mut t: u64 = 0x4000000000000000;
-        let mut r: u64 = 0;
-        let mut q = self.value;
-
-        for _ in 0..32 {
-            let s = r + t;
-            r >>= 1;
-
-            if s <= q {
-                q -= s;
-                r += t;
-            }
-            t >>= 2;
-        }
+        debug_assert!(self.is_positive());
 
         Self {
-            is_negative: false,
-            value: r << 16,
+            sign_mask: POSITIVE_MASK,
+            value: integral_sqrt(self.value) << 16,
         }
     }
 
     #[inline]
     pub fn with_sign(&self, is_negative: bool) -> FPNum {
         FPNum {
-            is_negative,
+            sign_mask: bool_mask(is_negative),
             ..*self
         }
     }
 
     #[inline]
-    pub fn with_sign_as(self, other: FPNum) -> FPNum {
-        self.with_sign(other.is_negative)
+    pub const fn with_sign_as(self, other: FPNum) -> FPNum {
+        FPNum {
+            sign_mask: other.sign_mask,
+            ..self
+        }
     }
 
     #[inline]
-    pub fn point(self) -> FPPoint {
+    pub const fn point(self) -> FPPoint {
         FPPoint::new(self, self)
     }
+
+    #[inline]
+    const fn temp_i128(self) -> i128 {
+        ((self.value ^ self.sign_mask) as i128).wrapping_sub(self.sign_mask as i128)
+    }
 }
 
 impl From<i32> for FPNum {
     #[inline]
     fn from(n: i32) -> Self {
         FPNum {
-            is_negative: n < 0,
+            sign_mask: bool_mask(n < 0),
             value: (n.abs() as u64) << 32,
         }
     }
@@ -127,7 +121,7 @@
     #[inline]
     fn from(n: u32) -> Self {
         Self {
-            is_negative: false,
+            sign_mask: POSITIVE_MASK,
             value: (n as u64) << 32,
         }
     }
@@ -136,10 +130,10 @@
 impl From<FPNum> for f64 {
     #[inline]
     fn from(n: FPNum) -> Self {
-        if n.is_negative {
-            n.value as f64 / (-0x10000000 as f64)
+        if n.is_negative() {
+            n.value as f64 / -0x1_0000_0000i64 as f64
         } else {
-            n.value as f64 / 0x10000000 as f64
+            n.value as f64 / 0x1_0000_0000i64 as f64
         }
     }
 }
@@ -147,7 +141,7 @@
 impl PartialEq for FPNum {
     #[inline]
     fn eq(&self, other: &Self) -> bool {
-        self.value == other.value && (self.is_negative == other.is_negative || self.value == 0)
+        self.value == other.value && (self.sign_mask == other.sign_mask || self.value == 0)
     }
 }
 
@@ -163,15 +157,7 @@
 impl Ord for FPNum {
     #[inline]
     fn cmp(&self, rhs: &Self) -> cmp::Ordering {
-        #[inline]
-        fn extend(n: &FPNum) -> i128 {
-            if n.is_negative {
-                -(n.value as i128)
-            } else {
-                n.value as i128
-            }
-        }
-        extend(self).cmp(&(extend(rhs)))
+        self.temp_i128().cmp(&(rhs.temp_i128()))
     }
 }
 
@@ -180,21 +166,11 @@
 
     #[inline]
     fn add(self, rhs: Self) -> Self {
-        if self.is_negative == rhs.is_negative {
-            Self {
-                is_negative: self.is_negative,
-                value: self.value + rhs.value,
-            }
-        } else if self.value > rhs.value {
-            Self {
-                is_negative: self.is_negative,
-                value: self.value - rhs.value,
-            }
-        } else {
-            Self {
-                is_negative: rhs.is_negative,
-                value: rhs.value - self.value,
-            }
+        let tmp = self.temp_i128() + rhs.temp_i128();
+        let mask = bool_mask(tmp < 0);
+        Self {
+            sign_mask: mask,
+            value: ((tmp as u64) ^ mask).wrapping_sub(mask),
         }
     }
 }
@@ -203,25 +179,9 @@
     type Output = Self;
 
     #[inline]
-    fn sub(self, rhs: Self) -> Self {
-        if self.is_negative == rhs.is_negative {
-            if self.value > rhs.value {
-                Self {
-                    is_negative: self.is_negative,
-                    value: self.value - rhs.value,
-                }
-            } else {
-                Self {
-                    is_negative: !rhs.is_negative,
-                    value: rhs.value - self.value,
-                }
-            }
-        } else {
-            Self {
-                is_negative: self.is_negative,
-                value: self.value + rhs.value,
-            }
-        }
+    fn sub(self, mut rhs: Self) -> Self {
+        rhs.sign_mask = !rhs.sign_mask;
+        self + rhs
     }
 }
 
@@ -231,7 +191,7 @@
     #[inline]
     fn neg(self) -> Self {
         Self {
-            is_negative: !self.is_negative,
+            sign_mask: !self.sign_mask,
             value: self.value,
         }
     }
@@ -243,7 +203,7 @@
     #[inline]
     fn mul(self, rhs: Self) -> Self {
         Self {
-            is_negative: self.is_negative ^ rhs.is_negative,
+            sign_mask: self.sign_mask ^ rhs.sign_mask,
             value: ((self.value as u128 * rhs.value as u128) >> 32) as u64,
         }
     }
@@ -255,7 +215,7 @@
     #[inline]
     fn mul(self, rhs: i32) -> Self {
         Self {
-            is_negative: self.is_negative ^ (rhs < 0),
+            sign_mask: self.sign_mask ^ bool_mask(rhs < 0),
             value: self.value * rhs.abs() as u64,
         }
     }
@@ -267,7 +227,7 @@
     #[inline]
     fn div(self, rhs: Self) -> Self {
         Self {
-            is_negative: self.is_negative ^ rhs.is_negative,
+            sign_mask: self.sign_mask ^ rhs.sign_mask,
             value: (((self.value as u128) << 32) / rhs.value as u128) as u64,
         }
     }
@@ -279,7 +239,7 @@
     #[inline]
     fn div(self, rhs: i32) -> Self {
         Self {
-            is_negative: self.is_negative ^ (rhs < 0),
+            sign_mask: self.sign_mask ^ bool_mask(rhs < 0),
             value: self.value / rhs.abs() as u64,
         }
     }
@@ -291,7 +251,7 @@
     #[inline]
     fn div(self, rhs: u32) -> Self {
         Self {
-            is_negative: self.is_negative,
+            sign_mask: self.sign_mask,
             value: self.value / rhs as u64,
         }
     }
@@ -299,16 +259,10 @@
 
 #[macro_export]
 macro_rules! fp {
-    (-$n: tt / $d: tt) => {
-        FPNum::new(-$n, $d)
-    };
-    ($n: tt / $d: tt) => {
+    ($n: literal / $d: tt) => {
         FPNum::new($n, $d)
     };
-    (-$n: tt) => {
-        FPNum::from(-$n)
-    };
-    ($n: tt) => {
+    ($n: literal) => {
         FPNum::from($n)
     };
 }
@@ -317,18 +271,18 @@
 
 #[derive(Clone, Copy, Debug)]
 pub struct FPPoint {
-    x_is_negative: bool,
-    y_is_negative: bool,
+    x_sign_mask: u32,
+    y_sign_mask: u32,
     x_value: u64,
     y_value: u64,
 }
 
 impl FPPoint {
     #[inline]
-    pub fn new(x: FPNum, y: FPNum) -> Self {
+    pub const fn new(x: FPNum, y: FPNum) -> Self {
         Self {
-            x_is_negative: x.is_negative,
-            y_is_negative: y.is_negative,
+            x_sign_mask: x.sign_mask as u32,
+            y_sign_mask: y.sign_mask as u32,
             x_value: x.value,
             y_value: y.value,
         }
@@ -350,17 +304,17 @@
     }
 
     #[inline]
-    pub fn x(&self) -> FPNum {
+    pub const fn x(&self) -> FPNum {
         FPNum {
-            is_negative: self.x_is_negative,
+            sign_mask: self.x_sign_mask as i32 as u64,
             value: self.x_value,
         }
     }
 
     #[inline]
-    pub fn y(&self) -> FPNum {
+    pub const fn y(&self) -> FPNum {
         FPNum {
-            is_negative: self.y_is_negative,
+            sign_mask: self.y_sign_mask as i32 as u64,
             value: self.y_value,
         }
     }
@@ -386,25 +340,11 @@
         if r < LINEARIZE_TRESHOLD {
             FPNum::from(r as u32)
         } else {
-            let mut sqr: u128 = (self.x_value as u128).pow(2) + (self.y_value as u128).pow(2);
-
-            let mut t: u128 = 0x40000000_00000000_00000000_00000000;
-            let mut r: u128 = 0;
-
-            for _ in 0..64 {
-                let s = r + t;
-                r >>= 1;
-
-                if s <= sqr {
-                    sqr -= s;
-                    r += t;
-                }
-                t >>= 2;
-            }
+            let sqr: u128 = (self.x_value as u128).pow(2) + (self.y_value as u128).pow(2);
 
             FPNum {
-                is_negative: false,
-                value: r as u64,
+                sign_mask: POSITIVE_MASK,
+                value: integral_sqrt_ext(sqr) as u64,
             }
         }
     }
@@ -532,29 +472,49 @@
 bin_assign_op_impl!(FPPoint, ops::MulAssign<FPNum>, mul_assign, *);
 bin_assign_op_impl!(FPPoint, ops::DivAssign<FPNum>, div_assign, /);
 
+pub fn integral_sqrt(value: u64) -> u64 {
+    let mut digits = (64u32 - 1).saturating_sub(value.leading_zeros()) & 0xFFFF_FFFE;
+    let mut result = if value == 0 { 0u64 } else { 1u64 };
+
+    while digits != 0 {
+        result <<= 1;
+        if (result + 1).pow(2) <= value >> (digits - 2) {
+            result += 1;
+        }
+        digits -= 2;
+    }
+
+    result
+}
+
+pub fn integral_sqrt_ext(mut value: u128) -> u128 {
+    let mut digit_sqr =
+        0x40000000_00000000_00000000_00000000u128.wrapping_shr(value.leading_zeros() & 0xFFFF_FFFE);
+    let mut result = 0u128;
+
+    while digit_sqr != 0 {
+        let approx = result + digit_sqr;
+        result >>= 1;
+
+        if approx <= value {
+            value -= approx;
+            result += digit_sqr;
+        }
+        digit_sqr >>= 2;
+    }
+    result
+}
+
+#[inline]
 pub fn distance<T>(x: T, y: T) -> FPNum
 where
     T: Into<i64> + std::fmt::Debug,
 {
-    let mut sqr: u128 = (x.into().pow(2) as u128).shl(64) + (y.into().pow(2) as u128).shl(64);
-
-    let mut t: u128 = 0x40000000_00000000_00000000_00000000;
-    let mut r: u128 = 0;
-
-    for _ in 0..64 {
-        let s = r + t;
-        r >>= 1;
-
-        if s <= sqr {
-            sqr -= s;
-            r += t;
-        }
-        t >>= 2;
-    }
+    let sqr: u128 = (x.into().pow(2) as u128).shl(64) + (y.into().pow(2) as u128).shl(64);
 
     FPNum {
-        is_negative: false,
-        value: r as u64,
+        sign_mask: POSITIVE_MASK,
+        value: integral_sqrt_ext(sqr) as u64,
     }
 }
 
@@ -579,6 +539,8 @@
 
     assert_eq!(n.round(), 7);
     assert_eq!((-n).round(), -7);
+
+    assert_eq!(f64::from(fp!(5/2)), 2.5f64);
 }
 
 #[test]
@@ -588,7 +550,7 @@
 
     assert!(z.is_zero());
     assert!(z.is_positive());
-    assert!((-z).is_negative);
+    assert!((-z).is_negative());
     assert_eq!(n - n, z);
     assert_eq!(-n + n, z);
     assert_eq!(n.with_sign_as(-n), -n);
@@ -605,6 +567,9 @@
     assert!(n2_25 > n1_5);
     assert!(-n2_25 < n1_5);
     assert!(-n2_25 < -n1_5);
+
+    assert_eq!(n1_5.signum(), 1);
+    assert_eq!((-n1_5).signum(), -1);
 }
 
 #[test]
@@ -615,6 +580,7 @@
 
     assert_eq!(n1_5 + n1_5, fp!(3));
     assert_eq!(-n1_5 - n1_5, fp!(-3));
+    assert_eq!(n1_5 - n1_5, fp!(0));
 
     assert_eq!(n1_5 * n1_5, n2_25);
     assert_eq!(-n1_5 * -n1_5, n2_25);
--- a/rust/hedgewars-checker/src/main.rs	Mon Jan 14 15:11:15 2019 -0500
+++ b/rust/hedgewars-checker/src/main.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -175,7 +175,7 @@
 fn get_protocol_number(executable: &str) -> std::io::Result<u32> {
     let output = Command::new(executable).arg("--protocol").output()?;
 
-    Ok(u32::from_str(&String::from_utf8(output.stdout).unwrap().as_str()).unwrap_or(55))
+    Ok(u32::from_str(&String::from_utf8(output.stdout).unwrap().trim()).unwrap_or(55))
 }
 
 fn main() {
--- a/rust/hedgewars-engine-messages/Cargo.toml	Mon Jan 14 15:11:15 2019 -0500
+++ b/rust/hedgewars-engine-messages/Cargo.toml	Fri Aug 16 10:59:50 2019 -0600
@@ -7,3 +7,4 @@
 [dependencies]
 nom = "4.1"
 byteorder = "1.2"
+queues = "1.1"
--- a/rust/hedgewars-engine-messages/src/lib.rs	Mon Jan 14 15:11:15 2019 -0500
+++ b/rust/hedgewars-engine-messages/src/lib.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -1,2 +1,3 @@
 pub mod messages;
 pub mod parser;
+pub mod queue;
--- a/rust/hedgewars-engine-messages/src/messages.rs	Mon Jan 14 15:11:15 2019 -0500
+++ b/rust/hedgewars-engine-messages/src/messages.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -28,7 +28,6 @@
     TeamControlLost(String),
     TimeWrap,
     Taunt(u8),
-    HogSay(String),
     Heartbeat,
 }
 
@@ -36,14 +35,15 @@
 pub enum UnsyncedEngineMessage {
     TeamControlGained(String),
     TeamControlLost(String),
+    HogSay(String),
+    ChatMessage(String),
+    TeamMessage(String),
 }
 
 #[derive(Debug, PartialEq, Clone)]
 pub enum UnorderedEngineMessage {
     Ping,
     Pong,
-    ChatMessage(String),
-    TeamMessage(String),
     Error(String),
     Warning(String),
     StopSyncing,
@@ -194,7 +194,6 @@
             TeamControlGained(str) => ems![b'g', str],
             TeamControlLost(str) => ems![b'f', str],
             Taunt(s) => vec![b't', *s],
-            HogSay(str) => ems![b'h', str],
             Heartbeat => em![b'+'],
             TimeWrap => unreachable!(),
         }
@@ -207,6 +206,9 @@
         match self {
             TeamControlGained(str) => ems![b'G', str],
             TeamControlLost(str) => ems![b'F', str],
+            HogSay(str) => ems![b'h', str],
+            ChatMessage(str) => ems![b's', str],
+            TeamMessage(str) => ems![b'b', str],
         }
     }
 }
@@ -217,8 +219,6 @@
         match self {
             Ping => em![b'?'],
             Pong => em![b'!'],
-            ChatMessage(str) => ems![b's', str],
-            TeamMessage(str) => ems![b'b', str],
             Error(str) => ems![b'E', str],
             Warning(_) => unreachable!(),
             StopSyncing => unreachable!(),
--- a/rust/hedgewars-engine-messages/src/parser.rs	Mon Jan 14 15:11:15 2019 -0500
+++ b/rust/hedgewars-engine-messages/src/parser.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -1,10 +1,9 @@
-use nom::{Err::Error, *};
-use std::str;
-
-use super::messages::{
+use crate::messages::{
     ConfigEngineMessage::*, EngineMessage::*, KeystrokeAction::*, SyncedEngineMessage::*,
     UnorderedEngineMessage::*, *,
 };
+use nom::{Err::Error, *};
+use std::str;
 
 macro_rules! eof_slice (
   ($i:expr,) => (
@@ -55,7 +54,6 @@
       | do_parse!(tag!("P") >> x: be_i24 >> y: be_i24 >> ( CursorMove(x, y) ))
       | do_parse!(tag!("f") >> s: string_tail >> ( SyncedEngineMessage::TeamControlLost(s) ))
       | do_parse!(tag!("g") >> s: string_tail >> ( SyncedEngineMessage::TeamControlGained(s) ))
-      | do_parse!(tag!("h") >> s: string_tail >> ( HogSay(s) ))
       | do_parse!(tag!("t") >> t: be_u8 >> ( Taunt(t) ))
       | do_parse!(tag!("w") >> w: be_u8 >> ( SetWeapon(w) ))
       | do_parse!(tag!("~") >> s: be_u8 >> ( Slot(s) ))
@@ -65,6 +63,9 @@
 named!(unsynced_message<&[u8], UnsyncedEngineMessage>, alt!(
         do_parse!(tag!("F") >> s: string_tail >> ( UnsyncedEngineMessage::TeamControlLost(s) ))
       | do_parse!(tag!("G") >> s: string_tail >> ( UnsyncedEngineMessage::TeamControlGained(s) ))
+      | do_parse!(tag!("h") >> s: string_tail >> ( UnsyncedEngineMessage::HogSay(s) ))
+      | do_parse!(tag!("s") >> s: string_tail >> ( UnsyncedEngineMessage::ChatMessage(s)) )
+      | do_parse!(tag!("b") >> s: string_tail >> ( UnsyncedEngineMessage::TeamMessage(s)) ) // TODO: wtf is the format
 ));
 
 named!(unordered_message<&[u8], UnorderedEngineMessage>, alt!(
@@ -72,8 +73,6 @@
     | do_parse!(tag!("!") >> ( Pong ))
     | do_parse!(tag!("E") >> s: string_tail >> ( UnorderedEngineMessage::Error(s)) )
     | do_parse!(tag!("W") >> s: string_tail >> ( Warning(s)) )
-    | do_parse!(tag!("s") >> s: string_tail >> ( ChatMessage(s)) )
-    | do_parse!(tag!("b") >> s: string_tail >> ( TeamMessage(s)) ) // TODO: wtf is the format
     | do_parse!(tag!("M") >> s: string_tail >> ( GameSetupChecksum(s)) )
     | do_parse!(tag!("o") >> ( StopSyncing ))
     | do_parse!(tag!("I") >> ( PauseToggled ))
@@ -129,62 +128,74 @@
             let consumed = buf.len() - tail.len();
 
             Some((consumed, msg))
-        },
+        }
         Err(Err::Incomplete(_)) => None,
         Err(Err::Error(_)) | Err(Err::Failure(_)) => unreachable!(),
     }
 }
 
-#[test]
-fn parse_length() {
-    assert_eq!(length_specifier(b"\x01"), Ok((&b""[..], 1)));
-    assert_eq!(length_specifier(b"\x00"), Ok((&b""[..], 0)));
-    assert_eq!(length_specifier(b"\x3f"), Ok((&b""[..], 63)));
-    assert_eq!(length_specifier(b"\x40\x00"), Ok((&b""[..], 64)));
-    assert_eq!(
-        length_specifier(b"\xff\xff"),
-        Ok((&b""[..], EngineMessage::MAX_LEN))
-    );
-}
+#[cfg(test)]
+mod tests {
+    use crate::messages::UnsyncedEngineMessage::*;
+    use crate::parser::*;
 
-#[test]
-fn parse_synced_messages() {
-    assert_eq!(
-        message(b"\x03L\x01\x02"),
-        Ok((&b""[..], Synced(Left(Press), 258)))
-    );
+    #[test]
+    fn parse_length() {
+        assert_eq!(length_specifier(b"\x01"), Ok((&b""[..], 1)));
+        assert_eq!(length_specifier(b"\x00"), Ok((&b""[..], 0)));
+        assert_eq!(length_specifier(b"\x3f"), Ok((&b""[..], 63)));
+        assert_eq!(length_specifier(b"\x40\x00"), Ok((&b""[..], 64)));
+        assert_eq!(
+            length_specifier(b"\xff\xff"),
+            Ok((&b""[..], EngineMessage::MAX_LEN))
+        );
+    }
 
-    assert_eq!(message(b"\x01#"), Ok((&b""[..], Synced(TimeWrap, 65535))));
+    #[test]
+    fn parse_synced_messages() {
+        assert_eq!(
+            message(b"\x03L\x01\x02"),
+            Ok((&b""[..], Synced(Left(Press), 258)))
+        );
 
-    assert_eq!(message(&vec![9, b'p', 255, 133, 151, 1, 0, 2, 0, 0]), Ok((&b""[..], Synced(Put(-31337, 65538), 0))));
-}
+        assert_eq!(message(b"\x01#"), Ok((&b""[..], Synced(TimeWrap, 65535))));
+
+        assert_eq!(
+            message(&vec![9, b'p', 255, 133, 151, 1, 0, 2, 0, 0]),
+            Ok((&b""[..], Synced(Put(-31337, 65538), 0)))
+        );
+    }
 
-#[test]
-fn parse_unsynced_messages() {
-    assert_eq!(
-        message(b"\x06shello"),
-        Ok((&b""[..], Unordered(ChatMessage(String::from("hello")))))
-    );
-}
+    #[test]
+    fn parse_unsynced_messages() {
+        assert_eq!(
+            message(b"\x06shello"),
+            Ok((&b""[..], Unsynced(ChatMessage(String::from("hello")))))
+        );
+    }
 
-#[test]
-fn parse_incorrect_messages() {
-    assert_eq!(message(b"\x00"), Ok((&b""[..], Empty)));
-    assert_eq!(message(b"\x01\x00"), Ok((&b""[..], Unknown)));
+    #[test]
+    fn parse_incorrect_messages() {
+        assert_eq!(message(b"\x00"), Ok((&b""[..], Empty)));
+        assert_eq!(message(b"\x01\x00"), Ok((&b""[..], Unknown)));
+
+        // garbage after correct message
+        assert_eq!(message(b"\x04La\x01\x02"), Ok((&b""[..], Unknown)));
+    }
 
-    // garbage after correct message
-    assert_eq!(message(b"\x04La\x01\x02"), Ok((&b""[..], Unknown)));
-}
+    #[test]
+    fn parse_config_messages() {
+        assert_eq!(message(b"\x01C"), Ok((&b""[..], Config(ConfigRequest))));
+    }
 
-#[test]
-fn parse_config_messages() {
-    assert_eq!(message(b"\x01C"), Ok((&b""[..], Config(ConfigRequest))));
+    #[test]
+    fn parse_test_general() {
+        assert_eq!(string_tail(b"abc"), Ok((&b""[..], String::from("abc"))));
+
+        assert_eq!(extract_message(b"\x02#"), None);
+        assert_eq!(
+            extract_message(b"\x01#"),
+            Some((2, Synced(TimeWrap, 65535)))
+        );
+    }
 }
-
-#[test]
-fn parse_test_general() {
-    assert_eq!(string_tail(b"abc"), Ok((&b""[..], String::from("abc"))));
-
-    assert_eq!(extract_message(b"\x02#"), None);
-    assert_eq!(extract_message(b"\x01#"), Some((2, Synced(TimeWrap, 65535))));
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hedgewars-engine-messages/src/queue.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,112 @@
+use crate::messages::{EngineMessage::*, SyncedEngineMessage::*, UnsyncedEngineMessage::*, *};
+use queues::*;
+
+#[derive(PartialEq)]
+pub enum QueueChatStrategy {
+    NetworkGame,
+    LocalGame,
+}
+
+pub struct MessagesQueue {
+    strategy: QueueChatStrategy,
+    hi_ticks: u32,
+    unordered: Queue<EngineMessage>,
+    ordered: Queue<EngineMessage>,
+}
+
+impl MessagesQueue {
+    pub fn new(strategy: QueueChatStrategy) -> Self {
+        MessagesQueue {
+            strategy,
+            hi_ticks: 0,
+            unordered: queue![],
+            ordered: queue![],
+        }
+    }
+
+    fn is_unordered(&self, message: &EngineMessage) -> bool {
+        match message {
+            Unordered(_) => true,
+            Unsynced(HogSay(_)) | Unsynced(ChatMessage(_)) | Unsynced(TeamMessage(_)) => {
+                self.strategy == QueueChatStrategy::NetworkGame
+            }
+            _ => false,
+        }
+    }
+
+    pub fn push(&mut self, engine_message: EngineMessage) {
+        if self.is_unordered(&engine_message) {
+            self.unordered.add(engine_message).unwrap();
+        } else if let Synced(TimeWrap, timestamp) = engine_message {
+            self.ordered
+                .add(Synced(TimeWrap, timestamp + self.hi_ticks))
+                .unwrap();
+            self.hi_ticks += 65536;
+        } else if let Synced(message, timestamp) = engine_message {
+            self.ordered
+                .add(Synced(message, timestamp + self.hi_ticks))
+                .unwrap();
+        } else {
+            self.ordered.add(engine_message).unwrap();
+        }
+    }
+
+    pub fn pop(&mut self, timestamp: u32) -> Option<EngineMessage> {
+        if let Ok(message) = self.unordered.remove() {
+            Some(message)
+        } else if let Ok(Synced(_, message_timestamp)) = self.ordered.peek() {
+            if message_timestamp == timestamp {
+                self.ordered.remove().ok()
+            } else {
+                None
+            }
+        } else {
+            self.ordered.remove().ok()
+        }
+    }
+
+    pub fn iter(&mut self, timestamp: u32) -> MessagesQueueIterator {
+        MessagesQueueIterator {
+            timestamp,
+            queue: self,
+        }
+    }
+}
+
+pub struct MessagesQueueIterator<'a> {
+    timestamp: u32,
+    queue: &'a mut MessagesQueue,
+}
+
+impl<'a> Iterator for MessagesQueueIterator<'a> {
+    type Item = EngineMessage;
+
+    fn next(&mut self) -> Option<EngineMessage> {
+        self.queue.pop(self.timestamp)
+    }
+}
+
+#[test]
+fn queue_order() {
+    use crate::messages::UnorderedEngineMessage::*;
+
+    let mut queue = MessagesQueue::new(QueueChatStrategy::LocalGame);
+
+    queue.push(Synced(Skip, 1));
+    queue.push(Unsynced(ChatMessage("hi".to_string())));
+    queue.push(Synced(TimeWrap, 65535));
+    queue.push(Unordered(Ping));
+    queue.push(Synced(Skip, 2));
+
+    let zero_tick: Vec<EngineMessage> = queue.iter(0).collect();
+    assert_eq!(zero_tick, vec![Unordered(Ping)]);
+    assert_eq!(queue.pop(1), Some(Synced(Skip, 1)));
+    assert_eq!(queue.pop(1), Some(Unsynced(ChatMessage("hi".to_string()))));
+    assert_eq!(queue.pop(1), None);
+    assert_eq!(queue.pop(2), None);
+    assert_eq!(queue.pop(65535), Some(Synced(TimeWrap, 65535)));
+    assert_eq!(queue.pop(65535), None);
+    assert_eq!(queue.pop(65538), Some(Synced(Skip, 65538)));
+    assert_eq!(queue.pop(65538), None);
+    assert_eq!(queue.pop(65539), None);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hedgewars-server/Cargo.toml	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,31 @@
+[package]
+edition = "2018"
+name = "hedgewars-server"
+version = "0.0.1"
+authors = [ "Andrey Korotaev <a.korotaev@hedgewars.org>" ]
+
+[features]
+official-server = ["openssl", "mysql"]
+tls-connections = ["openssl"]
+default = []
+
+[dependencies]
+getopts = "0.2.18"
+rand = "0.6"
+mio = "0.6"
+mio-extras = "2.0.5"
+slab = "0.4"
+netbuf = "0.4"
+nom = "5.0"
+env_logger = "0.6"
+log = "0.4"
+base64 = "0.10"
+bitflags = "1.0"
+serde = "1.0"
+serde_yaml = "0.8"
+serde_derive = "1.0"
+openssl = { version = "0.10", optional = true }
+mysql = { version = "15.0", optional = true }
+
+[dev-dependencies]
+proptest = "0.9"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hedgewars-server/src/core.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,5 @@
+pub mod client;
+pub mod indexslab;
+pub mod room;
+pub mod server;
+pub mod types;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hedgewars-server/src/core/client.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,109 @@
+use super::types::ClientId;
+use bitflags::*;
+
+bitflags! {
+    pub struct ClientFlags: u16 {
+        const IS_ADMIN = 0b0000_0001;
+        const IS_MASTER = 0b0000_0010;
+        const IS_READY = 0b0000_0100;
+        const IS_IN_GAME = 0b0000_1000;
+        const IS_JOINED_MID_GAME = 0b0001_0000;
+        const IS_CHECKER = 0b0010_0000;
+        const IS_CONTRIBUTOR = 0b0100_0000;
+        const HAS_SUPER_POWER = 0b1000_0000;
+        const IS_REGISTERED = 0b0001_0000_0000;
+
+        const NONE = 0b0000_0000;
+        const DEFAULT = Self::NONE.bits;
+    }
+}
+
+pub struct HwClient {
+    pub id: ClientId,
+    pub room_id: Option<usize>,
+    pub nick: String,
+    pub protocol_number: u16,
+    pub flags: ClientFlags,
+    pub teams_in_game: u8,
+    pub team_indices: Vec<u8>,
+    pub clan: Option<u8>,
+}
+
+impl HwClient {
+    pub fn new(id: ClientId, protocol_number: u16, nick: String) -> HwClient {
+        HwClient {
+            id,
+            nick,
+            protocol_number,
+            room_id: None,
+            flags: ClientFlags::DEFAULT,
+            teams_in_game: 0,
+            team_indices: Vec::new(),
+            clan: None,
+        }
+    }
+
+    fn contains(&self, mask: ClientFlags) -> bool {
+        self.flags.contains(mask)
+    }
+
+    fn set(&mut self, mask: ClientFlags, value: bool) {
+        self.flags.set(mask, value);
+    }
+
+    pub fn is_admin(&self) -> bool {
+        self.contains(ClientFlags::IS_ADMIN)
+    }
+    pub fn is_master(&self) -> bool {
+        self.contains(ClientFlags::IS_MASTER)
+    }
+    pub fn is_ready(&self) -> bool {
+        self.contains(ClientFlags::IS_READY)
+    }
+    pub fn is_in_game(&self) -> bool {
+        self.contains(ClientFlags::IS_IN_GAME)
+    }
+    pub fn is_joined_mid_game(&self) -> bool {
+        self.contains(ClientFlags::IS_JOINED_MID_GAME)
+    }
+    pub fn is_checker(&self) -> bool {
+        self.contains(ClientFlags::IS_CHECKER)
+    }
+    pub fn is_contributor(&self) -> bool {
+        self.contains(ClientFlags::IS_CONTRIBUTOR)
+    }
+    pub fn has_super_power(&self) -> bool {
+        self.contains(ClientFlags::HAS_SUPER_POWER)
+    }
+    pub fn is_registered(&self) -> bool {
+        self.contains(ClientFlags::IS_REGISTERED)
+    }
+
+    pub fn set_is_admin(&mut self, value: bool) {
+        self.set(ClientFlags::IS_ADMIN, value)
+    }
+    pub fn set_is_master(&mut self, value: bool) {
+        self.set(ClientFlags::IS_MASTER, value)
+    }
+    pub fn set_is_ready(&mut self, value: bool) {
+        self.set(ClientFlags::IS_READY, value)
+    }
+    pub fn set_is_in_game(&mut self, value: bool) {
+        self.set(ClientFlags::IS_IN_GAME, value)
+    }
+    pub fn set_is_joined_mid_game(&mut self, value: bool) {
+        self.set(ClientFlags::IS_JOINED_MID_GAME, value)
+    }
+    pub fn set_is_checker(&mut self, value: bool) {
+        self.set(ClientFlags::IS_CHECKER, value)
+    }
+    pub fn set_is_contributor(&mut self, value: bool) {
+        self.set(ClientFlags::IS_CONTRIBUTOR, value)
+    }
+    pub fn set_has_super_power(&mut self, value: bool) {
+        self.set(ClientFlags::HAS_SUPER_POWER, value)
+    }
+    pub fn set_is_registered(&mut self, value: bool) {
+        self.set(ClientFlags::IS_REGISTERED, value)
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hedgewars-server/src/core/indexslab.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,71 @@
+use std::{
+    iter,
+    mem::replace,
+    ops::{Index, IndexMut},
+};
+
+pub struct IndexSlab<T> {
+    data: Vec<Option<T>>,
+}
+
+impl<T> IndexSlab<T> {
+    pub fn new() -> Self {
+        Self { data: Vec::new() }
+    }
+
+    pub fn with_capacity(capacity: usize) -> Self {
+        Self {
+            data: Vec::with_capacity(capacity),
+        }
+    }
+
+    pub fn insert(&mut self, index: usize, value: T) {
+        if index >= self.data.len() {
+            self.data.reserve(index - self.data.len() + 1);
+            self.data.extend((self.data.len()..index).map(|_| None));
+            self.data.push(Some(value))
+        } else {
+            self.data[index] = Some(value);
+        }
+    }
+
+    pub fn contains(&self, index: usize) -> bool {
+        self.data.get(index).and_then(|x| x.as_ref()).is_some()
+    }
+
+    pub fn remove(&mut self, index: usize) -> Option<T> {
+        if let Some(x) = self.data.get_mut(index) {
+            replace(x, None)
+        } else {
+            None
+        }
+    }
+
+    pub fn iter(&self) -> impl Iterator<Item = (usize, &T)> {
+        self.data
+            .iter()
+            .enumerate()
+            .filter_map(|(index, opt)| opt.as_ref().and_then(|x| Some((index, x))))
+    }
+
+    pub fn iter_mut(&mut self) -> impl Iterator<Item = (usize, &mut T)> {
+        self.data
+            .iter_mut()
+            .enumerate()
+            .filter_map(|(index, opt)| opt.as_mut().and_then(|x| Some((index, x))))
+    }
+}
+
+impl<T> Index<usize> for IndexSlab<T> {
+    type Output = T;
+
+    fn index(&self, index: usize) -> &Self::Output {
+        self.data[index].as_ref().unwrap()
+    }
+}
+
+impl<T> IndexMut<usize> for IndexSlab<T> {
+    fn index_mut(&mut self, index: usize) -> &mut Self::Output {
+        self.data[index].as_mut().unwrap()
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hedgewars-server/src/core/room.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,349 @@
+use super::{
+    client::HwClient,
+    types::{
+        ClientId, GameCfg, GameCfg::*, RoomConfig, RoomId, TeamInfo, Voting, MAX_HEDGEHOGS_PER_TEAM,
+    },
+};
+use bitflags::*;
+use serde::{Deserialize, Serialize};
+use serde_derive::{Deserialize, Serialize};
+use serde_yaml;
+use std::{collections::HashMap, iter};
+
+pub const MAX_TEAMS_IN_ROOM: u8 = 8;
+pub const MAX_HEDGEHOGS_IN_ROOM: u8 = MAX_HEDGEHOGS_PER_TEAM * MAX_HEDGEHOGS_PER_TEAM;
+
+fn client_teams_impl(
+    teams: &[(ClientId, TeamInfo)],
+    client_id: ClientId,
+) -> impl Iterator<Item = &TeamInfo> + Clone {
+    teams
+        .iter()
+        .filter(move |(id, _)| *id == client_id)
+        .map(|(_, t)| t)
+}
+
+pub struct GameInfo {
+    pub teams_in_game: u8,
+    pub teams_at_start: Vec<(ClientId, TeamInfo)>,
+    pub left_teams: Vec<String>,
+    pub msg_log: Vec<String>,
+    pub sync_msg: Option<String>,
+    pub is_paused: bool,
+    config: RoomConfig,
+}
+
+impl GameInfo {
+    fn new(teams: Vec<(ClientId, TeamInfo)>, config: RoomConfig) -> GameInfo {
+        GameInfo {
+            left_teams: Vec::new(),
+            msg_log: Vec::new(),
+            sync_msg: None,
+            is_paused: false,
+            teams_in_game: teams.len() as u8,
+            teams_at_start: teams,
+            config,
+        }
+    }
+
+    pub fn client_teams(&self, client_id: ClientId) -> impl Iterator<Item = &TeamInfo> + Clone {
+        client_teams_impl(&self.teams_at_start, client_id)
+    }
+}
+
+#[derive(Serialize, Deserialize)]
+pub struct RoomSave {
+    pub location: String,
+    config: RoomConfig,
+}
+
+bitflags! {
+    pub struct RoomFlags: u8 {
+        const FIXED = 0b0000_0001;
+        const RESTRICTED_JOIN = 0b0000_0010;
+        const RESTRICTED_TEAM_ADD = 0b0000_0100;
+        const RESTRICTED_UNREGISTERED_PLAYERS = 0b0000_1000;
+    }
+}
+
+pub struct HwRoom {
+    pub id: RoomId,
+    pub master_id: Option<ClientId>,
+    pub name: String,
+    pub password: Option<String>,
+    pub greeting: String,
+    pub protocol_number: u16,
+    pub flags: RoomFlags,
+
+    pub players_number: u8,
+    pub default_hedgehog_number: u8,
+    pub max_teams: u8,
+    pub ready_players_number: u8,
+    pub teams: Vec<(ClientId, TeamInfo)>,
+    config: RoomConfig,
+    pub voting: Option<Voting>,
+    pub saves: HashMap<String, RoomSave>,
+    pub game_info: Option<GameInfo>,
+}
+
+impl HwRoom {
+    pub fn new(id: RoomId) -> HwRoom {
+        HwRoom {
+            id,
+            master_id: None,
+            name: String::new(),
+            password: None,
+            greeting: "".to_string(),
+            flags: RoomFlags::empty(),
+            protocol_number: 0,
+            players_number: 0,
+            default_hedgehog_number: 4,
+            max_teams: MAX_TEAMS_IN_ROOM,
+            ready_players_number: 0,
+            teams: Vec::new(),
+            config: RoomConfig::new(),
+            voting: None,
+            saves: HashMap::new(),
+            game_info: None,
+        }
+    }
+
+    pub fn hedgehogs_number(&self) -> u8 {
+        self.teams.iter().map(|(_, t)| t.hedgehogs_number).sum()
+    }
+
+    pub fn addable_hedgehogs(&self) -> u8 {
+        MAX_HEDGEHOGS_IN_ROOM - self.hedgehogs_number()
+    }
+
+    pub fn add_team(
+        &mut self,
+        owner_id: ClientId,
+        mut team: TeamInfo,
+        preserve_color: bool,
+    ) -> &TeamInfo {
+        if !preserve_color {
+            team.color = iter::repeat(())
+                .enumerate()
+                .map(|(i, _)| i as u8)
+                .take(u8::max_value() as usize + 1)
+                .find(|i| self.teams.iter().all(|(_, t)| t.color != *i))
+                .unwrap_or(0u8)
+        };
+        team.hedgehogs_number = if self.teams.is_empty() {
+            self.default_hedgehog_number
+        } else {
+            self.teams[0]
+                .1
+                .hedgehogs_number
+                .min(self.addable_hedgehogs())
+        };
+        self.teams.push((owner_id, team));
+        &self.teams.last().unwrap().1
+    }
+
+    pub fn remove_team(&mut self, name: &str) {
+        if let Some(index) = self.teams.iter().position(|(_, t)| t.name == name) {
+            self.teams.remove(index);
+        }
+    }
+
+    pub fn set_hedgehogs_number(&mut self, n: u8) -> Vec<String> {
+        let mut names = Vec::new();
+        let teams = match self.game_info {
+            Some(ref mut info) => &mut info.teams_at_start,
+            None => &mut self.teams,
+        };
+
+        if teams.len() as u8 * n <= MAX_HEDGEHOGS_IN_ROOM {
+            for (_, team) in teams.iter_mut() {
+                team.hedgehogs_number = n;
+                names.push(team.name.clone())
+            }
+            self.default_hedgehog_number = n;
+        }
+        names
+    }
+
+    pub fn find_team_and_owner_mut<F>(&mut self, f: F) -> Option<(ClientId, &mut TeamInfo)>
+    where
+        F: Fn(&TeamInfo) -> bool,
+    {
+        self.teams
+            .iter_mut()
+            .find(|(_, t)| f(t))
+            .map(|(id, t)| (*id, t))
+    }
+
+    pub fn find_team<F>(&self, f: F) -> Option<&TeamInfo>
+    where
+        F: Fn(&TeamInfo) -> bool,
+    {
+        self.teams
+            .iter()
+            .find_map(|(_, t)| Some(t).filter(|t| f(&t)))
+    }
+
+    pub fn client_teams(&self, client_id: ClientId) -> impl Iterator<Item = &TeamInfo> {
+        client_teams_impl(&self.teams, client_id)
+    }
+
+    pub fn client_team_indices(&self, client_id: ClientId) -> Vec<u8> {
+        self.teams
+            .iter()
+            .enumerate()
+            .filter(move |(_, (id, _))| *id == client_id)
+            .map(|(i, _)| i as u8)
+            .collect()
+    }
+
+    pub fn clan_team_owners(&self, color: u8) -> impl Iterator<Item = ClientId> + '_ {
+        self.teams
+            .iter()
+            .filter(move |(_, t)| t.color == color)
+            .map(|(id, _)| *id)
+    }
+
+    pub fn find_team_owner(&self, team_name: &str) -> Option<(ClientId, &str)> {
+        self.teams
+            .iter()
+            .find(|(_, t)| t.name == team_name)
+            .map(|(id, t)| (*id, &t.name[..]))
+    }
+
+    pub fn find_team_color(&self, owner_id: ClientId) -> Option<u8> {
+        self.client_teams(owner_id).nth(0).map(|t| t.color)
+    }
+
+    pub fn has_multiple_clans(&self) -> bool {
+        self.teams.iter().min_by_key(|(_, t)| t.color)
+            != self.teams.iter().max_by_key(|(_, t)| t.color)
+    }
+
+    pub fn set_config(&mut self, cfg: GameCfg) {
+        self.config.set_config(cfg);
+    }
+
+    pub fn start_round(&mut self) {
+        if self.game_info.is_none() {
+            self.game_info = Some(GameInfo::new(self.teams.clone(), self.config.clone()));
+        }
+    }
+
+    pub fn is_fixed(&self) -> bool {
+        self.flags.contains(RoomFlags::FIXED)
+    }
+    pub fn is_join_restricted(&self) -> bool {
+        self.flags.contains(RoomFlags::RESTRICTED_JOIN)
+    }
+    pub fn is_team_add_restricted(&self) -> bool {
+        self.flags.contains(RoomFlags::RESTRICTED_TEAM_ADD)
+    }
+    pub fn are_unregistered_players_restricted(&self) -> bool {
+        self.flags
+            .contains(RoomFlags::RESTRICTED_UNREGISTERED_PLAYERS)
+    }
+
+    pub fn set_is_fixed(&mut self, value: bool) {
+        self.flags.set(RoomFlags::FIXED, value)
+    }
+    pub fn set_join_restriction(&mut self, value: bool) {
+        self.flags.set(RoomFlags::RESTRICTED_JOIN, value)
+    }
+    pub fn set_team_add_restriction(&mut self, value: bool) {
+        self.flags.set(RoomFlags::RESTRICTED_TEAM_ADD, value)
+    }
+    pub fn set_unregistered_players_restriction(&mut self, value: bool) {
+        self.flags
+            .set(RoomFlags::RESTRICTED_UNREGISTERED_PLAYERS, value)
+    }
+
+    fn flags_string(&self) -> String {
+        let mut result = "-".to_string();
+        if self.game_info.is_some() {
+            result += "g"
+        }
+        if self.password.is_some() {
+            result += "p"
+        }
+        if self.is_join_restricted() {
+            result += "j"
+        }
+        if self.are_unregistered_players_restricted() {
+            result += "r"
+        }
+        result
+    }
+
+    pub fn info(&self, master: Option<&HwClient>) -> Vec<String> {
+        let c = &self.config;
+        vec![
+            self.flags_string(),
+            self.name.clone(),
+            self.players_number.to_string(),
+            self.teams.len().to_string(),
+            master.map_or("[]", |c| &c.nick).to_string(),
+            c.map_type.to_string(),
+            c.script.to_string(),
+            c.scheme.name.to_string(),
+            c.ammo.name.to_string(),
+        ]
+    }
+
+    pub fn active_config(&self) -> &RoomConfig {
+        match self.game_info {
+            Some(ref info) => &info.config,
+            None => &self.config,
+        }
+    }
+
+    pub fn map_config(&self) -> Vec<String> {
+        match self.game_info {
+            Some(ref info) => info.config.to_map_config(),
+            None => self.config.to_map_config(),
+        }
+    }
+
+    pub fn game_config(&self) -> Vec<GameCfg> {
+        match self.game_info {
+            Some(ref info) => info.config.to_game_config(),
+            None => self.config.to_game_config(),
+        }
+    }
+
+    pub fn save_config(&mut self, name: String, location: String) {
+        self.saves.insert(
+            name,
+            RoomSave {
+                location,
+                config: self.config.clone(),
+            },
+        );
+    }
+
+    pub fn load_config(&mut self, name: &str) -> Option<&str> {
+        if let Some(save) = self.saves.get(name) {
+            self.config = save.config.clone();
+            Some(&save.location[..])
+        } else {
+            None
+        }
+    }
+
+    pub fn delete_config(&mut self, name: &str) -> bool {
+        self.saves.remove(name).is_some()
+    }
+
+    pub fn get_saves(&self) -> Result<String, serde_yaml::Error> {
+        serde_yaml::to_string(&(&self.greeting, &self.saves))
+    }
+
+    pub fn set_saves(&mut self, text: &str) -> Result<(), serde_yaml::Error> {
+        serde_yaml::from_str::<(String, HashMap<String, RoomSave>)>(text).map(
+            |(greeting, saves)| {
+                self.greeting = greeting;
+                self.saves = saves;
+            },
+        )
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hedgewars-server/src/core/server.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,287 @@
+use super::{
+    client::HwClient,
+    indexslab::IndexSlab,
+    room::HwRoom,
+    types::{ClientId, RoomId},
+};
+use crate::{protocol::messages::HwProtocolMessage::Greeting, utils};
+
+use bitflags::*;
+use log::*;
+use slab;
+use std::{borrow::BorrowMut, iter, num::NonZeroU16};
+
+type Slab<T> = slab::Slab<T>;
+
+pub struct HwAnteClient {
+    pub nick: Option<String>,
+    pub protocol_number: Option<NonZeroU16>,
+    pub server_salt: String,
+    pub is_checker: bool,
+    pub is_local_admin: bool,
+}
+
+pub struct HwAnteroom {
+    pub clients: IndexSlab<HwAnteClient>,
+}
+
+impl HwAnteroom {
+    pub fn new(clients_limit: usize) -> Self {
+        let clients = IndexSlab::with_capacity(clients_limit);
+        HwAnteroom { clients }
+    }
+
+    pub fn add_client(&mut self, client_id: ClientId, salt: String, is_local_admin: bool) {
+        let client = HwAnteClient {
+            nick: None,
+            protocol_number: None,
+            server_salt: salt,
+            is_checker: false,
+            is_local_admin,
+        };
+        self.clients.insert(client_id, client);
+    }
+
+    pub fn remove_client(&mut self, client_id: ClientId) -> Option<HwAnteClient> {
+        let mut client = self.clients.remove(client_id);
+        client
+    }
+}
+
+pub struct ServerGreetings {
+    pub for_latest_protocol: String,
+    pub for_old_protocols: String,
+}
+
+impl ServerGreetings {
+    fn new() -> Self {
+        Self {
+            for_latest_protocol: "\u{1f994} is watching".to_string(),
+            for_old_protocols: "\u{1f994} is watching".to_string(),
+        }
+    }
+}
+
+bitflags! {
+    pub struct ServerFlags: u8 {
+        const REGISTERED_ONLY = 0b0000_1000;
+    }
+}
+
+pub struct HwServer {
+    pub clients: IndexSlab<HwClient>,
+    pub rooms: Slab<HwRoom>,
+    pub anteroom: HwAnteroom,
+    pub latest_protocol: u16,
+    pub flags: ServerFlags,
+    pub greetings: ServerGreetings,
+}
+
+impl HwServer {
+    pub fn new(clients_limit: usize, rooms_limit: usize) -> Self {
+        let rooms = Slab::with_capacity(rooms_limit);
+        let clients = IndexSlab::with_capacity(clients_limit);
+        Self {
+            clients,
+            rooms,
+            anteroom: HwAnteroom::new(clients_limit),
+            greetings: ServerGreetings::new(),
+            latest_protocol: 58,
+            flags: ServerFlags::empty(),
+        }
+    }
+
+    pub fn add_client(&mut self, client_id: ClientId, data: HwAnteClient) {
+        if let (Some(protocol), Some(nick)) = (data.protocol_number, data.nick) {
+            let mut client = HwClient::new(client_id, protocol.get(), nick);
+            client.set_is_checker(data.is_checker);
+            #[cfg(not(feature = "official-server"))]
+            client.set_is_admin(data.is_local_admin);
+
+            self.clients.insert(client_id, client);
+        }
+    }
+
+    pub fn remove_client(&mut self, client_id: ClientId) {
+        self.clients.remove(client_id);
+    }
+
+    pub fn get_greetings(&self, client_id: ClientId) -> &str {
+        if self.clients[client_id].protocol_number < self.latest_protocol {
+            &self.greetings.for_old_protocols
+        } else {
+            &self.greetings.for_latest_protocol
+        }
+    }
+
+    #[inline]
+    pub fn create_room(
+        &mut self,
+        creator_id: ClientId,
+        name: String,
+        password: Option<String>,
+    ) -> RoomId {
+        create_room(
+            &mut self.clients[creator_id],
+            &mut self.rooms,
+            name,
+            password,
+        )
+    }
+
+    #[inline]
+    pub fn move_to_room(&mut self, client_id: ClientId, room_id: RoomId) {
+        move_to_room(&mut self.clients[client_id], &mut self.rooms[room_id])
+    }
+
+    pub fn has_room(&self, name: &str) -> bool {
+        self.find_room(name).is_some()
+    }
+
+    pub fn find_room(&self, name: &str) -> Option<&HwRoom> {
+        self.rooms
+            .iter()
+            .find_map(|(_, r)| Some(r).filter(|r| r.name == name))
+    }
+
+    pub fn find_room_mut(&mut self, name: &str) -> Option<&mut HwRoom> {
+        self.rooms
+            .iter_mut()
+            .find_map(|(_, r)| Some(r).filter(|r| r.name == name))
+    }
+
+    pub fn find_client(&self, nick: &str) -> Option<&HwClient> {
+        self.clients
+            .iter()
+            .find_map(|(_, c)| Some(c).filter(|c| c.nick == nick))
+    }
+
+    pub fn find_client_mut(&mut self, nick: &str) -> Option<&mut HwClient> {
+        self.clients
+            .iter_mut()
+            .find_map(|(_, c)| Some(c).filter(|c| c.nick == nick))
+    }
+
+    pub fn all_clients(&self) -> impl Iterator<Item = ClientId> + '_ {
+        self.clients.iter().map(|(id, _)| id)
+    }
+
+    pub fn filter_clients<'a, F>(&'a self, f: F) -> impl Iterator<Item = ClientId> + 'a
+    where
+        F: Fn(&(usize, &HwClient)) -> bool + 'a,
+    {
+        self.clients.iter().filter(f).map(|(_, c)| c.id)
+    }
+
+    pub fn filter_rooms<'a, F>(&'a self, f: F) -> impl Iterator<Item = RoomId> + 'a
+    where
+        F: Fn(&(usize, &HwRoom)) -> bool + 'a,
+    {
+        self.rooms.iter().filter(f).map(|(_, c)| c.id)
+    }
+
+    pub fn collect_clients<F>(&self, f: F) -> Vec<ClientId>
+    where
+        F: Fn(&(usize, &HwClient)) -> bool,
+    {
+        self.filter_clients(f).collect()
+    }
+
+    pub fn collect_nicks<F>(&self, f: F) -> Vec<String>
+    where
+        F: Fn(&(usize, &HwClient)) -> bool,
+    {
+        self.clients
+            .iter()
+            .filter(f)
+            .map(|(_, c)| c.nick.clone())
+            .collect()
+    }
+
+    pub fn lobby_clients(&self) -> impl Iterator<Item = ClientId> + '_ {
+        self.filter_clients(|(_, c)| c.room_id == None)
+    }
+
+    pub fn room_clients(&self, room_id: RoomId) -> impl Iterator<Item = ClientId> + '_ {
+        self.filter_clients(move |(_, c)| c.room_id == Some(room_id))
+    }
+
+    pub fn protocol_clients(&self, protocol: u16) -> impl Iterator<Item = ClientId> + '_ {
+        self.filter_clients(move |(_, c)| c.protocol_number == protocol)
+    }
+
+    pub fn protocol_rooms(&self, protocol: u16) -> impl Iterator<Item = RoomId> + '_ {
+        self.filter_rooms(move |(_, r)| r.protocol_number == protocol)
+    }
+
+    pub fn other_clients_in_room(&self, self_id: ClientId) -> Vec<ClientId> {
+        let room_id = self.clients[self_id].room_id;
+        self.collect_clients(|(id, c)| *id != self_id && c.room_id == room_id)
+    }
+
+    pub fn is_registered_only(&self) -> bool {
+        self.flags.contains(ServerFlags::REGISTERED_ONLY)
+    }
+
+    pub fn set_is_registered_only(&mut self, value: bool) {
+        self.flags.set(ServerFlags::REGISTERED_ONLY, value)
+    }
+}
+
+fn allocate_room(rooms: &mut Slab<HwRoom>) -> &mut HwRoom {
+    let entry = rooms.vacant_entry();
+    let room = HwRoom::new(entry.key());
+    entry.insert(room)
+}
+
+fn create_room(
+    client: &mut HwClient,
+    rooms: &mut Slab<HwRoom>,
+    name: String,
+    password: Option<String>,
+) -> RoomId {
+    let room = allocate_room(rooms);
+
+    room.master_id = Some(client.id);
+    room.name = name;
+    room.password = password;
+    room.protocol_number = client.protocol_number;
+
+    room.players_number = 1;
+    room.ready_players_number = 1;
+
+    client.room_id = Some(room.id);
+    client.set_is_master(true);
+    client.set_is_ready(true);
+    client.set_is_joined_mid_game(false);
+
+    room.id
+}
+
+fn move_to_room(client: &mut HwClient, room: &mut HwRoom) {
+    debug_assert!(client.room_id != Some(room.id));
+
+    room.players_number += 1;
+
+    client.room_id = Some(room.id);
+    client.set_is_joined_mid_game(room.game_info.is_some());
+    client.set_is_in_game(room.game_info.is_some());
+
+    if let Some(ref mut info) = room.game_info {
+        let teams = info.client_teams(client.id);
+        client.teams_in_game = teams.clone().count() as u8;
+        client.clan = teams.clone().next().map(|t| t.color);
+        let team_names: Vec<_> = teams.map(|t| t.name.clone()).collect();
+
+        if !team_names.is_empty() {
+            info.left_teams.retain(|name| !team_names.contains(&name));
+            info.teams_in_game += team_names.len() as u8;
+            room.teams = info
+                .teams_at_start
+                .iter()
+                .filter(|(_, t)| !team_names.contains(&t.name))
+                .cloned()
+                .collect();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hedgewars-server/src/core/types.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,194 @@
+use serde_derive::{Deserialize, Serialize};
+
+pub type ClientId = usize;
+pub type RoomId = usize;
+
+pub const MAX_HEDGEHOGS_PER_TEAM: u8 = 8;
+
+#[derive(PartialEq, Eq, Clone, Debug)]
+pub enum ServerVar {
+    MOTDNew(String),
+    MOTDOld(String),
+    LatestProto(u16),
+}
+
+#[derive(PartialEq, Eq, Clone, Debug)]
+pub enum GameCfg {
+    FeatureSize(u32),
+    MapType(String),
+    MapGenerator(u32),
+    MazeSize(u32),
+    Seed(String),
+    Template(u32),
+
+    Ammo(String, Option<String>),
+    Scheme(String, Vec<String>),
+    Script(String),
+    Theme(String),
+    DrawnMap(String),
+}
+
+#[derive(PartialEq, Eq, Clone, Debug)]
+pub struct TeamInfo {
+    pub owner: String,
+    pub name: String,
+    pub color: u8,
+    pub grave: String,
+    pub fort: String,
+    pub voice_pack: String,
+    pub flag: String,
+    pub difficulty: u8,
+    pub hedgehogs_number: u8,
+    pub hedgehogs: [HedgehogInfo; MAX_HEDGEHOGS_PER_TEAM as usize],
+}
+
+#[derive(PartialEq, Eq, Clone, Debug)]
+pub struct HedgehogInfo {
+    pub name: String,
+    pub hat: String,
+}
+
+#[derive(Clone, Serialize, Deserialize, Debug)]
+pub struct Ammo {
+    pub name: String,
+    pub settings: Option<String>,
+}
+
+#[derive(Clone, Serialize, Deserialize, Debug)]
+pub struct Scheme {
+    pub name: String,
+    pub settings: Vec<String>,
+}
+
+#[derive(Clone, Serialize, Deserialize, Debug)]
+pub struct RoomConfig {
+    pub feature_size: u32,
+    pub map_type: String,
+    pub map_generator: u32,
+    pub maze_size: u32,
+    pub seed: String,
+    pub template: u32,
+
+    pub ammo: Ammo,
+    pub scheme: Scheme,
+    pub script: String,
+    pub theme: String,
+    pub drawn_map: Option<String>,
+}
+
+impl RoomConfig {
+    pub fn new() -> RoomConfig {
+        RoomConfig {
+            feature_size: 12,
+            map_type: "+rnd+".to_string(),
+            map_generator: 0,
+            maze_size: 0,
+            seed: "seed".to_string(),
+            template: 0,
+
+            ammo: Ammo {
+                name: "Default".to_string(),
+                settings: None,
+            },
+            scheme: Scheme {
+                name: "Default".to_string(),
+                settings: Vec::new(),
+            },
+            script: "Normal".to_string(),
+            theme: "\u{1f994}".to_string(),
+            drawn_map: None,
+        }
+    }
+
+    pub fn set_config(&mut self, cfg: GameCfg) {
+        match cfg {
+            GameCfg::FeatureSize(s) => self.feature_size = s,
+            GameCfg::MapType(t) => self.map_type = t,
+            GameCfg::MapGenerator(g) => self.map_generator = g,
+            GameCfg::MazeSize(s) => self.maze_size = s,
+            GameCfg::Seed(s) => self.seed = s,
+            GameCfg::Template(t) => self.template = t,
+
+            GameCfg::Ammo(n, s) => {
+                self.ammo = Ammo {
+                    name: n,
+                    settings: s,
+                }
+            }
+            GameCfg::Scheme(n, s) => {
+                self.scheme = Scheme {
+                    name: n,
+                    settings: s,
+                }
+            }
+            GameCfg::Script(s) => self.script = s,
+            GameCfg::Theme(t) => self.theme = t,
+            GameCfg::DrawnMap(m) => self.drawn_map = Some(m),
+        };
+    }
+
+    pub fn to_map_config(&self) -> Vec<String> {
+        vec![
+            self.feature_size.to_string(),
+            self.map_type.to_string(),
+            self.map_generator.to_string(),
+            self.maze_size.to_string(),
+            self.seed.to_string(),
+            self.template.to_string(),
+        ]
+    }
+
+    pub fn to_game_config(&self) -> Vec<GameCfg> {
+        use GameCfg::*;
+        let mut v = vec![
+            Ammo(self.ammo.name.to_string(), self.ammo.settings.clone()),
+            Scheme(self.scheme.name.to_string(), self.scheme.settings.clone()),
+            Script(self.script.to_string()),
+            Theme(self.theme.to_string()),
+        ];
+        if let Some(ref m) = self.drawn_map {
+            v.push(DrawnMap(m.to_string()))
+        }
+        v
+    }
+}
+
+#[derive(Debug)]
+pub struct Replay {
+    pub config: RoomConfig,
+    pub teams: Vec<TeamInfo>,
+    pub message_log: Vec<String>,
+}
+
+#[derive(PartialEq, Eq, Clone, Debug)]
+pub enum VoteType {
+    Kick(String),
+    Map(Option<String>),
+    Pause,
+    NewSeed,
+    HedgehogsPerTeam(u8),
+}
+
+pub struct Vote {
+    pub is_pro: bool,
+    pub is_forced: bool,
+}
+
+#[derive(Clone, Debug)]
+pub struct Voting {
+    pub ttl: u32,
+    pub voters: Vec<ClientId>,
+    pub votes: Vec<(ClientId, bool)>,
+    pub kind: VoteType,
+}
+
+impl Voting {
+    pub fn new(kind: VoteType, voters: Vec<ClientId>) -> Voting {
+        Voting {
+            kind,
+            voters,
+            ttl: 2,
+            votes: Vec::new(),
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hedgewars-server/src/handlers.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,467 @@
+use mio;
+use std::{
+    cmp::PartialEq,
+    collections::HashMap,
+    fmt::{Formatter, LowerHex},
+    iter::Iterator,
+};
+
+use self::{
+    actions::{Destination, DestinationGroup, PendingMessage},
+    inanteroom::LoginResult,
+};
+use crate::{
+    core::{
+        room::RoomSave,
+        server::HwServer,
+        types::{ClientId, GameCfg, Replay, RoomId, TeamInfo},
+    },
+    protocol::messages::{
+        global_chat, server_chat, HwProtocolMessage, HwProtocolMessage::EngineMessage,
+        HwServerMessage, HwServerMessage::*,
+    },
+    utils,
+};
+use base64::encode;
+use log::*;
+use rand::{thread_rng, RngCore};
+
+mod actions;
+mod checker;
+mod common;
+mod inanteroom;
+mod inlobby;
+mod inroom;
+
+#[derive(PartialEq, Debug)]
+pub struct Sha1Digest([u8; 20]);
+
+impl Sha1Digest {
+    pub fn new(digest: [u8; 20]) -> Self {
+        Self(digest)
+    }
+}
+
+impl LowerHex for Sha1Digest {
+    fn fmt(&self, f: &mut Formatter) -> Result<(), std::fmt::Error> {
+        for byte in &self.0 {
+            write!(f, "{:02x}", byte)?;
+        }
+        Ok(())
+    }
+}
+
+impl PartialEq<&str> for Sha1Digest {
+    fn eq(&self, other: &&str) -> bool {
+        if other.len() != self.0.len() * 2 {
+            false
+        } else {
+            #[inline]
+            fn convert(c: u8) -> u8 {
+                if c > b'9' {
+                    c.wrapping_sub(b'a').saturating_add(10)
+                } else {
+                    c.wrapping_sub(b'0')
+                }
+            }
+
+            other
+                .as_bytes()
+                .chunks_exact(2)
+                .zip(&self.0)
+                .all(|(chars, byte)| {
+                    if let [hi, lo] = chars {
+                        convert(*lo) == byte & 0x0f && convert(*hi) == (byte & 0xf0) >> 4
+                    } else {
+                        unreachable!()
+                    }
+                })
+        }
+    }
+}
+
+#[derive(Debug)]
+pub struct AccountInfo {
+    pub is_registered: bool,
+    pub is_admin: bool,
+    pub is_contributor: bool,
+    pub server_hash: Sha1Digest,
+}
+
+pub enum IoTask {
+    CheckRegistered {
+        nick: String,
+    },
+    GetAccount {
+        nick: String,
+        protocol: u16,
+        password_hash: String,
+        client_salt: String,
+        server_salt: String,
+    },
+    GetReplay {
+        id: u32,
+    },
+    SaveRoom {
+        room_id: RoomId,
+        filename: String,
+        contents: String,
+    },
+    LoadRoom {
+        room_id: RoomId,
+        filename: String,
+    },
+}
+
+#[derive(Debug)]
+pub enum IoResult {
+    AccountRegistered(bool),
+    Account(Option<AccountInfo>),
+    Replay(Option<Replay>),
+    SaveRoom(RoomId, bool),
+    LoadRoom(RoomId, Option<String>),
+}
+
+pub struct Response {
+    client_id: ClientId,
+    messages: Vec<PendingMessage>,
+    io_tasks: Vec<IoTask>,
+    removed_clients: Vec<ClientId>,
+}
+
+impl Response {
+    pub fn new(client_id: ClientId) -> Self {
+        Self {
+            client_id,
+            messages: vec![],
+            io_tasks: vec![],
+            removed_clients: vec![],
+        }
+    }
+
+    #[inline]
+    pub fn is_empty(&self) -> bool {
+        self.messages.is_empty() && self.removed_clients.is_empty() && self.io_tasks.is_empty()
+    }
+
+    #[inline]
+    pub fn len(&self) -> usize {
+        self.messages.len()
+    }
+
+    #[inline]
+    pub fn client_id(&self) -> ClientId {
+        self.client_id
+    }
+
+    #[inline]
+    pub fn add(&mut self, message: PendingMessage) {
+        self.messages.push(message)
+    }
+
+    #[inline]
+    pub fn request_io(&mut self, task: IoTask) {
+        self.io_tasks.push(task)
+    }
+
+    pub fn extract_messages<'a, 'b: 'a>(
+        &'b mut self,
+        server: &'a HwServer,
+    ) -> impl Iterator<Item = (Vec<ClientId>, HwServerMessage)> + 'a {
+        let client_id = self.client_id;
+        self.messages.drain(..).map(move |m| {
+            let ids = get_recipients(server, client_id, m.destination);
+            (ids, m.message)
+        })
+    }
+
+    pub fn remove_client(&mut self, client_id: ClientId) {
+        self.removed_clients.push(client_id);
+    }
+
+    pub fn extract_removed_clients(&mut self) -> impl Iterator<Item = ClientId> + '_ {
+        self.removed_clients.drain(..)
+    }
+
+    pub fn extract_io_tasks(&mut self) -> impl Iterator<Item = IoTask> + '_ {
+        self.io_tasks.drain(..)
+    }
+}
+
+impl Extend<PendingMessage> for Response {
+    fn extend<T: IntoIterator<Item = PendingMessage>>(&mut self, iter: T) {
+        for msg in iter {
+            self.add(msg)
+        }
+    }
+}
+
+fn get_recipients(
+    server: &HwServer,
+    client_id: ClientId,
+    destination: Destination,
+) -> Vec<ClientId> {
+    match destination {
+        Destination::ToSelf => vec![client_id],
+        Destination::ToId(id) => vec![id],
+        Destination::ToIds(ids) => ids,
+        Destination::ToAll { group, skip_self } => {
+            let mut ids: Vec<_> = match group {
+                DestinationGroup::All => server.all_clients().collect(),
+                DestinationGroup::Lobby => server.lobby_clients().collect(),
+                DestinationGroup::Protocol(proto) => server.protocol_clients(proto).collect(),
+                DestinationGroup::Room(id) => server.room_clients(id).collect(),
+            };
+
+            if skip_self {
+                if let Some(index) = ids.iter().position(|id| *id == client_id) {
+                    ids.remove(index);
+                }
+            }
+
+            ids
+        }
+    }
+}
+
+pub fn handle(
+    server: &mut HwServer,
+    client_id: ClientId,
+    response: &mut Response,
+    message: HwProtocolMessage,
+) {
+    match message {
+        HwProtocolMessage::Ping => response.add(Pong.send_self()),
+        HwProtocolMessage::Pong => (),
+        _ => {
+            if server.anteroom.clients.contains(client_id) {
+                match inanteroom::handle(server, client_id, response, message) {
+                    LoginResult::Unchanged => (),
+                    LoginResult::Complete => {
+                        if let Some(client) = server.anteroom.remove_client(client_id) {
+                            server.add_client(client_id, client);
+                            common::join_lobby(server, response);
+                        }
+                    }
+                    LoginResult::Exit => {
+                        server.anteroom.remove_client(client_id);
+                        response.remove_client(client_id);
+                    }
+                }
+            } else if server.clients.contains(client_id) {
+                match message {
+                    HwProtocolMessage::Quit(Some(msg)) => {
+                        common::remove_client(server, response, "User quit: ".to_string() + &msg);
+                    }
+                    HwProtocolMessage::Quit(None) => {
+                        common::remove_client(server, response, "User quit".to_string());
+                    }
+                    HwProtocolMessage::Info(nick) => {
+                        if let Some(client) = server.find_client(&nick) {
+                            let admin_sign = if client.is_admin() { "@" } else { "" };
+                            let master_sign = if client.is_master() { "+" } else { "" };
+                            let room_info = match client.room_id {
+                                Some(room_id) => {
+                                    let room = &server.rooms[room_id];
+                                    let status = match room.game_info {
+                                        Some(_) if client.teams_in_game == 0 => "(spectating)",
+                                        Some(_) => "(playing)",
+                                        None => "",
+                                    };
+                                    format!(
+                                        "[{}{}room {}]{}",
+                                        admin_sign, master_sign, room.name, status
+                                    )
+                                }
+                                None => format!("[{}lobby]", admin_sign),
+                            };
+
+                            let info = vec![
+                                client.nick.clone(),
+                                "[]".to_string(),
+                                utils::protocol_version_string(client.protocol_number).to_string(),
+                                room_info,
+                            ];
+                            response.add(Info(info).send_self())
+                        } else {
+                            response
+                                .add(server_chat("Player is not online.".to_string()).send_self())
+                        }
+                    }
+                    HwProtocolMessage::ToggleServerRegisteredOnly => {
+                        if !server.clients[client_id].is_admin() {
+                            response.add(Warning("Access denied.".to_string()).send_self());
+                        } else {
+                            server.set_is_registered_only(server.is_registered_only());
+                            let msg = if server.is_registered_only() {
+                                "This server no longer allows unregistered players to join."
+                            } else {
+                                "This server now allows unregistered players to join."
+                            };
+                            response.add(server_chat(msg.to_string()).send_all());
+                        }
+                    }
+                    HwProtocolMessage::Global(msg) => {
+                        if !server.clients[client_id].is_admin() {
+                            response.add(Warning("Access denied.".to_string()).send_self());
+                        } else {
+                            response.add(global_chat(msg).send_all())
+                        }
+                    }
+                    HwProtocolMessage::SuperPower => {
+                        if !server.clients[client_id].is_admin() {
+                            response.add(Warning("Access denied.".to_string()).send_self());
+                        } else {
+                            server.clients[client_id].set_has_super_power(true);
+                            response
+                                .add(server_chat("Super power activated.".to_string()).send_self())
+                        }
+                    }
+                    HwProtocolMessage::Watch(id) => {
+                        #[cfg(feature = "official-server")]
+                        {
+                            response.request_io(IoTask::GetReplay { id })
+                        }
+
+                        #[cfg(not(feature = "official-server"))]
+                        {
+                            response.add(
+                                Warning("This server does not support replays!".to_string())
+                                    .send_self(),
+                            );
+                        }
+                    }
+                    _ => match server.clients[client_id].room_id {
+                        None => inlobby::handle(server, client_id, response, message),
+                        Some(room_id) => {
+                            inroom::handle(server, client_id, response, room_id, message)
+                        }
+                    },
+                }
+            }
+        }
+    }
+}
+
+pub fn handle_client_accept(
+    server: &mut HwServer,
+    client_id: ClientId,
+    response: &mut Response,
+    is_local: bool,
+) {
+    let mut salt = [0u8; 18];
+    thread_rng().fill_bytes(&mut salt);
+
+    server
+        .anteroom
+        .add_client(client_id, encode(&salt), is_local);
+
+    response.add(HwServerMessage::Connected(utils::SERVER_VERSION).send_self());
+}
+
+pub fn handle_client_loss(server: &mut HwServer, client_id: ClientId, response: &mut Response) {
+    if server.anteroom.remove_client(client_id).is_none() {
+        common::remove_client(server, response, "Connection reset".to_string());
+    }
+}
+
+pub fn handle_io_result(
+    server: &mut HwServer,
+    client_id: ClientId,
+    response: &mut Response,
+    io_result: IoResult,
+) {
+    match io_result {
+        IoResult::AccountRegistered(is_registered) => {
+            if !is_registered && server.is_registered_only() {
+                response.add(
+                    Bye("This server only allows registered users to join.".to_string())
+                        .send_self(),
+                );
+                response.remove_client(client_id);
+            } else if is_registered {
+                let salt = server.anteroom.clients[client_id].server_salt.clone();
+                response.add(AskPassword(salt).send_self());
+            } else if let Some(client) = server.anteroom.remove_client(client_id) {
+                server.add_client(client_id, client);
+                common::join_lobby(server, response);
+            }
+        }
+        IoResult::Account(Some(info)) => {
+            response.add(ServerAuth(format!("{:x}", info.server_hash)).send_self());
+            if let Some(client) = server.anteroom.remove_client(client_id) {
+                server.add_client(client_id, client);
+                let client = &mut server.clients[client_id];
+                client.set_is_registered(info.is_registered);
+                client.set_is_admin(info.is_admin);
+                client.set_is_contributor(info.is_contributor);
+                common::join_lobby(server, response);
+            }
+        }
+        IoResult::Account(None) => {
+            response.add(Error("Authentication failed.".to_string()).send_self());
+            response.remove_client(client_id);
+        }
+        IoResult::Replay(Some(replay)) => {
+            let protocol = server.clients[client_id].protocol_number;
+            let start_msg = if protocol < 58 {
+                RoomJoined(vec![server.clients[client_id].nick.clone()])
+            } else {
+                ReplayStart
+            };
+            response.add(start_msg.send_self());
+
+            common::get_room_config_impl(&replay.config, client_id, response);
+            common::get_teams(replay.teams.iter(), client_id, response);
+            response.add(RunGame.send_self());
+            response.add(ForwardEngineMessage(replay.message_log).send_self());
+
+            if protocol < 58 {
+                response.add(Kicked.send_self());
+            }
+        }
+        IoResult::Replay(None) => {
+            response.add(Warning("Could't load the replay".to_string()).send_self())
+        }
+        IoResult::SaveRoom(_, true) => {
+            response.add(server_chat("Room configs saved successfully.".to_string()).send_self());
+        }
+        IoResult::SaveRoom(_, false) => {
+            response.add(Warning("Unable to save the room configs.".to_string()).send_self());
+        }
+        IoResult::LoadRoom(room_id, Some(contents)) => {
+            if let Some(ref mut room) = server.rooms.get_mut(room_id) {
+                match room.set_saves(&contents) {
+                    Ok(_) => response.add(
+                        server_chat("Room configs loaded successfully.".to_string()).send_self(),
+                    ),
+                    Err(e) => {
+                        warn!("Error while deserializing the room configs: {}", e);
+                        response.add(
+                            Warning("Unable to deserialize the room configs.".to_string())
+                                .send_self(),
+                        );
+                    }
+                }
+            }
+        }
+        IoResult::LoadRoom(_, None) => {
+            response.add(Warning("Unable to load the room configs.".to_string()).send_self());
+        }
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use super::Sha1Digest;
+
+    #[test]
+    fn hash_cmp_test() {
+        let hash = Sha1Digest([
+            0x37, 0xC4, 0x9F, 0x5C, 0xC3, 0xC9, 0xDB, 0xFC, 0x54, 0xAC, 0x22, 0x04, 0xF6, 0x12,
+            0x9A, 0xED, 0x69, 0xB1, 0xC4, 0x5C,
+        ]);
+
+        assert_eq!(hash, &format!("{:x}", hash)[..]);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hedgewars-server/src/handlers/actions.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,115 @@
+use crate::{
+    core::{
+        client::HwClient,
+        room::HwRoom,
+        room::{GameInfo, RoomFlags},
+        server::HwServer,
+        types::{ClientId, GameCfg, RoomId, VoteType},
+    },
+    protocol::messages::{server_chat, HwProtocolMessage, HwServerMessage, HwServerMessage::*},
+    utils::to_engine_msg,
+};
+use rand::{distributions::Uniform, thread_rng, Rng};
+use std::{io, io::Write, iter::once, mem::replace};
+
+pub enum DestinationGroup {
+    All,
+    Lobby,
+    Room(RoomId),
+    Protocol(u16),
+}
+
+pub enum Destination {
+    ToId(ClientId),
+    ToIds(Vec<ClientId>),
+    ToSelf,
+    ToAll {
+        group: DestinationGroup,
+        skip_self: bool,
+    },
+}
+
+pub struct PendingMessage {
+    pub destination: Destination,
+    pub message: HwServerMessage,
+}
+
+impl PendingMessage {
+    pub fn send(message: HwServerMessage, client_id: ClientId) -> PendingMessage {
+        PendingMessage {
+            destination: Destination::ToId(client_id),
+            message,
+        }
+    }
+
+    pub fn send_many(message: HwServerMessage, client_ids: Vec<ClientId>) -> PendingMessage {
+        PendingMessage {
+            destination: Destination::ToIds(client_ids),
+            message,
+        }
+    }
+
+    pub fn send_self(message: HwServerMessage) -> PendingMessage {
+        PendingMessage {
+            destination: Destination::ToSelf,
+            message,
+        }
+    }
+
+    pub fn send_all(message: HwServerMessage) -> PendingMessage {
+        let destination = Destination::ToAll {
+            group: DestinationGroup::All,
+            skip_self: false,
+        };
+        PendingMessage {
+            destination,
+            message,
+        }
+    }
+
+    pub fn in_room(mut self, clients_room_id: RoomId) -> PendingMessage {
+        if let Destination::ToAll { ref mut group, .. } = self.destination {
+            *group = DestinationGroup::Room(clients_room_id)
+        }
+        self
+    }
+
+    pub fn in_lobby(mut self) -> PendingMessage {
+        if let Destination::ToAll { ref mut group, .. } = self.destination {
+            *group = DestinationGroup::Lobby
+        }
+        self
+    }
+
+    pub fn with_protocol(mut self, protocol_number: u16) -> PendingMessage {
+        if let Destination::ToAll { ref mut group, .. } = self.destination {
+            *group = DestinationGroup::Protocol(protocol_number)
+        }
+        self
+    }
+
+    pub fn but_self(mut self) -> PendingMessage {
+        if let Destination::ToAll {
+            ref mut skip_self, ..
+        } = self.destination
+        {
+            *skip_self = true
+        }
+        self
+    }
+}
+
+impl HwServerMessage {
+    pub fn send(self, client_id: ClientId) -> PendingMessage {
+        PendingMessage::send(self, client_id)
+    }
+    pub fn send_many(self, client_ids: Vec<ClientId>) -> PendingMessage {
+        PendingMessage::send_many(self, client_ids)
+    }
+    pub fn send_self(self) -> PendingMessage {
+        PendingMessage::send_self(self)
+    }
+    pub fn send_all(self) -> PendingMessage {
+        PendingMessage::send_all(self)
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hedgewars-server/src/handlers/checker.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,13 @@
+use log::*;
+use mio;
+
+use crate::{
+    core::{server::HwServer, types::ClientId},
+    protocol::messages::HwProtocolMessage,
+};
+
+pub fn handle(_server: &mut HwServer, _client_id: ClientId, message: HwProtocolMessage) {
+    match message {
+        _ => warn!("Unknown command"),
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hedgewars-server/src/handlers/common.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,660 @@
+use crate::{
+    core::{
+        client::HwClient,
+        room::HwRoom,
+        server::HwServer,
+        types::{ClientId, GameCfg, RoomId, TeamInfo, Vote, VoteType},
+    },
+    protocol::messages::{
+        add_flags, remove_flags, server_chat,
+        HwProtocolMessage::{self, Rnd},
+        HwServerMessage::{self, *},
+        ProtocolFlags as Flags,
+    },
+    utils::to_engine_msg,
+};
+
+use super::Response;
+
+use crate::core::types::RoomConfig;
+use rand::{self, seq::SliceRandom, thread_rng, Rng};
+use std::{iter::once, mem::replace};
+
+pub fn rnd_reply(options: &[String]) -> HwServerMessage {
+    let mut rng = thread_rng();
+
+    let reply = if options.is_empty() {
+        (*&["heads", "tails"].choose(&mut rng).unwrap()).to_string()
+    } else {
+        options.choose(&mut rng).unwrap().clone()
+    };
+
+    ChatMsg {
+        nick: "[random]".to_string(),
+        msg: reply,
+    }
+}
+
+pub fn join_lobby(server: &mut HwServer, response: &mut Response) {
+    let client_id = response.client_id();
+
+    let client = &server.clients[client_id];
+    let nick = vec![client.nick.clone()];
+    let mut flags = vec![];
+    if client.is_registered() {
+        flags.push(Flags::Registered)
+    }
+    if client.is_admin() {
+        flags.push(Flags::Admin)
+    }
+    if client.is_contributor() {
+        flags.push(Flags::Contributor)
+    }
+
+    let all_nicks: Vec<_> = server.collect_nicks(|_| true);
+
+    let mut flag_selectors = [
+        (
+            Flags::Registered,
+            server.collect_nicks(|(_, c)| c.is_registered()),
+        ),
+        (Flags::Admin, server.collect_nicks(|(_, c)| c.is_admin())),
+        (
+            Flags::Contributor,
+            server.collect_nicks(|(_, c)| c.is_contributor()),
+        ),
+        (
+            Flags::InRoom,
+            server.collect_nicks(|(_, c)| c.room_id.is_some()),
+        ),
+    ];
+
+    let server_msg = ServerMessage(server.get_greetings(client_id).to_string());
+
+    let rooms_msg = Rooms(
+        server
+            .rooms
+            .iter()
+            .filter(|(_, r)| r.protocol_number == client.protocol_number)
+            .flat_map(|(_, r)| r.info(r.master_id.map(|id| &server.clients[id])))
+            .collect(),
+    );
+
+    response.add(LobbyJoined(nick).send_all().but_self());
+    response.add(
+        ClientFlags(add_flags(&flags), all_nicks.clone())
+            .send_all()
+            .but_self(),
+    );
+
+    response.add(LobbyJoined(all_nicks).send_self());
+    for (flag, nicks) in &mut flag_selectors {
+        if !nicks.is_empty() {
+            response.add(ClientFlags(add_flags(&[*flag]), replace(nicks, vec![])).send_self());
+        }
+    }
+
+    response.add(server_msg.send_self());
+    response.add(rooms_msg.send_self());
+}
+
+pub fn remove_teams(
+    room: &mut HwRoom,
+    team_names: Vec<String>,
+    is_in_game: bool,
+    response: &mut Response,
+) {
+    if let Some(ref mut info) = room.game_info {
+        for team_name in &team_names {
+            info.left_teams.push(team_name.clone());
+
+            if is_in_game {
+                let msg = once(b'F').chain(team_name.bytes());
+                response.add(
+                    ForwardEngineMessage(vec![to_engine_msg(msg)])
+                        .send_all()
+                        .in_room(room.id)
+                        .but_self(),
+                );
+
+                info.teams_in_game -= 1;
+
+                let remove_msg = to_engine_msg(once(b'F').chain(team_name.bytes()));
+                if let Some(m) = &info.sync_msg {
+                    info.msg_log.push(m.clone());
+                    info.sync_msg = None
+                }
+                info.msg_log.push(remove_msg.clone());
+
+                response.add(
+                    ForwardEngineMessage(vec![remove_msg])
+                        .send_all()
+                        .in_room(room.id)
+                        .but_self(),
+                );
+            }
+        }
+    }
+
+    for team_name in team_names {
+        room.remove_team(&team_name);
+        response.add(TeamRemove(team_name).send_all().in_room(room.id));
+    }
+}
+
+fn remove_client_from_room(
+    client: &mut HwClient,
+    room: &mut HwRoom,
+    response: &mut Response,
+    msg: &str,
+) {
+    room.players_number -= 1;
+    if room.players_number > 0 || room.is_fixed() {
+        if client.is_ready() && room.ready_players_number > 0 {
+            room.ready_players_number -= 1;
+        }
+
+        let team_names: Vec<_> = room
+            .client_teams(client.id)
+            .map(|t| t.name.clone())
+            .collect();
+        remove_teams(room, team_names, client.is_in_game(), response);
+
+        if room.players_number > 0 {
+            response.add(
+                RoomLeft(client.nick.clone(), msg.to_string())
+                    .send_all()
+                    .in_room(room.id)
+                    .but_self(),
+            );
+        }
+
+        if client.is_master() && !room.is_fixed() {
+            client.set_is_master(false);
+            response.add(
+                ClientFlags(
+                    remove_flags(&[Flags::RoomMaster]),
+                    vec![client.nick.clone()],
+                )
+                .send_all()
+                .in_room(room.id),
+            );
+            room.master_id = None;
+        }
+    }
+
+    client.room_id = None;
+
+    let update_msg = if room.players_number == 0 && !room.is_fixed() {
+        RoomRemove(room.name.clone())
+    } else {
+        RoomUpdated(room.name.clone(), room.info(Some(&client)))
+    };
+    response.add(update_msg.send_all().with_protocol(room.protocol_number));
+
+    response.add(ClientFlags(remove_flags(&[Flags::InRoom]), vec![client.nick.clone()]).send_all());
+}
+
+pub fn change_master(
+    server: &mut HwServer,
+    room_id: RoomId,
+    new_master_id: ClientId,
+    response: &mut Response,
+) {
+    let room = &mut server.rooms[room_id];
+    if let Some(master_id) = room.master_id {
+        server.clients[master_id].set_is_master(false);
+        response.add(
+            ClientFlags(
+                remove_flags(&[Flags::RoomMaster]),
+                vec![server.clients[master_id].nick.clone()],
+            )
+            .send_all()
+            .in_room(room_id),
+        )
+    }
+
+    room.master_id = Some(new_master_id);
+    server.clients[new_master_id].set_is_master(true);
+
+    response.add(
+        ClientFlags(
+            add_flags(&[Flags::RoomMaster]),
+            vec![server.clients[new_master_id].nick.clone()],
+        )
+        .send_all()
+        .in_room(room_id),
+    );
+}
+
+pub fn enter_room(
+    server: &mut HwServer,
+    client_id: ClientId,
+    room_id: RoomId,
+    response: &mut Response,
+) {
+    let nick = server.clients[client_id].nick.clone();
+    server.move_to_room(client_id, room_id);
+
+    response.add(RoomJoined(vec![nick.clone()]).send_all().in_room(room_id));
+    response.add(ClientFlags(add_flags(&[Flags::InRoom]), vec![nick]).send_all());
+    let nicks = server.collect_nicks(|(_, c)| c.room_id == Some(room_id));
+    response.add(RoomJoined(nicks).send_self());
+
+    get_room_teams(server, room_id, client_id, response);
+
+    let room = &server.rooms[room_id];
+    get_room_config(room, client_id, response);
+
+    let mut flag_selectors = [
+        (
+            Flags::RoomMaster,
+            server.collect_nicks(|(_, c)| c.is_master()),
+        ),
+        (Flags::Ready, server.collect_nicks(|(_, c)| c.is_ready())),
+        (Flags::InGame, server.collect_nicks(|(_, c)| c.is_in_game())),
+    ];
+
+    for (flag, nicks) in &mut flag_selectors {
+        response.add(ClientFlags(add_flags(&[*flag]), replace(nicks, vec![])).send_self());
+    }
+
+    if !room.greeting.is_empty() {
+        response.add(
+            ChatMsg {
+                nick: "[greeting]".to_string(),
+                msg: room.greeting.clone(),
+            }
+            .send_self(),
+        );
+    }
+}
+
+pub fn exit_room(server: &mut HwServer, client_id: ClientId, response: &mut Response, msg: &str) {
+    let client = &mut server.clients[client_id];
+
+    if let Some(room_id) = client.room_id {
+        let room = &mut server.rooms[room_id];
+
+        remove_client_from_room(client, room, response, msg);
+
+        if !room.is_fixed() {
+            if room.players_number == 0 {
+                server.rooms.remove(room_id);
+            } else if room.master_id == None {
+                let new_master_id = server.room_clients(room_id).next();
+                if let Some(new_master_id) = new_master_id {
+                    let new_master_nick = server.clients[new_master_id].nick.clone();
+                    let room = &mut server.rooms[room_id];
+                    room.master_id = Some(new_master_id);
+                    server.clients[new_master_id].set_is_master(true);
+
+                    if room.protocol_number < 42 {
+                        room.name = new_master_nick.clone();
+                    }
+
+                    room.set_join_restriction(false);
+                    room.set_team_add_restriction(false);
+                    room.set_unregistered_players_restriction(true);
+
+                    response.add(
+                        ClientFlags(add_flags(&[Flags::RoomMaster]), vec![new_master_nick])
+                            .send_all()
+                            .in_room(room.id),
+                    );
+                }
+            }
+        }
+    }
+}
+
+pub fn remove_client(server: &mut HwServer, response: &mut Response, msg: String) {
+    let client_id = response.client_id();
+    let client = &mut server.clients[client_id];
+    let nick = client.nick.clone();
+
+    exit_room(server, client_id, response, &msg);
+
+    server.remove_client(client_id);
+
+    response.add(LobbyLeft(nick, msg.to_string()).send_all());
+    response.add(Bye("User quit: ".to_string() + &msg).send_self());
+    response.remove_client(client_id);
+}
+
+pub fn get_room_update(
+    room_name: Option<String>,
+    room: &HwRoom,
+    master: Option<&HwClient>,
+    response: &mut Response,
+) {
+    let update_msg = RoomUpdated(room_name.unwrap_or(room.name.clone()), room.info(master));
+    response.add(update_msg.send_all().with_protocol(room.protocol_number));
+}
+
+pub fn get_room_config_impl(config: &RoomConfig, to_client: ClientId, response: &mut Response) {
+    response.add(ConfigEntry("FULLMAPCONFIG".to_string(), config.to_map_config()).send(to_client));
+    for cfg in config.to_game_config() {
+        response.add(cfg.to_server_msg().send(to_client));
+    }
+}
+
+pub fn get_room_config(room: &HwRoom, to_client: ClientId, response: &mut Response) {
+    get_room_config_impl(room.active_config(), to_client, response);
+}
+
+pub fn get_teams<'a, I>(teams: I, to_client: ClientId, response: &mut Response)
+where
+    I: Iterator<Item = &'a TeamInfo>,
+{
+    for team in teams {
+        response.add(TeamAdd(team.to_protocol()).send(to_client));
+        response.add(TeamColor(team.name.clone(), team.color).send(to_client));
+        response.add(HedgehogsNumber(team.name.clone(), team.hedgehogs_number).send(to_client));
+    }
+}
+
+pub fn get_room_teams(
+    server: &HwServer,
+    room_id: RoomId,
+    to_client: ClientId,
+    response: &mut Response,
+) {
+    let room = &server.rooms[room_id];
+    let current_teams = match room.game_info {
+        Some(ref info) => &info.teams_at_start,
+        None => &room.teams,
+    };
+
+    get_teams(current_teams.iter().map(|(_, t)| t), to_client, response);
+}
+
+pub fn get_room_flags(
+    server: &HwServer,
+    room_id: RoomId,
+    to_client: ClientId,
+    response: &mut Response,
+) {
+    let room = &server.rooms[room_id];
+    if let Some(id) = room.master_id {
+        response.add(
+            ClientFlags(
+                add_flags(&[Flags::RoomMaster]),
+                vec![server.clients[id].nick.clone()],
+            )
+            .send(to_client),
+        );
+    }
+    let nicks: Vec<_> = server
+        .clients
+        .iter()
+        .filter(|(_, c)| c.room_id == Some(room_id) && c.is_ready())
+        .map(|(_, c)| c.nick.clone())
+        .collect();
+    if !nicks.is_empty() {
+        response.add(ClientFlags(add_flags(&[Flags::Ready]), nicks).send(to_client));
+    }
+}
+
+pub fn apply_voting_result(
+    server: &mut HwServer,
+    room_id: RoomId,
+    response: &mut Response,
+    kind: VoteType,
+) {
+    match kind {
+        VoteType::Kick(nick) => {
+            if let Some(client) = server.find_client(&nick) {
+                if client.room_id == Some(room_id) {
+                    let id = client.id;
+                    response.add(Kicked.send(id));
+                    exit_room(server, id, response, "kicked");
+                }
+            }
+        }
+        VoteType::Map(None) => (),
+        VoteType::Map(Some(name)) => {
+            if let Some(location) = server.rooms[room_id].load_config(&name) {
+                response.add(
+                    server_chat(location.to_string())
+                        .send_all()
+                        .in_room(room_id),
+                );
+                let room = &server.rooms[room_id];
+                let room_master = if let Some(id) = room.master_id {
+                    Some(&server.clients[id])
+                } else {
+                    None
+                };
+                get_room_update(None, room, room_master, response);
+
+                for (_, client) in server.clients.iter() {
+                    if client.room_id == Some(room_id) {
+                        super::common::get_room_config(&server.rooms[room_id], client.id, response);
+                    }
+                }
+            }
+        }
+        VoteType::Pause => {
+            if let Some(ref mut info) = server.rooms[room_id].game_info {
+                info.is_paused = !info.is_paused;
+                response.add(
+                    server_chat("Pause toggled.".to_string())
+                        .send_all()
+                        .in_room(room_id),
+                );
+                response.add(
+                    ForwardEngineMessage(vec![to_engine_msg(once(b'I'))])
+                        .send_all()
+                        .in_room(room_id),
+                );
+            }
+        }
+        VoteType::NewSeed => {
+            let seed = thread_rng().gen_range(0, 1_000_000_000).to_string();
+            let cfg = GameCfg::Seed(seed);
+            response.add(cfg.to_server_msg().send_all().in_room(room_id));
+            server.rooms[room_id].set_config(cfg);
+        }
+        VoteType::HedgehogsPerTeam(number) => {
+            let r = &mut server.rooms[room_id];
+            let nicks = r.set_hedgehogs_number(number);
+
+            response.extend(
+                nicks
+                    .into_iter()
+                    .map(|n| HedgehogsNumber(n, number).send_all().in_room(room_id)),
+            );
+        }
+    }
+}
+
+fn add_vote(room: &mut HwRoom, response: &mut Response, vote: Vote) -> Option<bool> {
+    let client_id = response.client_id;
+    let mut result = None;
+
+    if let Some(ref mut voting) = room.voting {
+        if vote.is_forced || voting.votes.iter().all(|(id, _)| client_id != *id) {
+            response.add(server_chat("Your vote has been counted.".to_string()).send_self());
+            voting.votes.push((client_id, vote.is_pro));
+            let i = voting.votes.iter();
+            let pro = i.clone().filter(|(_, v)| *v).count();
+            let contra = i.filter(|(_, v)| !*v).count();
+            let success_quota = voting.voters.len() / 2 + 1;
+            if vote.is_forced && vote.is_pro || pro >= success_quota {
+                result = Some(true);
+            } else if vote.is_forced && !vote.is_pro || contra > voting.voters.len() - success_quota
+            {
+                result = Some(false);
+            }
+        } else {
+            response.add(server_chat("You already have voted.".to_string()).send_self());
+        }
+    } else {
+        response.add(server_chat("There's no voting going on.".to_string()).send_self());
+    }
+
+    result
+}
+
+pub fn submit_vote(server: &mut HwServer, vote: Vote, response: &mut Response) {
+    let client_id = response.client_id;
+    let client = &server.clients[client_id];
+
+    if let Some(room_id) = client.room_id {
+        let room = &mut server.rooms[room_id];
+
+        if let Some(res) = add_vote(room, response, vote) {
+            response.add(
+                server_chat("Voting closed.".to_string())
+                    .send_all()
+                    .in_room(room.id),
+            );
+            let voting = replace(&mut room.voting, None).unwrap();
+            if res {
+                apply_voting_result(server, room_id, response, voting.kind);
+            }
+        }
+    }
+}
+
+pub fn start_game(server: &mut HwServer, room_id: RoomId, response: &mut Response) {
+    let (room_clients, room_nicks): (Vec<_>, Vec<_>) = server
+        .clients
+        .iter()
+        .map(|(id, c)| (id, c.nick.clone()))
+        .unzip();
+    let room = &mut server.rooms[room_id];
+
+    if !room.has_multiple_clans() {
+        response.add(
+            Warning("The game can't be started with less than two clans!".to_string()).send_self(),
+        );
+    } else if room.protocol_number <= 43 && room.players_number != room.ready_players_number {
+        response.add(Warning("Not all players are ready".to_string()).send_self());
+    } else if room.game_info.is_some() {
+        response.add(Warning("The game is already in progress".to_string()).send_self());
+    } else {
+        room.start_round();
+        for id in room_clients {
+            let c = &mut server.clients[id];
+            c.set_is_in_game(true);
+            c.team_indices = room.client_team_indices(c.id);
+        }
+        response.add(RunGame.send_all().in_room(room.id));
+        response.add(
+            ClientFlags(add_flags(&[Flags::InGame]), room_nicks)
+                .send_all()
+                .in_room(room.id),
+        );
+
+        let room_master = if let Some(id) = room.master_id {
+            Some(&server.clients[id])
+        } else {
+            None
+        };
+        get_room_update(None, room, room_master, response);
+    }
+}
+
+pub fn end_game(server: &mut HwServer, room_id: RoomId, response: &mut Response) {
+    let room = &mut server.rooms[room_id];
+    room.ready_players_number = 1;
+    let room_master = if let Some(id) = room.master_id {
+        Some(&server.clients[id])
+    } else {
+        None
+    };
+    get_room_update(None, room, room_master, response);
+    response.add(RoundFinished.send_all().in_room(room_id));
+
+    if let Some(info) = replace(&mut room.game_info, None) {
+        for (_, client) in server.clients.iter() {
+            if client.room_id == Some(room_id) && client.is_joined_mid_game() {
+                super::common::get_room_config(room, client.id, response);
+                response.extend(
+                    info.left_teams
+                        .iter()
+                        .map(|name| TeamRemove(name.clone()).send(client.id)),
+                );
+            }
+        }
+    }
+
+    let nicks: Vec<_> = server
+        .clients
+        .iter_mut()
+        .filter(|(_, c)| c.room_id == Some(room_id))
+        .map(|(_, c)| {
+            c.set_is_ready(c.is_master());
+            c.set_is_joined_mid_game(false);
+            c
+        })
+        .filter_map(|c| {
+            if !c.is_master() {
+                Some(c.nick.clone())
+            } else {
+                None
+            }
+        })
+        .collect();
+
+    if !nicks.is_empty() {
+        let msg = if room.protocol_number < 38 {
+            LegacyReady(false, nicks)
+        } else {
+            ClientFlags(remove_flags(&[Flags::Ready]), nicks)
+        };
+        response.add(msg.send_all().in_room(room_id));
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use crate::handlers::actions::PendingMessage;
+    use crate::protocol::messages::HwServerMessage::ChatMsg;
+
+    fn reply2string(r: HwServerMessage) -> String {
+        match r {
+            ChatMsg { msg: p, .. } => String::from(p),
+            _ => panic!("expected a ChatMsg"),
+        }
+    }
+
+    fn run_handle_test(opts: Vec<String>) {
+        let opts2 = opts.clone();
+        for opt in opts {
+            while reply2string(rnd_reply(&opts2)) != opt {}
+        }
+    }
+
+    /// This test terminates almost surely.
+    #[test]
+    fn test_handle_rnd_empty() {
+        run_handle_test(vec![])
+    }
+
+    /// This test terminates almost surely.
+    #[test]
+    fn test_handle_rnd_nonempty() {
+        run_handle_test(vec!["A".to_owned(), "B".to_owned(), "C".to_owned()])
+    }
+
+    /// This test terminates almost surely (strong law of large numbers)
+    #[test]
+    fn test_distribution() {
+        let eps = 0.000001;
+        let lim = 0.5;
+        let opts = vec![0.to_string(), 1.to_string()];
+        let mut ones = 0;
+        let mut tries = 0;
+
+        while tries < 1000 || ((ones as f64 / tries as f64) - lim).abs() >= eps {
+            tries += 1;
+            if reply2string(rnd_reply(&opts)) == 1.to_string() {
+                ones += 1;
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hedgewars-server/src/handlers/inanteroom.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,147 @@
+use mio;
+
+use crate::{
+    core::{
+        client::HwClient,
+        server::{HwAnteClient, HwAnteroom, HwServer},
+        types::ClientId,
+    },
+    protocol::messages::{HwProtocolMessage, HwProtocolMessage::LoadRoom, HwServerMessage::*},
+    utils::is_name_illegal,
+};
+
+use log::*;
+#[cfg(feature = "official-server")]
+use openssl::sha::sha1;
+use std::{
+    fmt::{Formatter, LowerHex},
+    num::NonZeroU16,
+};
+
+pub enum LoginResult {
+    Unchanged,
+    Complete,
+    Exit,
+}
+
+fn completion_result<'a, I>(
+    mut other_clients: I,
+    client: &mut HwAnteClient,
+    response: &mut super::Response,
+) -> LoginResult
+where
+    I: Iterator<Item = (ClientId, &'a HwClient)>,
+{
+    let has_nick_clash =
+        other_clients.any(|(_, c)| !c.is_checker() && c.nick == *client.nick.as_ref().unwrap());
+
+    if has_nick_clash {
+        if client.protocol_number.unwrap().get() < 38 {
+            response.add(Bye("User quit: Nickname is already in use".to_string()).send_self());
+            LoginResult::Exit
+        } else {
+            client.nick = None;
+            response.add(Notice("NickAlreadyInUse".to_string()).send_self());
+            LoginResult::Unchanged
+        }
+    } else {
+        #[cfg(feature = "official-server")]
+        {
+            response.request_io(super::IoTask::CheckRegistered {
+                nick: client.nick.as_ref().unwrap().clone(),
+            });
+            LoginResult::Unchanged
+        }
+
+        #[cfg(not(feature = "official-server"))]
+        {
+            LoginResult::Complete
+        }
+    }
+}
+
+pub fn handle(
+    server: &mut HwServer,
+    client_id: ClientId,
+    response: &mut super::Response,
+    message: HwProtocolMessage,
+) -> LoginResult {
+    match message {
+        HwProtocolMessage::Quit(_) => {
+            response.add(Bye("User quit".to_string()).send_self());
+            LoginResult::Exit
+        }
+        HwProtocolMessage::Nick(nick) => {
+            let client = &mut server.anteroom.clients[client_id];
+
+            if client.nick.is_some() {
+                response.add(Error("Nickname already provided.".to_string()).send_self());
+                LoginResult::Unchanged
+            } else if is_name_illegal(&nick) {
+                response.add(Bye("Illegal nickname! Nicknames must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}".to_string()).send_self());
+                LoginResult::Exit
+            } else {
+                client.nick = Some(nick.clone());
+                response.add(Nick(nick).send_self());
+
+                if client.protocol_number.is_some() {
+                    completion_result(server.clients.iter(), client, response)
+                } else {
+                    LoginResult::Unchanged
+                }
+            }
+        }
+        HwProtocolMessage::Proto(proto) => {
+            let client = &mut server.anteroom.clients[client_id];
+            if client.protocol_number.is_some() {
+                response.add(Error("Protocol already known.".to_string()).send_self());
+                LoginResult::Unchanged
+            } else if proto == 0 {
+                response.add(Error("Bad number.".to_string()).send_self());
+                LoginResult::Unchanged
+            } else {
+                client.protocol_number = NonZeroU16::new(proto);
+                response.add(Proto(proto).send_self());
+
+                if client.nick.is_some() {
+                    completion_result(server.clients.iter(), client, response)
+                } else {
+                    LoginResult::Unchanged
+                }
+            }
+        }
+        #[cfg(feature = "official-server")]
+        HwProtocolMessage::Password(hash, salt) => {
+            let client = &server.anteroom.clients[client_id];
+
+            if let (Some(nick), Some(protocol)) = (client.nick.as_ref(), client.protocol_number) {
+                response.request_io(super::IoTask::GetAccount {
+                    nick: nick.clone(),
+                    protocol: protocol.get(),
+                    server_salt: client.server_salt.clone(),
+                    client_salt: salt,
+                    password_hash: hash,
+                });
+            };
+
+            LoginResult::Unchanged
+        }
+        #[cfg(feature = "official-server")]
+        HwProtocolMessage::Checker(protocol, nick, password) => {
+            let client = &mut server.anteroom.clients[client_id];
+            if protocol == 0 {
+                response.add(Error("Bad number.".to_string()).send_self());
+                LoginResult::Unchanged
+            } else {
+                client.protocol_number = NonZeroU16::new(protocol);
+                client.nick = Some(nick);
+                client.is_checker = true;
+                LoginResult::Complete
+            }
+        }
+        _ => {
+            warn!("Incorrect command in logging-in state");
+            LoginResult::Unchanged
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hedgewars-server/src/handlers/inlobby.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,164 @@
+use mio;
+
+use super::common::rnd_reply;
+use crate::{
+    core::{
+        client::HwClient,
+        server::HwServer,
+        types::{ClientId, ServerVar},
+    },
+    protocol::messages::{
+        add_flags, remove_flags, server_chat, HwProtocolMessage, HwServerMessage::*,
+        ProtocolFlags as Flags,
+    },
+    utils::is_name_illegal,
+};
+use log::*;
+use std::{collections::HashSet, convert::identity};
+
+pub fn handle(
+    server: &mut HwServer,
+    client_id: ClientId,
+    response: &mut super::Response,
+    message: HwProtocolMessage,
+) {
+    use crate::protocol::messages::HwProtocolMessage::*;
+    match message {
+        CreateRoom(name, password) => {
+            if is_name_illegal(&name) {
+                response.add(Warning("Illegal room name! A room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}".to_string()).send_self());
+            } else if server.has_room(&name) {
+                response.add(
+                    Warning("A room with the same name already exists.".to_string()).send_self(),
+                );
+            } else {
+                let flags_msg = ClientFlags(
+                    add_flags(&[Flags::RoomMaster, Flags::Ready]),
+                    vec![server.clients[client_id].nick.clone()],
+                );
+
+                let room_id = server.create_room(client_id, name, password);
+                let room = &server.rooms[room_id];
+                let client = &server.clients[client_id];
+
+                response.add(
+                    RoomAdd(room.info(Some(&client)))
+                        .send_all()
+                        .with_protocol(room.protocol_number),
+                );
+                response.add(RoomJoined(vec![client.nick.clone()]).send_self());
+                response.add(flags_msg.send_self());
+
+                response.add(
+                    ClientFlags(add_flags(&[Flags::InRoom]), vec![client.nick.clone()]).send_self(),
+                );
+            };
+        }
+        Chat(msg) => {
+            response.add(
+                ChatMsg {
+                    nick: server.clients[client_id].nick.clone(),
+                    msg,
+                }
+                .send_all()
+                .in_lobby()
+                .but_self(),
+            );
+        }
+        JoinRoom(name, _password) => {
+            let room = server.rooms.iter().find(|(_, r)| r.name == name);
+            let room_id = room.map(|(_, r)| r.id);
+
+            let client = &mut server.clients[client_id];
+
+            if let Some((_, room)) = room {
+                if client.protocol_number != room.protocol_number {
+                    response.add(
+                        Warning("Room version incompatible to your Hedgewars version!".to_string())
+                            .send_self(),
+                    );
+                } else if room.is_join_restricted() {
+                    response.add(
+                        Warning(
+                            "Access denied. This room currently doesn't allow joining.".to_string(),
+                        )
+                        .send_self(),
+                    );
+                } else if room.players_number == u8::max_value() {
+                    response.add(Warning("This room is already full".to_string()).send_self());
+                } else if let Some(room_id) = room_id {
+                    super::common::enter_room(server, client_id, room_id, response);
+                }
+            } else {
+                response.add(Warning("No such room.".to_string()).send_self());
+            }
+        }
+        Follow(nick) => {
+            if let Some(HwClient {
+                room_id: Some(room_id),
+                ..
+            }) = server.find_client(&nick)
+            {
+                let room = &server.rooms[*room_id];
+                response.add(Joining(room.name.clone()).send_self());
+                super::common::enter_room(server, client_id, *room_id, response);
+            }
+        }
+        SetServerVar(var) => {
+            if !server.clients[client_id].is_admin() {
+                response.add(Warning("Access denied.".to_string()).send_self());
+            } else {
+                match var {
+                    ServerVar::MOTDNew(msg) => server.greetings.for_latest_protocol = msg,
+                    ServerVar::MOTDOld(msg) => server.greetings.for_old_protocols = msg,
+                    ServerVar::LatestProto(n) => server.latest_protocol = n,
+                }
+            }
+        }
+        GetServerVar => {
+            if !server.clients[client_id].is_admin() {
+                response.add(Warning("Access denied.".to_string()).send_self());
+            } else {
+                let vars: Vec<_> = [
+                    ServerVar::MOTDNew(server.greetings.for_latest_protocol.clone()),
+                    ServerVar::MOTDOld(server.greetings.for_old_protocols.clone()),
+                    ServerVar::LatestProto(server.latest_protocol),
+                ]
+                .iter()
+                .flat_map(|v| v.to_protocol())
+                .collect();
+                response.add(ServerVars(vars).send_self());
+            }
+        }
+        Rnd(v) => {
+            response.add(rnd_reply(&v).send_self());
+        }
+        Stats => {
+            let mut protocols: HashSet<_> = server
+                .clients
+                .iter()
+                .map(|(_, c)| c.protocol_number)
+                .chain(server.rooms.iter().map(|(_, r)| r.protocol_number))
+                .collect();
+            let mut protocols: Vec<_> = protocols.drain().collect();
+            protocols.sort();
+
+            let mut html = Vec::with_capacity(protocols.len() + 2);
+
+            html.push("<table>".to_string());
+            for protocol in protocols {
+                html.push(format!(
+                    "<tr><td>{}</td><td>{}</td><td>{}</td></tr>",
+                    super::utils::protocol_version_string(protocol),
+                    server.protocol_clients(protocol).count(),
+                    server.protocol_rooms(protocol).count()
+                ));
+            }
+            html.push("</table>".to_string());
+
+            response.add(Warning(html.join("")).send_self());
+        }
+        List => warn!("Deprecated LIST message received"),
+        _ => warn!("Incorrect command in lobby state"),
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hedgewars-server/src/handlers/inroom.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,615 @@
+use mio;
+
+use super::common::rnd_reply;
+use crate::utils::to_engine_msg;
+use crate::{
+    core::{
+        room::{HwRoom, RoomFlags, MAX_TEAMS_IN_ROOM},
+        server::HwServer,
+        types,
+        types::{ClientId, GameCfg, RoomId, VoteType, Voting, MAX_HEDGEHOGS_PER_TEAM},
+    },
+    protocol::messages::{
+        add_flags, remove_flags, server_chat, HwProtocolMessage, HwServerMessage::*,
+        ProtocolFlags as Flags,
+    },
+    utils::is_name_illegal,
+};
+use base64::{decode, encode};
+use log::*;
+use std::{cmp::min, iter::once, mem::swap};
+
+#[derive(Clone)]
+struct ByMsg<'a> {
+    messages: &'a [u8],
+}
+
+impl<'a> Iterator for ByMsg<'a> {
+    type Item = &'a [u8];
+
+    fn next(&mut self) -> Option<<Self as Iterator>::Item> {
+        if let Some(size) = self.messages.get(0) {
+            let (msg, next) = self.messages.split_at(*size as usize + 1);
+            self.messages = next;
+            Some(msg)
+        } else {
+            None
+        }
+    }
+}
+
+fn by_msg(source: &[u8]) -> ByMsg {
+    ByMsg { messages: source }
+}
+
+const VALID_MESSAGES: &[u8] =
+    b"M#+LlRrUuDdZzAaSjJ,NpPwtgfhbc12345\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A";
+const NON_TIMED_MESSAGES: &[u8] = b"M#hb";
+
+#[cfg(canhazslicepatterns)]
+fn is_msg_valid(msg: &[u8], team_indices: &[u8]) -> bool {
+    match msg {
+        [size, typ, body..MAX] => {
+            VALID_MESSAGES.contains(typ)
+                && match body {
+                    [1...MAX_HEDGEHOGS_PER_TEAM, team, ..] if *typ == b'h' => {
+                        team_indices.contains(team)
+                    }
+                    _ => *typ != b'h',
+                }
+        }
+        _ => false,
+    }
+}
+
+fn is_msg_valid(msg: &[u8], _team_indices: &[u8]) -> bool {
+    if let Some(typ) = msg.get(1) {
+        VALID_MESSAGES.contains(typ)
+    } else {
+        false
+    }
+}
+
+fn is_msg_empty(msg: &[u8]) -> bool {
+    msg.get(1).filter(|t| **t == b'+').is_some()
+}
+
+fn is_msg_timed(msg: &[u8]) -> bool {
+    msg.get(1)
+        .filter(|t| !NON_TIMED_MESSAGES.contains(t))
+        .is_some()
+}
+
+fn voting_description(kind: &VoteType) -> String {
+    format!(
+        "New voting started: {}",
+        match kind {
+            VoteType::Kick(nick) => format!("kick {}", nick),
+            VoteType::Map(name) => format!("map {}", name.as_ref().unwrap()),
+            VoteType::Pause => "pause".to_string(),
+            VoteType::NewSeed => "new seed".to_string(),
+            VoteType::HedgehogsPerTeam(number) => format!("hedgehogs per team: {}", number),
+        }
+    )
+}
+
+fn room_message_flag(msg: &HwProtocolMessage) -> RoomFlags {
+    use crate::protocol::messages::HwProtocolMessage::*;
+    match msg {
+        ToggleRestrictJoin => RoomFlags::RESTRICTED_JOIN,
+        ToggleRestrictTeams => RoomFlags::RESTRICTED_TEAM_ADD,
+        ToggleRegisteredOnly => RoomFlags::RESTRICTED_UNREGISTERED_PLAYERS,
+        _ => RoomFlags::empty(),
+    }
+}
+
+pub fn handle(
+    server: &mut HwServer,
+    client_id: ClientId,
+    response: &mut super::Response,
+    room_id: RoomId,
+    message: HwProtocolMessage,
+) {
+    let client = &mut server.clients[client_id];
+    let room = &mut server.rooms[room_id];
+
+    use crate::protocol::messages::HwProtocolMessage::*;
+    match message {
+        Part(msg) => {
+            let msg = match msg {
+                Some(s) => format!("part: {}", s),
+                None => "part".to_string(),
+            };
+            super::common::exit_room(server, client_id, response, &msg);
+        }
+        Chat(msg) => {
+            response.add(
+                ChatMsg {
+                    nick: client.nick.clone(),
+                    msg,
+                }
+                .send_all()
+                .in_room(room_id),
+            );
+        }
+        TeamChat(msg) => {
+            let room = &server.rooms[room_id];
+            if let Some(ref info) = room.game_info {
+                if let Some(clan_color) = room.find_team_color(client_id) {
+                    let client = &server.clients[client_id];
+                    let engine_msg =
+                        to_engine_msg(format!("b{}]{}\x20\x20", client.nick, msg).bytes());
+                    let team = room.clan_team_owners(clan_color).collect();
+                    response.add(ForwardEngineMessage(vec![engine_msg]).send_many(team))
+                }
+            }
+        }
+        Fix => {
+            if client.is_admin() {
+                room.set_is_fixed(true);
+                room.set_join_restriction(false);
+                room.set_team_add_restriction(false);
+                room.set_unregistered_players_restriction(true);
+            }
+        }
+        Unfix => {
+            if client.is_admin() {
+                room.set_is_fixed(false);
+            }
+        }
+        Greeting(text) => {
+            if client.is_admin() || client.is_master() && !room.is_fixed() {
+                room.greeting = text.unwrap_or(String::new());
+            }
+        }
+        MaxTeams(count) => {
+            if !client.is_master() {
+                response.add(Warning("You're not the room master!".to_string()).send_self());
+            } else if !(2..=MAX_TEAMS_IN_ROOM).contains(&count) {
+                response
+                    .add(Warning("/maxteams: specify number from 2 to 8".to_string()).send_self());
+            } else {
+                server.rooms[room_id].max_teams = count;
+            }
+        }
+        RoomName(new_name) => {
+            if is_name_illegal(&new_name) {
+                response.add(Warning("Illegal room name! A room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}".to_string()).send_self());
+            } else if server.has_room(&new_name) {
+                response.add(
+                    Warning("A room with the same name already exists.".to_string()).send_self(),
+                );
+            } else {
+                let room = &mut server.rooms[room_id];
+                if room.is_fixed() || room.master_id != Some(client_id) {
+                    response.add(Warning("Access denied.".to_string()).send_self());
+                } else {
+                    let mut old_name = new_name.clone();
+                    let client = &server.clients[client_id];
+                    swap(&mut room.name, &mut old_name);
+                    super::common::get_room_update(Some(old_name), room, Some(&client), response);
+                }
+            }
+        }
+        ToggleReady => {
+            let flags = if client.is_ready() {
+                room.ready_players_number -= 1;
+                remove_flags(&[Flags::Ready])
+            } else {
+                room.ready_players_number += 1;
+                add_flags(&[Flags::Ready])
+            };
+
+            let msg = if client.protocol_number < 38 {
+                LegacyReady(client.is_ready(), vec![client.nick.clone()])
+            } else {
+                ClientFlags(flags, vec![client.nick.clone()])
+            };
+            response.add(msg.send_all().in_room(room.id));
+            client.set_is_ready(!client.is_ready());
+
+            if room.is_fixed() && room.ready_players_number == room.players_number {
+                super::common::start_game(server, room_id, response);
+            }
+        }
+        AddTeam(mut info) => {
+            if room.teams.len() >= room.max_teams as usize {
+                response.add(Warning("Too many teams!".to_string()).send_self());
+            } else if room.addable_hedgehogs() == 0 {
+                response.add(Warning("Too many hedgehogs!".to_string()).send_self());
+            } else if room.find_team(|t| t.name == info.name) != None {
+                response.add(
+                    Warning("There's already a team with same name in the list.".to_string())
+                        .send_self(),
+                );
+            } else if room.game_info.is_some() {
+                response.add(
+                    Warning("Joining not possible: Round is in progress.".to_string()).send_self(),
+                );
+            } else if room.is_team_add_restricted() {
+                response.add(
+                    Warning("This room currently does not allow adding new teams.".to_string())
+                        .send_self(),
+                );
+            } else {
+                info.owner = client.nick.clone();
+                let team = room.add_team(client.id, *info, client.protocol_number < 42);
+                client.teams_in_game += 1;
+                client.clan = Some(team.color);
+                response.add(TeamAccepted(team.name.clone()).send_self());
+                response.add(
+                    TeamAdd(team.to_protocol())
+                        .send_all()
+                        .in_room(room_id)
+                        .but_self(),
+                );
+                response.add(
+                    TeamColor(team.name.clone(), team.color)
+                        .send_all()
+                        .in_room(room_id),
+                );
+                response.add(
+                    HedgehogsNumber(team.name.clone(), team.hedgehogs_number)
+                        .send_all()
+                        .in_room(room_id),
+                );
+
+                let room_master = if let Some(id) = room.master_id {
+                    Some(&server.clients[id])
+                } else {
+                    None
+                };
+                super::common::get_room_update(None, room, room_master, response);
+            }
+        }
+        RemoveTeam(name) => match room.find_team_owner(&name) {
+            None => response.add(
+                Warning("Error: The team you tried to remove does not exist.".to_string())
+                    .send_self(),
+            ),
+            Some((id, _)) if id != client_id => response
+                .add(Warning("You can't remove a team you don't own.".to_string()).send_self()),
+            Some((_, name)) => {
+                client.teams_in_game -= 1;
+                client.clan = room.find_team_color(client.id);
+                super::common::remove_teams(
+                    room,
+                    vec![name.to_string()],
+                    client.is_in_game(),
+                    response,
+                );
+
+                match room.game_info {
+                    Some(ref info) if info.teams_in_game == 0 => {
+                        super::common::end_game(server, room_id, response)
+                    }
+                    _ => (),
+                }
+            }
+        },
+        SetHedgehogsNumber(team_name, number) => {
+            let addable_hedgehogs = room.addable_hedgehogs();
+            if let Some((_, team)) = room.find_team_and_owner_mut(|t| t.name == team_name) {
+                let max_hedgehogs = min(
+                    MAX_HEDGEHOGS_PER_TEAM,
+                    addable_hedgehogs + team.hedgehogs_number,
+                );
+                if !client.is_master() {
+                    response.add(Error("You're not the room master!".to_string()).send_self());
+                } else if !(1..=max_hedgehogs).contains(&number) {
+                    response
+                        .add(HedgehogsNumber(team.name.clone(), team.hedgehogs_number).send_self());
+                } else {
+                    team.hedgehogs_number = number;
+                    response.add(
+                        HedgehogsNumber(team.name.clone(), number)
+                            .send_all()
+                            .in_room(room_id)
+                            .but_self(),
+                    );
+                }
+            } else {
+                response.add(Warning("No such team.".to_string()).send_self());
+            }
+        }
+        SetTeamColor(team_name, color) => {
+            if let Some((owner, team)) = room.find_team_and_owner_mut(|t| t.name == team_name) {
+                if !client.is_master() {
+                    response.add(Error("You're not the room master!".to_string()).send_self());
+                } else {
+                    team.color = color;
+                    response.add(
+                        TeamColor(team.name.clone(), color)
+                            .send_all()
+                            .in_room(room_id)
+                            .but_self(),
+                    );
+                    server.clients[owner].clan = Some(color);
+                }
+            } else {
+                response.add(Warning("No such team.".to_string()).send_self());
+            }
+        }
+        Cfg(cfg) => {
+            if room.is_fixed() {
+                response.add(Warning("Access denied.".to_string()).send_self());
+            } else if !client.is_master() {
+                response.add(Error("You're not the room master!".to_string()).send_self());
+            } else {
+                let cfg = match cfg {
+                    GameCfg::Scheme(name, mut values) => {
+                        if client.protocol_number == 49 && values.len() >= 2 {
+                            let mut s = "X".repeat(50);
+                            s.push_str(&values.pop().unwrap());
+                            values.push(s);
+                        }
+                        GameCfg::Scheme(name, values)
+                    }
+                    cfg => cfg,
+                };
+
+                response.add(cfg.to_server_msg().send_all().in_room(room.id).but_self());
+                room.set_config(cfg);
+            }
+        }
+        Save(name, location) => {
+            response.add(
+                server_chat(format!("Room config saved as {}", name))
+                    .send_all()
+                    .in_room(room_id),
+            );
+            room.save_config(name, location);
+        }
+        #[cfg(feature = "official-server")]
+        SaveRoom(filename) => {
+            if client.is_admin() {
+                match room.get_saves() {
+                    Ok(contents) => response.request_io(super::IoTask::SaveRoom {
+                        room_id,
+                        filename,
+                        contents,
+                    }),
+                    Err(e) => {
+                        warn!("Error while serializing the room configs: {}", e);
+                        response.add(
+                            Warning("Unable to serialize the room configs.".to_string())
+                                .send_self(),
+                        )
+                    }
+                }
+            }
+        }
+        #[cfg(feature = "official-server")]
+        LoadRoom(filename) => {
+            if client.is_admin() {
+                response.request_io(super::IoTask::LoadRoom { room_id, filename });
+            }
+        }
+        Delete(name) => {
+            if !room.delete_config(&name) {
+                response.add(Warning(format!("Save doesn't exist: {}", name)).send_self());
+            } else {
+                response.add(
+                    server_chat(format!("Room config {} has been deleted", name))
+                        .send_all()
+                        .in_room(room_id),
+                );
+            }
+        }
+        CallVote(None) => {
+            response.add(server_chat("Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs <number>".to_string())
+                .send_self());
+        }
+        CallVote(Some(kind)) => {
+            let is_in_game = room.game_info.is_some();
+            let error = match &kind {
+                VoteType::Kick(nick) => {
+                    if server
+                        .find_client(&nick)
+                        .filter(|c| c.room_id == Some(room_id))
+                        .is_some()
+                    {
+                        None
+                    } else {
+                        Some("/callvote kick: No such user!".to_string())
+                    }
+                }
+                VoteType::Map(None) => {
+                    let names: Vec<_> = server.rooms[room_id].saves.keys().cloned().collect();
+                    if names.is_empty() {
+                        Some("/callvote map: No maps saved in this room!".to_string())
+                    } else {
+                        Some(format!("Available maps: {}", names.join(", ")))
+                    }
+                }
+                VoteType::Map(Some(name)) => {
+                    if room.saves.get(&name[..]).is_some() {
+                        None
+                    } else {
+                        Some("/callvote map: No such map!".to_string())
+                    }
+                }
+                VoteType::Pause => {
+                    if is_in_game {
+                        None
+                    } else {
+                        Some("/callvote pause: No game in progress!".to_string())
+                    }
+                }
+                VoteType::NewSeed => None,
+                VoteType::HedgehogsPerTeam(number) => match number {
+                    1...MAX_HEDGEHOGS_PER_TEAM => None,
+                    _ => Some("/callvote hedgehogs: Specify number from 1 to 8.".to_string()),
+                },
+            };
+
+            match error {
+                None => {
+                    let msg = voting_description(&kind);
+                    let voting = Voting::new(kind, server.room_clients(client_id).collect());
+                    let room = &mut server.rooms[room_id];
+                    room.voting = Some(voting);
+                    response.add(server_chat(msg).send_all().in_room(room_id));
+                    super::common::submit_vote(
+                        server,
+                        types::Vote {
+                            is_pro: true,
+                            is_forced: false,
+                        },
+                        response,
+                    );
+                }
+                Some(msg) => {
+                    response.add(server_chat(msg).send_self());
+                }
+            }
+        }
+        Vote(vote) => {
+            super::common::submit_vote(
+                server,
+                types::Vote {
+                    is_pro: vote,
+                    is_forced: false,
+                },
+                response,
+            );
+        }
+        ForceVote(vote) => {
+            let is_forced = client.is_admin();
+            super::common::submit_vote(
+                server,
+                types::Vote {
+                    is_pro: vote,
+                    is_forced,
+                },
+                response,
+            );
+        }
+        ToggleRestrictJoin | ToggleRestrictTeams | ToggleRegisteredOnly => {
+            if client.is_master() {
+                room.flags.toggle(room_message_flag(&message));
+                super::common::get_room_update(None, room, Some(&client), response);
+            }
+        }
+        StartGame => {
+            super::common::start_game(server, room_id, response);
+        }
+        EngineMessage(em) => {
+            if client.teams_in_game > 0 {
+                let decoding = decode(&em[..]).unwrap();
+                let messages = by_msg(&decoding);
+                let valid = messages.filter(|m| is_msg_valid(m, &client.team_indices));
+                let non_empty = valid.clone().filter(|m| !is_msg_empty(m));
+                let sync_msg = valid.clone().filter(|m| is_msg_timed(m)).last().map(|m| {
+                    if is_msg_empty(m) {
+                        Some(encode(m))
+                    } else {
+                        None
+                    }
+                });
+
+                let em_response = encode(&valid.flat_map(|msg| msg).cloned().collect::<Vec<_>>());
+                if !em_response.is_empty() {
+                    response.add(
+                        ForwardEngineMessage(vec![em_response])
+                            .send_all()
+                            .in_room(room.id)
+                            .but_self(),
+                    );
+                }
+                let em_log = encode(&non_empty.flat_map(|msg| msg).cloned().collect::<Vec<_>>());
+                if let Some(ref mut info) = room.game_info {
+                    if !em_log.is_empty() {
+                        info.msg_log.push(em_log);
+                    }
+                    if let Some(msg) = sync_msg {
+                        info.sync_msg = msg;
+                    }
+                }
+            }
+        }
+        RoundFinished => {
+            let mut game_ended = false;
+            if client.is_in_game() {
+                client.set_is_in_game(false);
+                response.add(
+                    ClientFlags(remove_flags(&[Flags::InGame]), vec![client.nick.clone()])
+                        .send_all()
+                        .in_room(room.id),
+                );
+                let team_names: Vec<_> = room
+                    .client_teams(client_id)
+                    .map(|t| t.name.clone())
+                    .collect();
+
+                if let Some(ref mut info) = room.game_info {
+                    info.teams_in_game -= team_names.len() as u8;
+                    if info.teams_in_game == 0 {
+                        game_ended = true;
+                    }
+
+                    for team_name in team_names {
+                        let msg = once(b'F').chain(team_name.bytes());
+                        response.add(
+                            ForwardEngineMessage(vec![to_engine_msg(msg)])
+                                .send_all()
+                                .in_room(room_id)
+                                .but_self(),
+                        );
+
+                        let remove_msg = to_engine_msg(once(b'F').chain(team_name.bytes()));
+                        if let Some(m) = &info.sync_msg {
+                            info.msg_log.push(m.clone());
+                        }
+                        if info.sync_msg.is_some() {
+                            info.sync_msg = None
+                        }
+                        info.msg_log.push(remove_msg.clone());
+                        response.add(
+                            ForwardEngineMessage(vec![remove_msg])
+                                .send_all()
+                                .in_room(room_id)
+                                .but_self(),
+                        );
+                    }
+                }
+            }
+            if game_ended {
+                super::common::end_game(server, room_id, response)
+            }
+        }
+        Rnd(v) => {
+            let result = rnd_reply(&v);
+            let mut echo = vec!["/rnd".to_string()];
+            echo.extend(v.into_iter());
+            let chat_msg = ChatMsg {
+                nick: server.clients[client_id].nick.clone(),
+                msg: echo.join(" "),
+            };
+            response.add(chat_msg.send_all().in_room(room_id));
+            response.add(result.send_all().in_room(room_id));
+        }
+        Delegate(nick) => {
+            let delegate_id = server.find_client(&nick).map(|c| (c.id, c.room_id));
+            let client = &server.clients[client_id];
+            if !(client.is_admin() || client.is_master()) {
+                response.add(
+                    Warning("You're not the room master or a server admin!".to_string())
+                        .send_self(),
+                )
+            } else {
+                match delegate_id {
+                    None => response.add(Warning("Player is not online.".to_string()).send_self()),
+                    Some((id, _)) if id == client_id => response
+                        .add(Warning("You're already the room master.".to_string()).send_self()),
+                    Some((_, id)) if id != Some(room_id) => response
+                        .add(Warning("The player is not in your room.".to_string()).send_self()),
+                    Some((id, _)) => {
+                        super::common::change_master(server, room_id, id, response);
+                    }
+                }
+            }
+        }
+        _ => warn!("Unimplemented!"),
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hedgewars-server/src/main.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,114 @@
+#![allow(unused_imports)]
+#![deny(bare_trait_objects)]
+
+use getopts::Options;
+use log::*;
+use mio::{net::*, *};
+use std::{env, str::FromStr as _, time::Duration};
+
+mod core;
+mod handlers;
+mod protocol;
+mod server;
+mod utils;
+
+use crate::server::network::{NetworkLayer, NetworkLayerBuilder};
+
+const PROGRAM_NAME: &'_ str = "Hedgewars Game Server";
+
+fn main() {
+    env_logger::init();
+
+    info!("Hedgewars game server, protocol {}", utils::SERVER_VERSION);
+
+    let args: Vec<String> = env::args().collect();
+    let mut opts = Options::new();
+
+    opts.optopt("p", "port", "port - defaults to 46631", "PORT");
+    opts.optflag("h", "help", "help");
+    let matches = match opts.parse(&args[1..]) {
+        Ok(m) => m,
+        Err(e) => {
+            println!("{}\n{}", e, opts.short_usage(""));
+            return;
+        }
+    };
+    if matches.opt_present("h") {
+        println!("{}", opts.usage(PROGRAM_NAME));
+        return;
+    }
+
+    let port = matches
+        .opt_str("p")
+        .and_then(|s| u16::from_str(&s).ok())
+        .unwrap_or(46631);
+    let address = format!("0.0.0.0:{}", port).parse().unwrap();
+
+    let listener = TcpListener::bind(&address).unwrap();
+
+    let poll = Poll::new().unwrap();
+    let mut hw_builder = NetworkLayerBuilder::default().with_listener(listener);
+
+    #[cfg(feature = "tls-connections")]
+    {
+        let address = format!("0.0.0.0:{}", port + 1).parse().unwrap();
+        hw_builder = hw_builder.with_secure_listener(TcpListener::bind(&address).unwrap());
+    }
+
+    let mut hw_network = hw_builder.build();
+    hw_network.register(&poll).unwrap();
+
+    let mut events = Events::with_capacity(1024);
+
+    loop {
+        let timeout = if hw_network.has_pending_operations() {
+            Some(Duration::from_millis(1))
+        } else {
+            None
+        };
+        poll.poll(&mut events, timeout).unwrap();
+
+        for event in events.iter() {
+            if event.readiness() & Ready::readable() == Ready::readable() {
+                match event.token() {
+                    token @ utils::SERVER_TOKEN | token @ utils::SECURE_SERVER_TOKEN => {
+                        match hw_network.accept_client(&poll, token) {
+                            Ok(()) => (),
+                            Err(e) => debug!("Error accepting client: {}", e),
+                        }
+                    }
+                    utils::TIMER_TOKEN => match hw_network.handle_timeout(&poll) {
+                        Ok(()) => (),
+                        Err(e) => debug!("Error in timer event: {}", e),
+                    },
+                    #[cfg(feature = "official-server")]
+                    utils::IO_TOKEN => match hw_network.handle_io_result(&poll) {
+                        Ok(()) => (),
+                        Err(e) => debug!("Error in IO task: {}", e),
+                    },
+                    Token(token) => match hw_network.client_readable(&poll, token) {
+                        Ok(()) => (),
+                        Err(e) => debug!("Error reading from client socket {}: {}", token, e),
+                    },
+                }
+            }
+            if event.readiness() & Ready::writable() == Ready::writable() {
+                match event.token() {
+                    utils::SERVER_TOKEN
+                    | utils::SECURE_SERVER_TOKEN
+                    | utils::TIMER_TOKEN
+                    | utils::IO_TOKEN => unreachable!(),
+                    Token(token) => match hw_network.client_writable(&poll, token) {
+                        Ok(()) => (),
+                        Err(e) => debug!("Error writing to client socket {}: {}", token, e),
+                    },
+                }
+            }
+        }
+
+        match hw_network.on_idle(&poll) {
+            Ok(()) => (),
+            Err(e) => debug!("Error in idle handler: {}", e),
+        };
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hedgewars-server/src/protocol.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,67 @@
+use self::parser::message;
+use log::*;
+use netbuf;
+use std::io::{Read, Result};
+
+pub mod messages;
+mod parser;
+#[cfg(test)]
+pub mod test;
+
+pub struct ProtocolDecoder {
+    buf: netbuf::Buf,
+    is_recovering: bool,
+}
+
+impl ProtocolDecoder {
+    pub fn new() -> ProtocolDecoder {
+        ProtocolDecoder {
+            buf: netbuf::Buf::new(),
+            is_recovering: false,
+        }
+    }
+
+    fn recover(&mut self) -> bool {
+        self.is_recovering = match parser::malformed_message(&self.buf[..]) {
+            Ok((tail, ())) => {
+                self.buf.consume(self.buf.len() - tail.len());
+                false
+            }
+            _ => {
+                self.buf.consume(self.buf.len());
+                true
+            }
+        };
+        !self.is_recovering
+    }
+
+    pub fn read_from<R: Read>(&mut self, stream: &mut R) -> Result<usize> {
+        let count = self.buf.read_from(stream)?;
+        if count > 0 && self.is_recovering {
+            self.recover();
+        }
+        Ok(count)
+    }
+
+    pub fn extract_messages(&mut self) -> Vec<messages::HwProtocolMessage> {
+        let mut messages = vec![];
+        if !self.is_recovering {
+            while !self.buf.is_empty() {
+                match parser::message(&self.buf[..]) {
+                    Ok((tail, message)) => {
+                        messages.push(message);
+                        self.buf.consume(self.buf.len() - tail.len());
+                    }
+                    Err(nom::Err::Incomplete(_)) => break,
+                    Err(nom::Err::Failure(e)) | Err(nom::Err::Error(e)) => {
+                        debug!("Invalid message: {:?}", e);
+                        if !self.recover() || self.buf.is_empty() {
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+        messages
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hedgewars-server/src/protocol/messages.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,429 @@
+use crate::core::types::{GameCfg, HedgehogInfo, ServerVar, TeamInfo, VoteType};
+use std::{convert::From, iter::once, ops};
+
+#[derive(PartialEq, Eq, Clone, Debug)]
+pub enum HwProtocolMessage {
+    // common messages
+    Ping,
+    Pong,
+    Quit(Option<String>),
+    Global(String),
+    Watch(u32),
+    ToggleServerRegisteredOnly,
+    SuperPower,
+    Info(String),
+    // anteroom messages
+    Nick(String),
+    Proto(u16),
+    Password(String, String),
+    Checker(u16, String, String),
+    // lobby messages
+    List,
+    Chat(String),
+    CreateRoom(String, Option<String>),
+    JoinRoom(String, Option<String>),
+    Follow(String),
+    Rnd(Vec<String>),
+    Kick(String),
+    Ban(String, String, u32),
+    BanIp(String, String, u32),
+    BanNick(String, String, u32),
+    BanList,
+    Unban(String),
+    SetServerVar(ServerVar),
+    GetServerVar,
+    RestartServer,
+    Stats,
+    // room messages
+    Part(Option<String>),
+    Cfg(GameCfg),
+    AddTeam(Box<TeamInfo>),
+    RemoveTeam(String),
+    SetHedgehogsNumber(String, u8),
+    SetTeamColor(String, u8),
+    ToggleReady,
+    StartGame,
+    EngineMessage(String),
+    RoundFinished,
+    ToggleRestrictJoin,
+    ToggleRestrictTeams,
+    ToggleRegisteredOnly,
+    RoomName(String),
+    Delegate(String),
+    TeamChat(String),
+    MaxTeams(u8),
+    Fix,
+    Unfix,
+    Greeting(Option<String>),
+    CallVote(Option<VoteType>),
+    Vote(bool),
+    ForceVote(bool),
+    Save(String, String),
+    Delete(String),
+    SaveRoom(String),
+    LoadRoom(String),
+}
+
+#[derive(Debug, Clone, Copy)]
+pub enum ProtocolFlags {
+    InRoom,
+    RoomMaster,
+    Ready,
+    InGame,
+    Registered,
+    Admin,
+    Contributor,
+}
+
+impl ProtocolFlags {
+    #[inline]
+    fn flag_char(&self) -> char {
+        match self {
+            ProtocolFlags::InRoom => 'i',
+            ProtocolFlags::RoomMaster => 'h',
+            ProtocolFlags::Ready => 'r',
+            ProtocolFlags::InGame => 'g',
+            ProtocolFlags::Registered => 'u',
+            ProtocolFlags::Admin => 'a',
+            ProtocolFlags::Contributor => 'c',
+        }
+    }
+
+    #[inline]
+    fn format(prefix: char, flags: &[ProtocolFlags]) -> String {
+        once(prefix)
+            .chain(flags.iter().map(|f| f.flag_char()))
+            .collect()
+    }
+}
+
+#[inline]
+pub fn add_flags(flags: &[ProtocolFlags]) -> String {
+    ProtocolFlags::format('+', flags)
+}
+
+#[inline]
+pub fn remove_flags(flags: &[ProtocolFlags]) -> String {
+    ProtocolFlags::format('-', flags)
+}
+
+#[derive(Debug)]
+pub enum HwServerMessage {
+    Connected(u32),
+    Redirect(u16),
+
+    Ping,
+    Pong,
+    Bye(String),
+
+    Nick(String),
+    Proto(u16),
+    AskPassword(String),
+    ServerAuth(String),
+
+    LobbyLeft(String, String),
+    LobbyJoined(Vec<String>),
+    ChatMsg { nick: String, msg: String },
+    ClientFlags(String, Vec<String>),
+    Rooms(Vec<String>),
+    RoomAdd(Vec<String>),
+    RoomJoined(Vec<String>),
+    RoomLeft(String, String),
+    RoomRemove(String),
+    RoomUpdated(String, Vec<String>),
+    Joining(String),
+    TeamAdd(Vec<String>),
+    TeamRemove(String),
+    TeamAccepted(String),
+    TeamColor(String, u8),
+    HedgehogsNumber(String, u8),
+    ConfigEntry(String, Vec<String>),
+    Kicked,
+    RunGame,
+    ForwardEngineMessage(Vec<String>),
+    RoundFinished,
+    ReplayStart,
+
+    Info(Vec<String>),
+    ServerMessage(String),
+    ServerVars(Vec<String>),
+    Notice(String),
+    Warning(String),
+    Error(String),
+    Unreachable,
+
+    //Deprecated messages
+    LegacyReady(bool, Vec<String>),
+}
+
+fn special_chat(nick: &str, msg: String) -> HwServerMessage {
+    HwServerMessage::ChatMsg {
+        nick: nick.to_string(),
+        msg,
+    }
+}
+
+pub fn server_chat(msg: String) -> HwServerMessage {
+    special_chat("[server]", msg)
+}
+
+pub fn global_chat(msg: String) -> HwServerMessage {
+    special_chat("(global notice)", msg)
+}
+
+impl ServerVar {
+    pub fn to_protocol(&self) -> Vec<String> {
+        use ServerVar::*;
+        match self {
+            MOTDNew(s) => vec!["MOTD_NEW".to_string(), s.clone()],
+            MOTDOld(s) => vec!["MOTD_OLD".to_string(), s.clone()],
+            LatestProto(n) => vec!["LATEST_PROTO".to_string(), n.to_string()],
+        }
+    }
+}
+
+impl VoteType {
+    pub fn to_protocol(&self) -> Vec<String> {
+        use VoteType::*;
+        match self {
+            Kick(nick) => vec!["KICK".to_string(), nick.clone()],
+            Map(None) => vec!["MAP".to_string()],
+            Map(Some(name)) => vec!["MAP".to_string(), name.clone()],
+            Pause => vec!["PAUSE".to_string()],
+            NewSeed => vec!["NEWSEED".to_string()],
+            HedgehogsPerTeam(count) => vec!["HEDGEHOGS".to_string(), count.to_string()],
+        }
+    }
+}
+
+impl GameCfg {
+    pub fn to_protocol(&self) -> (String, Vec<String>) {
+        use GameCfg::*;
+        match self {
+            FeatureSize(s) => ("FEATURE_SIZE".to_string(), vec![s.to_string()]),
+            MapType(t) => ("MAP".to_string(), vec![t.to_string()]),
+            MapGenerator(g) => ("MAPGEN".to_string(), vec![g.to_string()]),
+            MazeSize(s) => ("MAZE_SIZE".to_string(), vec![s.to_string()]),
+            Seed(s) => ("SEED".to_string(), vec![s.to_string()]),
+            Template(t) => ("TEMPLATE".to_string(), vec![t.to_string()]),
+
+            Ammo(n, None) => ("AMMO".to_string(), vec![n.to_string()]),
+            Ammo(n, Some(s)) => ("AMMO".to_string(), vec![n.to_string(), s.to_string()]),
+            Scheme(n, s) if s.is_empty() => ("SCHEME".to_string(), vec![n.to_string()]),
+            Scheme(n, s) => ("SCHEME".to_string(), {
+                let mut v = vec![n.to_string()];
+                v.extend(s.clone().into_iter());
+                v
+            }),
+            Script(s) => ("SCRIPT".to_string(), vec![s.to_string()]),
+            Theme(t) => ("THEME".to_string(), vec![t.to_string()]),
+            DrawnMap(m) => ("DRAWNMAP".to_string(), vec![m.to_string()]),
+        }
+    }
+
+    pub fn to_server_msg(&self) -> HwServerMessage {
+        use self::HwServerMessage::ConfigEntry;
+        let (name, args) = self.to_protocol();
+        HwServerMessage::ConfigEntry(name, args)
+    }
+}
+
+impl TeamInfo {
+    pub fn to_protocol(&self) -> Vec<String> {
+        let mut info = vec![
+            self.name.clone(),
+            self.grave.clone(),
+            self.fort.clone(),
+            self.voice_pack.clone(),
+            self.flag.clone(),
+            self.owner.clone(),
+            self.difficulty.to_string(),
+        ];
+        let hogs = self
+            .hedgehogs
+            .iter()
+            .flat_map(|h| once(h.name.clone()).chain(once(h.hat.clone())));
+        info.extend(hogs);
+        info
+    }
+}
+
+macro_rules! const_braces {
+    ($e: expr) => {
+        "{}\n"
+    };
+}
+
+macro_rules! msg {
+    [$($part: expr),*] => {
+        format!(concat!($(const_braces!($part)),*, "\n"), $($part),*);
+    };
+}
+
+#[cfg(test)]
+macro_rules! several {
+    [$part: expr] => { once($part) };
+    [$part: expr, $($other: expr),*] => { once($part).chain(several![$($other),*]) };
+}
+
+impl HwProtocolMessage {
+    /** Converts the message to a raw `String`, which can be sent over the network.
+     *
+     * This is the inverse of the `message` parser.
+     */
+    #[cfg(test)]
+    pub(crate) fn to_raw_protocol(&self) -> String {
+        use self::HwProtocolMessage::*;
+        match self {
+            Ping => msg!["PING"],
+            Pong => msg!["PONG"],
+            Quit(None) => msg!["QUIT"],
+            Quit(Some(msg)) => msg!["QUIT", msg],
+            Global(msg) => msg!["CMD", format!("GLOBAL {}", msg)],
+            Watch(name) => msg!["CMD", format!("WATCH {}", name)],
+            ToggleServerRegisteredOnly => msg!["CMD", "REGISTERED_ONLY"],
+            SuperPower => msg!["CMD", "SUPER_POWER"],
+            Info(info) => msg!["CMD", format!("INFO {}", info)],
+            Nick(nick) => msg!("NICK", nick),
+            Proto(version) => msg!["PROTO", version],
+            Password(p, s) => msg!["PASSWORD", p, s],
+            Checker(i, n, p) => msg!["CHECKER", i, n, p],
+            List => msg!["LIST"],
+            Chat(msg) => msg!["CHAT", msg],
+            CreateRoom(name, None) => msg!["CREATE_ROOM", name],
+            CreateRoom(name, Some(password)) => msg!["CREATE_ROOM", name, password],
+            JoinRoom(name, None) => msg!["JOIN_ROOM", name],
+            JoinRoom(name, Some(password)) => msg!["JOIN_ROOM", name, password],
+            Follow(name) => msg!["FOLLOW", name],
+            Rnd(args) => {
+                if args.is_empty() {
+                    msg!["CMD", "RND"]
+                } else {
+                    msg!["CMD", format!("RND {}", args.join(" "))]
+                }
+            }
+            Kick(name) => msg!["KICK", name],
+            Ban(name, reason, time) => msg!["BAN", name, reason, time],
+            BanIp(ip, reason, time) => msg!["BAN_IP", ip, reason, time],
+            BanNick(nick, reason, time) => msg!("BAN_NICK", nick, reason, time),
+            BanList => msg!["BANLIST"],
+            Unban(name) => msg!["UNBAN", name],
+            SetServerVar(var) => construct_message(&["SET_SERVER_VAR"], &var.to_protocol()),
+            GetServerVar => msg!["GET_SERVER_VAR"],
+            RestartServer => msg!["CMD", "RESTART_SERVER YES"],
+            Stats => msg!["CMD", "STATS"],
+            Part(None) => msg!["PART"],
+            Part(Some(msg)) => msg!["PART", msg],
+            Cfg(config) => {
+                let (name, args) = config.to_protocol();
+                msg!["CFG", name, args.join("\n")]
+            }
+            AddTeam(info) => msg![
+                "ADD_TEAM",
+                info.name,
+                info.color,
+                info.grave,
+                info.fort,
+                info.voice_pack,
+                info.flag,
+                info.difficulty,
+                info.hedgehogs
+                    .iter()
+                    .flat_map(|h| several![&h.name[..], &h.hat[..]])
+                    .collect::<Vec<_>>()
+                    .join("\n")
+            ],
+            RemoveTeam(name) => msg!["REMOVE_TEAM", name],
+            SetHedgehogsNumber(team, number) => msg!["HH_NUM", team, number],
+            SetTeamColor(team, color) => msg!["TEAM_COLOR", team, color],
+            ToggleReady => msg!["TOGGLE_READY"],
+            StartGame => msg!["START_GAME"],
+            EngineMessage(msg) => msg!["EM", msg],
+            RoundFinished => msg!["ROUNDFINISHED"],
+            ToggleRestrictJoin => msg!["TOGGLE_RESTRICT_JOINS"],
+            ToggleRestrictTeams => msg!["TOGGLE_RESTRICT_TEAMS"],
+            ToggleRegisteredOnly => msg!["TOGGLE_REGISTERED_ONLY"],
+            RoomName(name) => msg!["ROOM_NAME", name],
+            Delegate(name) => msg!["CMD", format!("DELEGATE {}", name)],
+            TeamChat(msg) => msg!["TEAMCHAT", msg],
+            MaxTeams(count) => msg!["CMD", format!("MAXTEAMS {}", count)],
+            Fix => msg!["CMD", "FIX"],
+            Unfix => msg!["CMD", "UNFIX"],
+            Greeting(None) => msg!["CMD", "GREETING"],
+            Greeting(Some(msg)) => msg!["CMD", format!("GREETING {}", msg)],
+            CallVote(None) => msg!["CMD", "CALLVOTE"],
+            CallVote(Some(vote)) => {
+                msg!["CMD", format!("CALLVOTE {}", &vote.to_protocol().join(" "))]
+            }
+            Vote(msg) => msg!["CMD", format!("VOTE {}", if *msg { "YES" } else { "NO" })],
+            ForceVote(msg) => msg!["CMD", format!("FORCE {}", if *msg { "YES" } else { "NO" })],
+            Save(name, location) => msg!["CMD", format!("SAVE {} {}", name, location)],
+            Delete(name) => msg!["CMD", format!("DELETE {}", name)],
+            SaveRoom(name) => msg!["CMD", format!("SAVEROOM {}", name)],
+            LoadRoom(name) => msg!["CMD", format!("LOADROOM {}", name)],
+            _ => panic!("Protocol message not yet implemented"),
+        }
+    }
+}
+
+fn construct_message(header: &[&str], msg: &[String]) -> String {
+    let mut v: Vec<_> = header.iter().cloned().collect();
+    v.extend(msg.iter().map(|s| &s[..]));
+    v.push("\n");
+    v.join("\n")
+}
+
+impl HwServerMessage {
+    pub fn to_raw_protocol(&self) -> String {
+        use self::HwServerMessage::*;
+        match self {
+            Ping => msg!["PING"],
+            Pong => msg!["PONG"],
+            Connected(protocol_version) => msg![
+                "CONNECTED",
+                "Hedgewars server https://www.hedgewars.org/",
+                protocol_version
+            ],
+            Redirect(port) => msg!["REDIRECT", port],
+            Bye(msg) => msg!["BYE", msg],
+            Nick(nick) => msg!["NICK", nick],
+            Proto(proto) => msg!["PROTO", proto],
+            AskPassword(salt) => msg!["ASKPASSWORD", salt],
+            ServerAuth(hash) => msg!["SERVER_AUTH", hash],
+            LobbyLeft(nick, msg) => msg!["LOBBY:LEFT", nick, msg],
+            LobbyJoined(nicks) => construct_message(&["LOBBY:JOINED"], &nicks),
+            ClientFlags(flags, nicks) => construct_message(&["CLIENT_FLAGS", flags], &nicks),
+            Rooms(info) => construct_message(&["ROOMS"], &info),
+            RoomAdd(info) => construct_message(&["ROOM", "ADD"], &info),
+            RoomJoined(nicks) => construct_message(&["JOINED"], &nicks),
+            RoomLeft(nick, msg) => msg!["LEFT", nick, msg],
+            RoomRemove(name) => msg!["ROOM", "DEL", name],
+            RoomUpdated(name, info) => construct_message(&["ROOM", "UPD", name], &info),
+            Joining(name) => msg!["JOINING", name],
+            TeamAdd(info) => construct_message(&["ADD_TEAM"], &info),
+            TeamRemove(name) => msg!["REMOVE_TEAM", name],
+            TeamAccepted(name) => msg!["TEAM_ACCEPTED", name],
+            TeamColor(name, color) => msg!["TEAM_COLOR", name, color],
+            HedgehogsNumber(name, number) => msg!["HH_NUM", name, number],
+            ConfigEntry(name, values) => construct_message(&["CFG", name], &values),
+            Kicked => msg!["KICKED"],
+            RunGame => msg!["RUN_GAME"],
+            ForwardEngineMessage(em) => construct_message(&["EM"], &em),
+            RoundFinished => msg!["ROUND_FINISHED"],
+            ChatMsg { nick, msg } => msg!["CHAT", nick, msg],
+            Info(info) => construct_message(&["INFO"], &info),
+            ServerMessage(msg) => msg!["SERVER_MESSAGE", msg],
+            ServerVars(vars) => construct_message(&["SERVER_VARS"], &vars),
+            Notice(msg) => msg!["NOTICE", msg],
+            Warning(msg) => msg!["WARNING", msg],
+            Error(msg) => msg!["ERROR", msg],
+            ReplayStart => msg!["REPLAY_START"],
+
+            LegacyReady(is_ready, nicks) => {
+                construct_message(&[if *is_ready { "READY" } else { "NOT_READY" }], &nicks)
+            }
+
+            _ => msg!["ERROR", "UNIMPLEMENTED"],
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hedgewars-server/src/protocol/parser.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,576 @@
+/** The parsers for the chat and multiplayer protocol. The main parser is `message`.
+ * # Protocol
+ * All messages consist of `\n`-separated strings. The end of a message is
+ * indicated by a double newline - `\n\n`.
+ *
+ * For example, a nullary command like PING will be actually sent as `PING\n\n`.
+ * A unary command, such as `START_GAME nick` will be actually sent as `START_GAME\nnick\n\n`.
+ */
+use nom::{
+    branch::alt,
+    bytes::complete::{tag, tag_no_case, take_until, take_while},
+    character::complete::{newline, not_line_ending},
+    combinator::{map, peek},
+    error::{ErrorKind, ParseError},
+    multi::separated_list,
+    sequence::{delimited, pair, preceded, terminated, tuple},
+    Err, IResult,
+};
+
+use std::{
+    num::ParseIntError,
+    ops::Range,
+    str,
+    str::{FromStr, Utf8Error},
+};
+
+use super::messages::{HwProtocolMessage, HwProtocolMessage::*};
+use crate::core::types::{
+    GameCfg, HedgehogInfo, ServerVar, TeamInfo, VoteType, MAX_HEDGEHOGS_PER_TEAM,
+};
+
+#[derive(Debug, PartialEq)]
+pub struct HwProtocolError {}
+
+impl HwProtocolError {
+    fn new() -> Self {
+        HwProtocolError {}
+    }
+}
+
+impl<I> ParseError<I> for HwProtocolError {
+    fn from_error_kind(input: I, kind: ErrorKind) -> Self {
+        HwProtocolError::new()
+    }
+
+    fn append(input: I, kind: ErrorKind, other: Self) -> Self {
+        HwProtocolError::new()
+    }
+}
+
+impl From<Utf8Error> for HwProtocolError {
+    fn from(_: Utf8Error) -> Self {
+        HwProtocolError::new()
+    }
+}
+
+impl From<ParseIntError> for HwProtocolError {
+    fn from(_: ParseIntError) -> Self {
+        HwProtocolError::new()
+    }
+}
+
+pub type HwResult<'a, O> = IResult<&'a [u8], O, HwProtocolError>;
+
+fn end_of_message(input: &[u8]) -> HwResult<&[u8]> {
+    tag("\n\n")(input)
+}
+
+fn convert_utf8(input: &[u8]) -> HwResult<&str> {
+    match str::from_utf8(input) {
+        Ok(str) => Ok((b"", str)),
+        Err(utf_err) => Result::Err(Err::Failure(utf_err.into())),
+    }
+}
+
+fn convert_from_str<T>(str: &str) -> HwResult<T>
+where
+    T: FromStr<Err = ParseIntError>,
+{
+    match T::from_str(str) {
+        Ok(x) => Ok((b"", x)),
+        Err(format_err) => Result::Err(Err::Failure(format_err.into())),
+    }
+}
+
+fn str_line(input: &[u8]) -> HwResult<&str> {
+    let (i, text) = not_line_ending(input.clone())?;
+    if i != input {
+        Ok((i, convert_utf8(text)?.1))
+    } else {
+        Err(Err::Error(HwProtocolError::new()))
+    }
+}
+
+fn a_line(input: &[u8]) -> HwResult<String> {
+    map(str_line, String::from)(input)
+}
+
+fn cmd_arg(input: &[u8]) -> HwResult<String> {
+    let delimiters = b" \n";
+    let (i, str) = take_while(move |c| !delimiters.contains(&c))(input.clone())?;
+    if i != input {
+        Ok((i, convert_utf8(str)?.1.to_string()))
+    } else {
+        Err(Err::Error(HwProtocolError::new()))
+    }
+}
+
+fn u8_line(input: &[u8]) -> HwResult<u8> {
+    let (i, str) = str_line(input)?;
+    Ok((i, convert_from_str(str)?.1))
+}
+
+fn u16_line(input: &[u8]) -> HwResult<u16> {
+    let (i, str) = str_line(input)?;
+    Ok((i, convert_from_str(str)?.1))
+}
+
+fn u32_line(input: &[u8]) -> HwResult<u32> {
+    let (i, str) = str_line(input)?;
+    Ok((i, convert_from_str(str)?.1))
+}
+
+fn yes_no_line(input: &[u8]) -> HwResult<bool> {
+    alt((
+        map(tag_no_case(b"YES"), |_| true),
+        map(tag_no_case(b"NO"), |_| false),
+    ))(input)
+}
+
+fn opt_arg<'a>(input: &'a [u8]) -> HwResult<'a, Option<String>> {
+    alt((
+        map(peek(end_of_message), |_| None),
+        map(preceded(tag("\n"), a_line), Some),
+    ))(input)
+}
+
+fn spaces(input: &[u8]) -> HwResult<&[u8]> {
+    preceded(tag(" "), take_while(|c| c == b' '))(input)
+}
+
+fn opt_space_arg<'a>(input: &'a [u8]) -> HwResult<'a, Option<String>> {
+    alt((
+        map(peek(end_of_message), |_| None),
+        map(preceded(spaces, a_line), Some),
+    ))(input)
+}
+
+fn hedgehog_array(input: &[u8]) -> HwResult<[HedgehogInfo; 8]> {
+    fn hedgehog_line(input: &[u8]) -> HwResult<HedgehogInfo> {
+        map(
+            tuple((terminated(a_line, newline), a_line)),
+            |(name, hat)| HedgehogInfo { name, hat },
+        )(input)
+    }
+
+    let (i, (h1, h2, h3, h4, h5, h6, h7, h8)) = tuple((
+        terminated(hedgehog_line, newline),
+        terminated(hedgehog_line, newline),
+        terminated(hedgehog_line, newline),
+        terminated(hedgehog_line, newline),
+        terminated(hedgehog_line, newline),
+        terminated(hedgehog_line, newline),
+        terminated(hedgehog_line, newline),
+        hedgehog_line,
+    ))(input)?;
+
+    Ok((i, [h1, h2, h3, h4, h5, h6, h7, h8]))
+}
+
+fn voting(input: &[u8]) -> HwResult<VoteType> {
+    alt((
+        map(tag_no_case("PAUSE"), |_| VoteType::Pause),
+        map(tag_no_case("NEWSEED"), |_| VoteType::NewSeed),
+        map(
+            preceded(pair(tag_no_case("KICK"), spaces), a_line),
+            VoteType::Kick,
+        ),
+        map(
+            preceded(pair(tag_no_case("HEDGEHOGS"), spaces), u8_line),
+            VoteType::HedgehogsPerTeam,
+        ),
+        map(preceded(tag_no_case("MAP"), opt_space_arg), VoteType::Map),
+    ))(input)
+}
+
+fn no_arg_message(input: &[u8]) -> HwResult<HwProtocolMessage> {
+    fn message<'a>(
+        name: &'a str,
+        msg: HwProtocolMessage,
+    ) -> impl Fn(&'a [u8]) -> HwResult<'a, HwProtocolMessage> {
+        move |i| map(tag(name), |_| msg.clone())(i)
+    }
+
+    alt((
+        message("PING", Ping),
+        message("PONG", Pong),
+        message("LIST", List),
+        message("BANLIST", BanList),
+        message("GET_SERVER_VAR", GetServerVar),
+        message("TOGGLE_READY", ToggleReady),
+        message("START_GAME", StartGame),
+        message("TOGGLE_RESTRICT_JOINS", ToggleRestrictJoin),
+        message("TOGGLE_RESTRICT_TEAMS", ToggleRestrictTeams),
+        message("TOGGLE_REGISTERED_ONLY", ToggleRegisteredOnly),
+    ))(input)
+}
+
+fn single_arg_message(input: &[u8]) -> HwResult<HwProtocolMessage> {
+    fn message<'a, T, F, G>(
+        name: &'a str,
+        parser: F,
+        constructor: G,
+    ) -> impl Fn(&'a [u8]) -> HwResult<'a, HwProtocolMessage>
+    where
+        F: Fn(&[u8]) -> HwResult<T>,
+        G: Fn(T) -> HwProtocolMessage,
+    {
+        map(preceded(tag(name), parser), constructor)
+    }
+
+    alt((
+        message("NICK\n", a_line, Nick),
+        message("INFO\n", a_line, Info),
+        message("CHAT\n", a_line, Chat),
+        message("PART", opt_arg, Part),
+        message("FOLLOW\n", a_line, Follow),
+        message("KICK\n", a_line, Kick),
+        message("UNBAN\n", a_line, Unban),
+        message("EM\n", a_line, EngineMessage),
+        message("TEAMCHAT\n", a_line, TeamChat),
+        message("ROOM_NAME\n", a_line, RoomName),
+        message("REMOVE_TEAM\n", a_line, RemoveTeam),
+        message("ROUNDFINISHED", opt_arg, |_| RoundFinished),
+        message("PROTO\n", u16_line, Proto),
+        message("QUIT", opt_arg, Quit),
+    ))(input)
+}
+
+fn cmd_message<'a>(input: &'a [u8]) -> HwResult<'a, HwProtocolMessage> {
+    fn cmd_no_arg<'a>(
+        name: &'a str,
+        msg: HwProtocolMessage,
+    ) -> impl Fn(&'a [u8]) -> HwResult<'a, HwProtocolMessage> {
+        move |i| map(tag_no_case(name), |_| msg.clone())(i)
+    }
+
+    fn cmd_single_arg<'a, T, F, G>(
+        name: &'a str,
+        parser: F,
+        constructor: G,
+    ) -> impl Fn(&'a [u8]) -> HwResult<'a, HwProtocolMessage>
+    where
+        F: Fn(&'a [u8]) -> HwResult<'a, T>,
+        G: Fn(T) -> HwProtocolMessage,
+    {
+        map(
+            preceded(pair(tag_no_case(name), spaces), parser),
+            constructor,
+        )
+    }
+
+    fn cmd_no_arg_message(input: &[u8]) -> HwResult<HwProtocolMessage> {
+        alt((
+            cmd_no_arg("STATS", Stats),
+            cmd_no_arg("FIX", Fix),
+            cmd_no_arg("UNFIX", Unfix),
+            cmd_no_arg("REGISTERED_ONLY", ToggleServerRegisteredOnly),
+            cmd_no_arg("SUPER_POWER", SuperPower),
+        ))(input)
+    }
+
+    fn cmd_single_arg_message(input: &[u8]) -> HwResult<HwProtocolMessage> {
+        alt((
+            cmd_single_arg("RESTART_SERVER", |i| tag("YES")(i), |_| RestartServer),
+            cmd_single_arg("DELEGATE", a_line, Delegate),
+            cmd_single_arg("DELETE", a_line, Delete),
+            cmd_single_arg("SAVEROOM", a_line, SaveRoom),
+            cmd_single_arg("LOADROOM", a_line, LoadRoom),
+            cmd_single_arg("GLOBAL", a_line, Global),
+            cmd_single_arg("WATCH", u32_line, Watch),
+            cmd_single_arg("VOTE", yes_no_line, Vote),
+            cmd_single_arg("FORCE", yes_no_line, ForceVote),
+            cmd_single_arg("INFO", a_line, Info),
+            cmd_single_arg("MAXTEAMS", u8_line, MaxTeams),
+            cmd_single_arg("CALLVOTE", voting, |v| CallVote(Some(v))),
+        ))(input)
+    }
+
+    preceded(
+        tag("CMD\n"),
+        alt((
+            cmd_no_arg_message,
+            cmd_single_arg_message,
+            map(tag_no_case("CALLVOTE"), |_| CallVote(None)),
+            map(preceded(tag_no_case("GREETING"), opt_space_arg), Greeting),
+            map(preceded(tag_no_case("PART"), opt_space_arg), Part),
+            map(preceded(tag_no_case("QUIT"), opt_space_arg), Quit),
+            map(
+                preceded(
+                    tag_no_case("SAVE"),
+                    pair(preceded(spaces, cmd_arg), preceded(spaces, cmd_arg)),
+                ),
+                |(n, l)| Save(n, l),
+            ),
+            map(
+                preceded(
+                    tag_no_case("RND"),
+                    alt((
+                        map(peek(end_of_message), |_| vec![]),
+                        preceded(spaces, separated_list(spaces, cmd_arg)),
+                    )),
+                ),
+                Rnd,
+            ),
+        )),
+    )(input)
+}
+
+fn config_message<'a>(input: &'a [u8]) -> HwResult<'a, HwProtocolMessage> {
+    fn cfg_single_arg<'a, T, F, G>(
+        name: &'a str,
+        parser: F,
+        constructor: G,
+    ) -> impl Fn(&'a [u8]) -> HwResult<'a, GameCfg>
+    where
+        F: Fn(&[u8]) -> HwResult<T>,
+        G: Fn(T) -> GameCfg,
+    {
+        map(preceded(pair(tag(name), newline), parser), constructor)
+    }
+
+    let (i, cfg) = preceded(
+        tag("CFG\n"),
+        alt((
+            cfg_single_arg("THEME", a_line, GameCfg::Theme),
+            cfg_single_arg("SCRIPT", a_line, GameCfg::Script),
+            cfg_single_arg("MAP", a_line, GameCfg::MapType),
+            cfg_single_arg("MAPGEN", u32_line, GameCfg::MapGenerator),
+            cfg_single_arg("MAZE_SIZE", u32_line, GameCfg::MazeSize),
+            cfg_single_arg("TEMPLATE", u32_line, GameCfg::Template),
+            cfg_single_arg("FEATURE_SIZE", u32_line, GameCfg::FeatureSize),
+            cfg_single_arg("SEED", a_line, GameCfg::Seed),
+            cfg_single_arg("DRAWNMAP", a_line, GameCfg::DrawnMap),
+            preceded(pair(tag("AMMO"), newline), |i| {
+                let (i, name) = a_line(i)?;
+                let (i, value) = opt_arg(i)?;
+                Ok((i, GameCfg::Ammo(name, value)))
+            }),
+            preceded(
+                pair(tag("SCHEME"), newline),
+                map(
+                    pair(
+                        a_line,
+                        alt((
+                            map(peek(end_of_message), |_| None),
+                            map(preceded(newline, separated_list(newline, a_line)), Some),
+                        )),
+                    ),
+                    |(name, values)| GameCfg::Scheme(name, values.unwrap_or_default()),
+                ),
+            ),
+        )),
+    )(input)?;
+    Ok((i, Cfg(cfg)))
+}
+
+fn server_var_message(input: &[u8]) -> HwResult<HwProtocolMessage> {
+    map(
+        preceded(
+            tag("SET_SERVER_VAR\n"),
+            alt((
+                map(preceded(tag("MOTD_NEW\n"), a_line), ServerVar::MOTDNew),
+                map(preceded(tag("MOTD_OLD\n"), a_line), ServerVar::MOTDOld),
+                map(
+                    preceded(tag("LATEST_PROTO\n"), u16_line),
+                    ServerVar::LatestProto,
+                ),
+            )),
+        ),
+        SetServerVar,
+    )(input)
+}
+
+fn complex_message(input: &[u8]) -> HwResult<HwProtocolMessage> {
+    alt((
+        preceded(
+            pair(tag("PASSWORD"), newline),
+            map(pair(terminated(a_line, newline), a_line), |(pass, salt)| {
+                Password(pass, salt)
+            }),
+        ),
+        preceded(
+            pair(tag("CHECKER"), newline),
+            map(
+                tuple((
+                    terminated(u16_line, newline),
+                    terminated(a_line, newline),
+                    a_line,
+                )),
+                |(protocol, name, pass)| Checker(protocol, name, pass),
+            ),
+        ),
+        preceded(
+            pair(tag("CREATE_ROOM"), newline),
+            map(pair(a_line, opt_arg), |(name, pass)| CreateRoom(name, pass)),
+        ),
+        preceded(
+            pair(tag("JOIN_ROOM"), newline),
+            map(pair(a_line, opt_arg), |(name, pass)| JoinRoom(name, pass)),
+        ),
+        preceded(
+            pair(tag("ADD_TEAM"), newline),
+            map(
+                tuple((
+                    terminated(a_line, newline),
+                    terminated(u8_line, newline),
+                    terminated(a_line, newline),
+                    terminated(a_line, newline),
+                    terminated(a_line, newline),
+                    terminated(a_line, newline),
+                    terminated(u8_line, newline),
+                    hedgehog_array,
+                )),
+                |(name, color, grave, fort, voice_pack, flag, difficulty, hedgehogs)| {
+                    AddTeam(Box::new(TeamInfo {
+                        owner: String::new(),
+                        name,
+                        color,
+                        grave,
+                        fort,
+                        voice_pack,
+                        flag,
+                        difficulty,
+                        hedgehogs,
+                        hedgehogs_number: 0,
+                    }))
+                },
+            ),
+        ),
+        preceded(
+            pair(tag("HH_NUM"), newline),
+            map(
+                pair(terminated(a_line, newline), u8_line),
+                |(name, count)| SetHedgehogsNumber(name, count),
+            ),
+        ),
+        preceded(
+            pair(tag("TEAM_COLOR"), newline),
+            map(
+                pair(terminated(a_line, newline), u8_line),
+                |(name, color)| SetTeamColor(name, color),
+            ),
+        ),
+        preceded(
+            pair(tag("BAN"), newline),
+            map(
+                tuple((
+                    terminated(a_line, newline),
+                    terminated(a_line, newline),
+                    u32_line,
+                )),
+                |(name, reason, time)| Ban(name, reason, time),
+            ),
+        ),
+        preceded(
+            pair(tag("BAN_IP"), newline),
+            map(
+                tuple((
+                    terminated(a_line, newline),
+                    terminated(a_line, newline),
+                    u32_line,
+                )),
+                |(ip, reason, time)| BanIp(ip, reason, time),
+            ),
+        ),
+        preceded(
+            pair(tag("BAN_NICK"), newline),
+            map(
+                tuple((
+                    terminated(a_line, newline),
+                    terminated(a_line, newline),
+                    u32_line,
+                )),
+                |(nick, reason, time)| BanNick(nick, reason, time),
+            ),
+        ),
+    ))(input)
+}
+
+pub fn malformed_message(input: &[u8]) -> HwResult<()> {
+    map(terminated(take_until(&b"\n\n"[..]), end_of_message), |_| ())(input)
+}
+
+pub fn message(input: &[u8]) -> HwResult<HwProtocolMessage> {
+    delimited(
+        take_while(|c| c == b'\n'),
+        alt((
+            no_arg_message,
+            single_arg_message,
+            cmd_message,
+            config_message,
+            server_var_message,
+            complex_message,
+        )),
+        end_of_message,
+    )(input)
+}
+
+#[cfg(test)]
+mod test {
+    use super::message;
+    use crate::{
+        core::types::GameCfg,
+        protocol::{messages::HwProtocolMessage::*, parser::HwProtocolError, test::gen_proto_msg},
+    };
+    use proptest::{proptest, proptest_helper};
+
+    #[cfg(test)]
+    proptest! {
+        #[test]
+        fn is_parser_composition_idempotent(ref msg in gen_proto_msg()) {
+            println!("!! Msg: {:?}, Bytes: {:?} !!", msg, msg.to_raw_protocol().as_bytes());
+            assert_eq!(message(msg.to_raw_protocol().as_bytes()), Ok((&b""[..], msg.clone())))
+        }
+    }
+
+    #[test]
+    fn parse_test() {
+        assert_eq!(message(b"PING\n\n"), Ok((&b""[..], Ping)));
+        assert_eq!(message(b"START_GAME\n\n"), Ok((&b""[..], StartGame)));
+        assert_eq!(
+            message(b"NICK\nit's me\n\n"),
+            Ok((&b""[..], Nick("it's me".to_string())))
+        );
+        assert_eq!(message(b"PROTO\n51\n\n"), Ok((&b""[..], Proto(51))));
+        assert_eq!(
+            message(b"QUIT\nbye-bye\n\n"),
+            Ok((&b""[..], Quit(Some("bye-bye".to_string()))))
+        );
+        assert_eq!(message(b"QUIT\n\n"), Ok((&b""[..], Quit(None))));
+        assert_eq!(
+            message(b"CMD\nwatch 49471\n\n"),
+            Ok((&b""[..], Watch(49471)))
+        );
+        assert_eq!(
+            message(b"BAN\nme\nbad\n77\n\n"),
+            Ok((&b""[..], Ban("me".to_string(), "bad".to_string(), 77)))
+        );
+
+        assert_eq!(message(b"CMD\nPART\n\n"), Ok((&b""[..], Part(None))));
+        assert_eq!(
+            message(b"CMD\nPART _msg_\n\n"),
+            Ok((&b""[..], Part(Some("_msg_".to_string()))))
+        );
+
+        assert_eq!(message(b"CMD\nRND\n\n"), Ok((&b""[..], Rnd(vec![]))));
+        assert_eq!(
+            message(b"CMD\nRND A B\n\n"),
+            Ok((&b""[..], Rnd(vec![String::from("A"), String::from("B")])))
+        );
+
+        assert_eq!(
+            message(b"CFG\nSCHEME\na\nA\n\n"),
+            Ok((
+                &b""[..],
+                Cfg(GameCfg::Scheme("a".to_string(), vec!["A".to_string()]))
+            ))
+        );
+
+        assert_eq!(
+            message(b"QUIT\n1\n2\n\n"),
+            Err(nom::Err::Error(HwProtocolError::new()))
+        );
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hedgewars-server/src/protocol/test.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,252 @@
+use proptest::{
+    arbitrary::{any, any_with, Arbitrary, StrategyFor},
+    strategy::{BoxedStrategy, Just, Map, Strategy},
+    test_runner::{Reason, TestRunner},
+};
+
+use crate::core::types::{GameCfg, HedgehogInfo, ServerVar, ServerVar::*, TeamInfo, VoteType};
+
+use super::messages::{HwProtocolMessage, HwProtocolMessage::*};
+
+// Due to inability to define From between Options
+trait Into2<T>: Sized {
+    fn into2(self) -> T;
+}
+impl<T> Into2<T> for T {
+    fn into2(self) -> T {
+        self
+    }
+}
+impl Into2<Vec<String>> for Vec<Ascii> {
+    fn into2(self) -> Vec<String> {
+        self.into_iter().map(|x| x.0).collect()
+    }
+}
+impl Into2<String> for Ascii {
+    fn into2(self) -> String {
+        self.0
+    }
+}
+impl Into2<Option<String>> for Option<Ascii> {
+    fn into2(self) -> Option<String> {
+        self.map(|x| x.0)
+    }
+}
+
+macro_rules! proto_msg_case {
+    ($val: ident()) => {
+        Just($val)
+    };
+    ($val: ident($arg: ty)) => {
+        any::<$arg>().prop_map(|v| $val(v.into2()))
+    };
+    ($val: ident($arg1: ty, $arg2: ty)) => {
+        any::<($arg1, $arg2)>().prop_map(|v| $val(v.0.into2(), v.1.into2()))
+    };
+    ($val: ident($arg1: ty, $arg2: ty, $arg3: ty)) => {
+        any::<($arg1, $arg2, $arg3)>().prop_map(|v| $val(v.0.into2(), v.1.into2(), v.2.into2()))
+    };
+}
+
+macro_rules! proto_msg_match {
+    ($var: expr, def = $default: expr, $($num: expr => $constr: ident $res: tt),*) => (
+        match $var {
+            $($num => (proto_msg_case!($constr $res)).boxed()),*,
+            _ => Just($default).boxed()
+        }
+    )
+}
+
+/// Wrapper type for generating non-empty strings
+#[derive(Debug)]
+struct Ascii(String);
+
+impl Arbitrary for Ascii {
+    type Parameters = <String as Arbitrary>::Parameters;
+
+    fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy {
+        "[a-zA-Z0-9]+".prop_map(Ascii).boxed()
+    }
+
+    type Strategy = BoxedStrategy<Ascii>;
+}
+
+impl Arbitrary for GameCfg {
+    type Parameters = ();
+
+    fn arbitrary_with(_args: <Self as Arbitrary>::Parameters) -> <Self as Arbitrary>::Strategy {
+        use crate::core::types::GameCfg::*;
+        (0..10)
+            .no_shrink()
+            .prop_flat_map(|i| {
+                proto_msg_match!(i, def = FeatureSize(0),
+            0 => FeatureSize(u32),
+            1 => MapType(Ascii),
+            2 => MapGenerator(u32),
+            3 => MazeSize(u32),
+            4 => Seed(Ascii),
+            5 => Template(u32),
+            6 => Ammo(Ascii, Option<Ascii>),
+            7 => Scheme(Ascii, Vec<Ascii>),
+            8 => Script(Ascii),
+            9 => Theme(Ascii),
+            10 => DrawnMap(Ascii))
+            })
+            .boxed()
+    }
+
+    type Strategy = BoxedStrategy<GameCfg>;
+}
+
+impl Arbitrary for TeamInfo {
+    type Parameters = ();
+
+    fn arbitrary_with(_args: <Self as Arbitrary>::Parameters) -> <Self as Arbitrary>::Strategy {
+        (
+            "[a-z]+",
+            0u8..127u8,
+            "[a-z]+",
+            "[a-z]+",
+            "[a-z]+",
+            "[a-z]+",
+            0u8..127u8,
+        )
+            .prop_map(|(name, color, grave, fort, voice_pack, flag, difficulty)| {
+                fn hog(n: u8) -> HedgehogInfo {
+                    HedgehogInfo {
+                        name: format!("hog{}", n),
+                        hat: format!("hat{}", n),
+                    }
+                }
+                let hedgehogs = [
+                    hog(1),
+                    hog(2),
+                    hog(3),
+                    hog(4),
+                    hog(5),
+                    hog(6),
+                    hog(7),
+                    hog(8),
+                ];
+                TeamInfo {
+                    owner: String::new(),
+                    name,
+                    color,
+                    grave,
+                    fort,
+                    voice_pack,
+                    flag,
+                    difficulty,
+                    hedgehogs,
+                    hedgehogs_number: 0,
+                }
+            })
+            .boxed()
+    }
+
+    type Strategy = BoxedStrategy<TeamInfo>;
+}
+
+impl Arbitrary for ServerVar {
+    type Parameters = ();
+
+    fn arbitrary_with(args: Self::Parameters) -> Self::Strategy {
+        (0..=2)
+            .no_shrink()
+            .prop_flat_map(|i| {
+                proto_msg_match!(i, def = ServerVar::LatestProto(0),
+                    0 => MOTDNew(Ascii),
+                    1 => MOTDOld(Ascii),
+                    2 => LatestProto(u16)
+                )
+            })
+            .boxed()
+    }
+
+    type Strategy = BoxedStrategy<ServerVar>;
+}
+
+impl Arbitrary for VoteType {
+    type Parameters = ();
+
+    fn arbitrary_with(args: Self::Parameters) -> Self::Strategy {
+        use VoteType::*;
+        (0..=4)
+            .no_shrink()
+            .prop_flat_map(|i| {
+                proto_msg_match!(i, def = VoteType::Pause,
+                    0 => Kick(Ascii),
+                    1 => Map(Option<Ascii>),
+                    2 => Pause(),
+                    3 => NewSeed(),
+                    4 => HedgehogsPerTeam(u8)
+                )
+            })
+            .boxed()
+    }
+
+    type Strategy = BoxedStrategy<VoteType>;
+}
+
+pub fn gen_proto_msg() -> BoxedStrategy<HwProtocolMessage> where {
+    let res = (0..=55).no_shrink().prop_flat_map(|i| {
+        proto_msg_match!(i, def = Ping,
+            0 => Ping(),
+            1 => Pong(),
+            2 => Quit(Option<Ascii>),
+            4 => Global(Ascii),
+            5 => Watch(u32),
+            6 => ToggleServerRegisteredOnly(),
+            7 => SuperPower(),
+            8 => Info(Ascii),
+            9 => Nick(Ascii),
+            10 => Proto(u16),
+            11 => Password(Ascii, Ascii),
+            12 => Checker(u16, Ascii, Ascii),
+            13 => List(),
+            14 => Chat(Ascii),
+            15 => CreateRoom(Ascii, Option<Ascii>),
+            16 => JoinRoom(Ascii, Option<Ascii>),
+            17 => Follow(Ascii),
+            18 => Rnd(Vec<Ascii>),
+            19 => Kick(Ascii),
+            20 => Ban(Ascii, Ascii, u32),
+            21 => BanIp(Ascii, Ascii, u32),
+            22 => BanNick(Ascii, Ascii, u32),
+            23 => BanList(),
+            24 => Unban(Ascii),
+            25 => SetServerVar(ServerVar),
+            26 => GetServerVar(),
+            27 => RestartServer(),
+            28 => Stats(),
+            29 => Part(Option<Ascii>),
+            30 => Cfg(GameCfg),
+            31 => AddTeam(Box<TeamInfo>),
+            32 => RemoveTeam(Ascii),
+            33 => SetHedgehogsNumber(Ascii, u8),
+            34 => SetTeamColor(Ascii, u8),
+            35 => ToggleReady(),
+            36 => StartGame(),
+            37 => EngineMessage(Ascii),
+            38 => RoundFinished(),
+            39 => ToggleRestrictJoin(),
+            40 => ToggleRestrictTeams(),
+            41 => ToggleRegisteredOnly(),
+            42 => RoomName(Ascii),
+            43 => Delegate(Ascii),
+            44 => TeamChat(Ascii),
+            45 => MaxTeams(u8),
+            46 => Fix(),
+            47 => Unfix(),
+            48 => Greeting(Option<Ascii>),
+            49 => CallVote(Option<VoteType>),
+            50 => Vote(bool),
+            51 => ForceVote(bool),
+            52 => Save(Ascii, Ascii),
+            53 => Delete(Ascii),
+            54 => SaveRoom(Ascii),
+            55 => LoadRoom(Ascii)
+        )
+    });
+    res.boxed()
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hedgewars-server/src/server.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,5 @@
+#[cfg(feature = "official-server")]
+mod database;
+#[cfg(feature = "official-server")]
+pub mod io;
+pub mod network;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hedgewars-server/src/server/database.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,130 @@
+use mysql;
+use mysql::{error::DriverError, error::Error, from_row_opt, params};
+use openssl::sha::sha1;
+
+use crate::handlers::{AccountInfo, Sha1Digest};
+
+const CHECK_ACCOUNT_EXISTS_QUERY: &str =
+    r"SELECT 1 FROM users WHERE users.name = :username LIMIT 1";
+
+const GET_ACCOUNT_QUERY: &str =
+    r"SELECT CASE WHEN users.status = 1 THEN users.pass ELSE '' END,
+     (SELECT COUNT(users_roles.rid) FROM users_roles WHERE users.uid = users_roles.uid AND users_roles.rid = 3),
+     (SELECT COUNT(users_roles.rid) FROM users_roles WHERE users.uid = users_roles.uid AND users_roles.rid = 13)
+     FROM users WHERE users.name = :username";
+
+const STORE_STATS_QUERY: &str = r"INSERT INTO gameserver_stats
+      (players, rooms, last_update)
+      VALUES
+      (:players, :rooms, UNIX_TIMESTAMP())";
+
+const GET_REPLAY_NAME_QUERY: &str = r"SELECT filename FROM achievements WHERE id = :id";
+
+pub struct ServerStatistics {
+    rooms: u32,
+    players: u32,
+}
+
+pub struct Achievements {}
+
+pub struct Database {
+    pool: Option<mysql::Pool>,
+}
+
+impl Database {
+    pub fn new() -> Self {
+        Self { pool: None }
+    }
+
+    pub fn connect(&mut self, url: &str) -> Result<(), Error> {
+        self.pool = Some(mysql::Pool::new(url)?);
+
+        Ok(())
+    }
+
+    pub fn is_registered(&mut self, nick: &str) -> Result<bool, Error> {
+        if let Some(pool) = &self.pool {
+            let is_registered = pool
+                .first_exec(CHECK_ACCOUNT_EXISTS_QUERY, params! { "username" => nick })?
+                .is_some();
+            Ok(is_registered)
+        } else {
+            Err(DriverError::SetupError.into())
+        }
+    }
+
+    pub fn get_account(
+        &mut self,
+        nick: &str,
+        protocol: u16,
+        password_hash: &str,
+        client_salt: &str,
+        server_salt: &str,
+    ) -> Result<Option<AccountInfo>, Error> {
+        if let Some(pool) = &self.pool {
+            if let Some(row) = pool.first_exec(GET_ACCOUNT_QUERY, params! { "username" => nick })? {
+                let (mut password, is_admin, is_contributor) =
+                    from_row_opt::<(String, i32, i32)>(row)?;
+                let client_hash = get_hash(protocol, &password, &client_salt, &server_salt);
+                let server_hash = get_hash(protocol, &password, &server_salt, &client_salt);
+                password.replace_range(.., "🦔🦔🦔🦔🦔🦔🦔🦔");
+
+                if client_hash == password_hash {
+                    Ok(Some(AccountInfo {
+                        is_registered: true,
+                        is_admin: is_admin == 1,
+                        is_contributor: is_contributor == 1,
+                        server_hash,
+                    }))
+                } else {
+                    Ok(None)
+                }
+            } else {
+                Ok(None)
+            }
+        } else {
+            Err(DriverError::SetupError.into())
+        }
+    }
+
+    pub fn store_stats(&mut self, stats: &ServerStatistics) -> Result<(), Error> {
+        if let Some(pool) = &self.pool {
+            for mut stmt in pool.prepare(STORE_STATS_QUERY).into_iter() {
+                stmt.execute(params! {
+                    "players" => stats.players,
+                    "rooms" => stats.rooms,
+                })?;
+            }
+            Ok(())
+        } else {
+            Err(DriverError::SetupError.into())
+        }
+    }
+
+    pub fn store_achievements(&mut self, achievements: &Achievements) -> Result<(), ()> {
+        Ok(())
+    }
+
+    pub fn get_replay_name(&mut self, replay_id: u32) -> Result<Option<String>, Error> {
+        if let Some(pool) = &self.pool {
+            if let Some(row) =
+                pool.first_exec(GET_REPLAY_NAME_QUERY, params! { "id" => replay_id })?
+            {
+                let filename = from_row_opt::<(String)>(row)?;
+                Ok(Some(filename))
+            } else {
+                Ok(None)
+            }
+        } else {
+            Err(DriverError::SetupError.into())
+        }
+    }
+}
+
+fn get_hash(protocol_number: u16, web_password: &str, salt1: &str, salt2: &str) -> Sha1Digest {
+    let s = format!(
+        "{}{}{}{}{}",
+        salt1, salt2, web_password, protocol_number, "!hedgewars"
+    );
+    Sha1Digest::new(sha1(s.as_bytes()))
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hedgewars-server/src/server/io.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,162 @@
+use std::{
+    fs::{File, OpenOptions},
+    io::{Error, ErrorKind, Read, Result, Write},
+    sync::mpsc,
+    thread,
+};
+
+use crate::{
+    handlers::{IoResult, IoTask},
+    server::database::Database,
+};
+use log::*;
+use mio::{Evented, Poll, PollOpt};
+use mio_extras::channel;
+
+pub type RequestId = u32;
+
+pub struct IoThread {
+    core_tx: mpsc::Sender<(RequestId, IoTask)>,
+    core_rx: channel::Receiver<(RequestId, IoResult)>,
+}
+
+impl IoThread {
+    pub fn new() -> Self {
+        let (core_tx, io_rx) = mpsc::channel();
+        let (io_tx, core_rx) = channel::channel();
+
+        let mut db = Database::new();
+        db.connect("localhost");
+
+        thread::spawn(move || {
+            while let Ok((request_id, task)) = io_rx.recv() {
+                let response = match task {
+                    IoTask::CheckRegistered { nick } => match db.is_registered(&nick) {
+                        Ok(is_registered) => IoResult::AccountRegistered(is_registered),
+                        Err(e) => {
+                            warn!("Unable to check account's existence: {}", e);
+                            IoResult::AccountRegistered(false)
+                        }
+                    },
+
+                    IoTask::GetAccount {
+                        nick,
+                        protocol,
+                        password_hash,
+                        client_salt,
+                        server_salt,
+                    } => {
+                        match db.get_account(
+                            &nick,
+                            protocol,
+                            &password_hash,
+                            &client_salt,
+                            &server_salt,
+                        ) {
+                            Ok(account) => IoResult::Account(account),
+                            Err(e) => {
+                                warn!("Unable to get account data: {}", e);
+                                IoResult::Account(None)
+                            }
+                        }
+                    }
+
+                    IoTask::GetReplay { id } => {
+                        let result = match db.get_replay_name(id) {
+                            Ok(Some(filename)) => {
+                                let filename = format!(
+                                    "checked/{}",
+                                    if filename.starts_with("replays/") {
+                                        &filename[8..]
+                                    } else {
+                                        &filename
+                                    }
+                                );
+                                match load_file(&filename) {
+                                    Ok(contents) => Some(unimplemented!()),
+                                    Err(e) => {
+                                        warn!(
+                                            "Error while writing the room config file \"{}\": {}",
+                                            filename, e
+                                        );
+                                        None
+                                    }
+                                }
+                            }
+                            Ok(None) => None,
+                            Err(e) => {
+                                warn!("Unable to get replay name: {}", e);
+                                None
+                            }
+                        };
+                        IoResult::Replay(result)
+                    }
+
+                    IoTask::SaveRoom {
+                        room_id,
+                        filename,
+                        contents,
+                    } => {
+                        let result = match save_file(&filename, &contents) {
+                            Ok(()) => true,
+                            Err(e) => {
+                                warn!(
+                                    "Error while writing the room config file \"{}\": {}",
+                                    filename, e
+                                );
+                                false
+                            }
+                        };
+                        IoResult::SaveRoom(room_id, result)
+                    }
+
+                    IoTask::LoadRoom { room_id, filename } => {
+                        let result = match load_file(&filename) {
+                            Ok(contents) => Some(contents),
+                            Err(e) => {
+                                warn!(
+                                    "Error while writing the room config file \"{}\": {}",
+                                    filename, e
+                                );
+                                None
+                            }
+                        };
+                        IoResult::LoadRoom(room_id, result)
+                    }
+                };
+                io_tx.send((request_id, response));
+            }
+        });
+
+        Self { core_rx, core_tx }
+    }
+
+    pub fn send(&self, request_id: RequestId, task: IoTask) {
+        self.core_tx.send((request_id, task)).unwrap();
+    }
+
+    pub fn try_recv(&self) -> Option<(RequestId, IoResult)> {
+        match self.core_rx.try_recv() {
+            Ok(result) => Some(result),
+            Err(mpsc::TryRecvError::Empty) => None,
+            Err(mpsc::TryRecvError::Disconnected) => unreachable!(),
+        }
+    }
+
+    pub fn register_rx(&self, poll: &mio::Poll, token: mio::Token) -> Result<()> {
+        self.core_rx
+            .register(poll, token, mio::Ready::readable(), PollOpt::edge())
+    }
+}
+
+fn save_file(filename: &str, contents: &str) -> Result<()> {
+    let mut writer = OpenOptions::new().create(true).write(true).open(filename)?;
+    writer.write_all(contents.as_bytes())
+}
+
+fn load_file(filename: &str) -> Result<String> {
+    let mut reader = File::open(filename)?;
+    let mut result = String::new();
+    reader.read_to_string(&mut result)?;
+    Ok(result)
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hedgewars-server/src/server/network.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,749 @@
+extern crate slab;
+
+use std::{
+    collections::HashSet,
+    io,
+    io::{Error, ErrorKind, Read, Write},
+    mem::{replace, swap},
+    net::{IpAddr, Ipv4Addr, SocketAddr},
+};
+
+use log::*;
+use mio::{
+    net::{TcpListener, TcpStream},
+    Evented, Poll, PollOpt, Ready, Token,
+};
+use mio_extras::timer;
+use netbuf;
+use slab::Slab;
+
+use crate::{
+    core::{server::HwServer, types::ClientId},
+    handlers,
+    handlers::{IoResult, IoTask},
+    protocol::{messages::HwServerMessage::Redirect, messages::*, ProtocolDecoder},
+    utils,
+};
+
+#[cfg(feature = "official-server")]
+use super::io::{IoThread, RequestId};
+
+#[cfg(feature = "tls-connections")]
+use openssl::{
+    error::ErrorStack,
+    ssl::{
+        HandshakeError, MidHandshakeSslStream, Ssl, SslContext, SslContextBuilder, SslFiletype,
+        SslMethod, SslOptions, SslStream, SslStreamBuilder, SslVerifyMode,
+    },
+};
+use std::time::Duration;
+
+const MAX_BYTES_PER_READ: usize = 2048;
+const SEND_PING_TIMEOUT: Duration = Duration::from_secs(30);
+const DROP_CLIENT_TIMEOUT: Duration = Duration::from_secs(30);
+const PING_PROBES_COUNT: u8 = 2;
+
+#[derive(Hash, Eq, PartialEq, Copy, Clone)]
+pub enum NetworkClientState {
+    Idle,
+    NeedsWrite,
+    NeedsRead,
+    Closed,
+    #[cfg(feature = "tls-connections")]
+    Connected,
+}
+
+type NetworkResult<T> = io::Result<(T, NetworkClientState)>;
+
+pub enum ClientSocket {
+    Plain(TcpStream),
+    #[cfg(feature = "tls-connections")]
+    SslHandshake(Option<MidHandshakeSslStream<TcpStream>>),
+    #[cfg(feature = "tls-connections")]
+    SslStream(SslStream<TcpStream>),
+}
+
+impl ClientSocket {
+    fn inner(&self) -> &TcpStream {
+        match self {
+            ClientSocket::Plain(stream) => stream,
+            #[cfg(feature = "tls-connections")]
+            ClientSocket::SslHandshake(Some(builder)) => builder.get_ref(),
+            #[cfg(feature = "tls-connections")]
+            ClientSocket::SslHandshake(None) => unreachable!(),
+            #[cfg(feature = "tls-connections")]
+            ClientSocket::SslStream(ssl_stream) => ssl_stream.get_ref(),
+        }
+    }
+}
+
+pub struct NetworkClient {
+    id: ClientId,
+    socket: ClientSocket,
+    peer_addr: SocketAddr,
+    decoder: ProtocolDecoder,
+    buf_out: netbuf::Buf,
+    timeout: timer::Timeout,
+    pending_close: bool,
+}
+
+impl NetworkClient {
+    pub fn new(
+        id: ClientId,
+        socket: ClientSocket,
+        peer_addr: SocketAddr,
+        timeout: timer::Timeout,
+    ) -> NetworkClient {
+        NetworkClient {
+            id,
+            socket,
+            peer_addr,
+            decoder: ProtocolDecoder::new(),
+            buf_out: netbuf::Buf::new(),
+            timeout,
+            pending_close: false,
+        }
+    }
+
+    #[cfg(feature = "tls-connections")]
+    fn handshake_impl(
+        &mut self,
+        handshake: MidHandshakeSslStream<TcpStream>,
+    ) -> io::Result<NetworkClientState> {
+        match handshake.handshake() {
+            Ok(stream) => {
+                self.socket = ClientSocket::SslStream(stream);
+                debug!(
+                    "TLS handshake with {} ({}) completed",
+                    self.id, self.peer_addr
+                );
+                Ok(NetworkClientState::Connected)
+            }
+            Err(HandshakeError::WouldBlock(new_handshake)) => {
+                self.socket = ClientSocket::SslHandshake(Some(new_handshake));
+                Ok(NetworkClientState::Idle)
+            }
+            Err(HandshakeError::Failure(new_handshake)) => {
+                self.socket = ClientSocket::SslHandshake(Some(new_handshake));
+                debug!("TLS handshake with {} ({}) failed", self.id, self.peer_addr);
+                Err(Error::new(ErrorKind::Other, "Connection failure"))
+            }
+            Err(HandshakeError::SetupFailure(_)) => unreachable!(),
+        }
+    }
+
+    fn read_impl<R: Read>(
+        decoder: &mut ProtocolDecoder,
+        source: &mut R,
+        id: ClientId,
+        addr: &SocketAddr,
+    ) -> NetworkResult<Vec<HwProtocolMessage>> {
+        let mut bytes_read = 0;
+        let result = loop {
+            match decoder.read_from(source) {
+                Ok(bytes) => {
+                    debug!("Client {}: read {} bytes", id, bytes);
+                    bytes_read += bytes;
+                    if bytes == 0 {
+                        let result = if bytes_read == 0 {
+                            info!("EOF for client {} ({})", id, addr);
+                            (Vec::new(), NetworkClientState::Closed)
+                        } else {
+                            (decoder.extract_messages(), NetworkClientState::NeedsRead)
+                        };
+                        break Ok(result);
+                    } else if bytes_read >= MAX_BYTES_PER_READ {
+                        break Ok((decoder.extract_messages(), NetworkClientState::NeedsRead));
+                    }
+                }
+                Err(ref error) if error.kind() == ErrorKind::WouldBlock => {
+                    let messages = if bytes_read == 0 {
+                        Vec::new()
+                    } else {
+                        decoder.extract_messages()
+                    };
+                    break Ok((messages, NetworkClientState::Idle));
+                }
+                Err(error) => break Err(error),
+            }
+        };
+        result
+    }
+
+    pub fn read(&mut self) -> NetworkResult<Vec<HwProtocolMessage>> {
+        match self.socket {
+            ClientSocket::Plain(ref mut stream) => {
+                NetworkClient::read_impl(&mut self.decoder, stream, self.id, &self.peer_addr)
+            }
+            #[cfg(feature = "tls-connections")]
+            ClientSocket::SslHandshake(ref mut handshake_opt) => {
+                let handshake = std::mem::replace(handshake_opt, None).unwrap();
+                Ok((Vec::new(), self.handshake_impl(handshake)?))
+            }
+            #[cfg(feature = "tls-connections")]
+            ClientSocket::SslStream(ref mut stream) => {
+                NetworkClient::read_impl(&mut self.decoder, stream, self.id, &self.peer_addr)
+            }
+        }
+    }
+
+    fn write_impl<W: Write>(
+        buf_out: &mut netbuf::Buf,
+        destination: &mut W,
+        close_on_empty: bool,
+    ) -> NetworkResult<()> {
+        let result = loop {
+            match buf_out.write_to(destination) {
+                Ok(bytes) if buf_out.is_empty() || bytes == 0 => {
+                    let status = if buf_out.is_empty() && close_on_empty {
+                        NetworkClientState::Closed
+                    } else {
+                        NetworkClientState::Idle
+                    };
+                    break Ok(((), status));
+                }
+                Ok(_) => (),
+                Err(ref error)
+                    if error.kind() == ErrorKind::Interrupted
+                        || error.kind() == ErrorKind::WouldBlock =>
+                {
+                    break Ok(((), NetworkClientState::NeedsWrite));
+                }
+                Err(error) => break Err(error),
+            }
+        };
+        result
+    }
+
+    pub fn write(&mut self) -> NetworkResult<()> {
+        let result = match self.socket {
+            ClientSocket::Plain(ref mut stream) => {
+                NetworkClient::write_impl(&mut self.buf_out, stream, self.pending_close)
+            }
+            #[cfg(feature = "tls-connections")]
+            ClientSocket::SslHandshake(ref mut handshake_opt) => {
+                let handshake = std::mem::replace(handshake_opt, None).unwrap();
+                Ok(((), self.handshake_impl(handshake)?))
+            }
+            #[cfg(feature = "tls-connections")]
+            ClientSocket::SslStream(ref mut stream) => {
+                NetworkClient::write_impl(&mut self.buf_out, stream, self.pending_close)
+            }
+        };
+
+        self.socket.inner().flush()?;
+        result
+    }
+
+    pub fn send_raw_msg(&mut self, msg: &[u8]) {
+        self.buf_out.write_all(msg).unwrap();
+    }
+
+    pub fn send_string(&mut self, msg: &str) {
+        self.send_raw_msg(&msg.as_bytes());
+    }
+
+    pub fn replace_timeout(&mut self, timeout: timer::Timeout) -> timer::Timeout {
+        replace(&mut self.timeout, timeout)
+    }
+
+    pub fn has_pending_sends(&self) -> bool {
+        !self.buf_out.is_empty()
+    }
+}
+
+#[cfg(feature = "tls-connections")]
+struct ServerSsl {
+    listener: TcpListener,
+    context: SslContext,
+}
+
+#[cfg(feature = "official-server")]
+pub struct IoLayer {
+    next_request_id: RequestId,
+    request_queue: Vec<(RequestId, ClientId)>,
+    io_thread: IoThread,
+}
+
+#[cfg(feature = "official-server")]
+impl IoLayer {
+    fn new() -> Self {
+        Self {
+            next_request_id: 0,
+            request_queue: vec![],
+            io_thread: IoThread::new(),
+        }
+    }
+
+    fn send(&mut self, client_id: ClientId, task: IoTask) {
+        let request_id = self.next_request_id;
+        self.next_request_id += 1;
+        self.request_queue.push((request_id, client_id));
+        self.io_thread.send(request_id, task);
+    }
+
+    fn try_recv(&mut self) -> Option<(ClientId, IoResult)> {
+        let (request_id, result) = self.io_thread.try_recv()?;
+        if let Some(index) = self
+            .request_queue
+            .iter()
+            .position(|(id, _)| *id == request_id)
+        {
+            let (_, client_id) = self.request_queue.swap_remove(index);
+            Some((client_id, result))
+        } else {
+            None
+        }
+    }
+
+    fn cancel(&mut self, client_id: ClientId) {
+        let mut index = 0;
+        while index < self.request_queue.len() {
+            if self.request_queue[index].1 == client_id {
+                self.request_queue.swap_remove(index);
+            } else {
+                index += 1;
+            }
+        }
+    }
+}
+
+enum TimeoutEvent {
+    SendPing { probes_count: u8 },
+    DropClient,
+}
+
+struct TimerData(TimeoutEvent, ClientId);
+
+pub struct NetworkLayer {
+    listener: TcpListener,
+    server: HwServer,
+    clients: Slab<NetworkClient>,
+    pending: HashSet<(ClientId, NetworkClientState)>,
+    pending_cache: Vec<(ClientId, NetworkClientState)>,
+    #[cfg(feature = "tls-connections")]
+    ssl: ServerSsl,
+    #[cfg(feature = "official-server")]
+    io: IoLayer,
+    timer: timer::Timer<TimerData>,
+}
+
+fn register_read<E: Evented>(poll: &Poll, evented: &E, token: mio::Token) -> io::Result<()> {
+    poll.register(evented, token, Ready::readable(), PollOpt::edge())
+}
+
+fn create_ping_timeout(
+    timer: &mut timer::Timer<TimerData>,
+    probes_count: u8,
+    client_id: ClientId,
+) -> timer::Timeout {
+    timer.set_timeout(
+        SEND_PING_TIMEOUT,
+        TimerData(TimeoutEvent::SendPing { probes_count }, client_id),
+    )
+}
+
+fn create_drop_timeout(timer: &mut timer::Timer<TimerData>, client_id: ClientId) -> timer::Timeout {
+    timer.set_timeout(
+        DROP_CLIENT_TIMEOUT,
+        TimerData(TimeoutEvent::DropClient, client_id),
+    )
+}
+
+impl NetworkLayer {
+    pub fn register(&self, poll: &Poll) -> io::Result<()> {
+        register_read(poll, &self.listener, utils::SERVER_TOKEN)?;
+        #[cfg(feature = "tls-connections")]
+        register_read(poll, &self.ssl.listener, utils::SECURE_SERVER_TOKEN)?;
+        register_read(poll, &self.timer, utils::TIMER_TOKEN)?;
+
+        #[cfg(feature = "official-server")]
+        self.io.io_thread.register_rx(poll, utils::IO_TOKEN)?;
+
+        Ok(())
+    }
+
+    fn deregister_client(&mut self, poll: &Poll, id: ClientId, is_error: bool) {
+        if let Some(ref mut client) = self.clients.get_mut(id) {
+            poll.deregister(client.socket.inner())
+                .expect("could not deregister socket");
+            if client.has_pending_sends() && !is_error {
+                info!(
+                    "client {} ({}) pending removal",
+                    client.id, client.peer_addr
+                );
+                client.pending_close = true;
+                poll.register(
+                    client.socket.inner(),
+                    Token(id),
+                    Ready::writable(),
+                    PollOpt::edge(),
+                )
+                .unwrap_or_else(|_| {
+                    self.clients.remove(id);
+                });
+            } else {
+                info!("client {} ({}) removed", client.id, client.peer_addr);
+                self.clients.remove(id);
+            }
+            #[cfg(feature = "official-server")]
+            self.io.cancel(id);
+        }
+    }
+
+    fn register_client(
+        &mut self,
+        poll: &Poll,
+        client_socket: ClientSocket,
+        addr: SocketAddr,
+    ) -> io::Result<ClientId> {
+        let entry = self.clients.vacant_entry();
+        let client_id = entry.key();
+
+        poll.register(
+            client_socket.inner(),
+            Token(client_id),
+            Ready::readable() | Ready::writable(),
+            PollOpt::edge(),
+        )?;
+
+        let client = NetworkClient::new(
+            client_id,
+            client_socket,
+            addr,
+            create_ping_timeout(&mut self.timer, PING_PROBES_COUNT - 1, client_id),
+        );
+        info!("client {} ({}) added", client.id, client.peer_addr);
+        entry.insert(client);
+
+        Ok(client_id)
+    }
+
+    fn handle_response(&mut self, mut response: handlers::Response, poll: &Poll) {
+        if response.is_empty() {
+            return;
+        }
+
+        debug!("{} pending server messages", response.len());
+        let output = response.extract_messages(&mut self.server);
+        for (clients, message) in output {
+            debug!("Message {:?} to {:?}", message, clients);
+            let msg_string = message.to_raw_protocol();
+            for client_id in clients {
+                if let Some(client) = self.clients.get_mut(client_id) {
+                    client.send_string(&msg_string);
+                    self.pending
+                        .insert((client_id, NetworkClientState::NeedsWrite));
+                }
+            }
+        }
+
+        for client_id in response.extract_removed_clients() {
+            self.deregister_client(poll, client_id, false);
+        }
+
+        #[cfg(feature = "official-server")]
+        {
+            let client_id = response.client_id();
+            for task in response.extract_io_tasks() {
+                self.io.send(client_id, task);
+            }
+        }
+    }
+
+    pub fn handle_timeout(&mut self, poll: &Poll) -> io::Result<()> {
+        while let Some(TimerData(event, client_id)) = self.timer.poll() {
+            match event {
+                TimeoutEvent::SendPing { probes_count } => {
+                    if let Some(ref mut client) = self.clients.get_mut(client_id) {
+                        client.send_string(&HwServerMessage::Ping.to_raw_protocol());
+                        client.write()?;
+                        let timeout = if probes_count != 0 {
+                            create_ping_timeout(&mut self.timer, probes_count - 1, client_id)
+                        } else {
+                            create_drop_timeout(&mut self.timer, client_id)
+                        };
+                        client.replace_timeout(timeout);
+                    }
+                }
+                TimeoutEvent::DropClient => {
+                    if let Some(ref mut client) = self.clients.get_mut(client_id) {
+                        client.send_string(
+                            &HwServerMessage::Bye("Ping timeout".to_string()).to_raw_protocol(),
+                        );
+                        client.write();
+                    }
+                    self.operation_failed(
+                        poll,
+                        client_id,
+                        &ErrorKind::TimedOut.into(),
+                        "No ping response",
+                    )?;
+                }
+            }
+        }
+        Ok(())
+    }
+
+    #[cfg(feature = "official-server")]
+    pub fn handle_io_result(&mut self, poll: &Poll) -> io::Result<()> {
+        while let Some((client_id, result)) = self.io.try_recv() {
+            debug!("Handling io result {:?} for client {}", result, client_id);
+            let mut response = handlers::Response::new(client_id);
+            handlers::handle_io_result(&mut self.server, client_id, &mut response, result);
+            self.handle_response(response, poll);
+        }
+        Ok(())
+    }
+
+    fn create_client_socket(&self, socket: TcpStream) -> io::Result<ClientSocket> {
+        Ok(ClientSocket::Plain(socket))
+    }
+
+    #[cfg(feature = "tls-connections")]
+    fn create_client_secure_socket(&self, socket: TcpStream) -> io::Result<ClientSocket> {
+        let ssl = Ssl::new(&self.ssl.context).unwrap();
+        let mut builder = SslStreamBuilder::new(ssl, socket);
+        builder.set_accept_state();
+        match builder.handshake() {
+            Ok(stream) => Ok(ClientSocket::SslStream(stream)),
+            Err(HandshakeError::WouldBlock(stream)) => Ok(ClientSocket::SslHandshake(Some(stream))),
+            Err(e) => {
+                debug!("OpenSSL handshake failed: {}", e);
+                Err(Error::new(ErrorKind::Other, "Connection failure"))
+            }
+        }
+    }
+
+    fn init_client(&mut self, poll: &Poll, client_id: ClientId) {
+        let mut response = handlers::Response::new(client_id);
+
+        if let ClientSocket::Plain(_) = self.clients[client_id].socket {
+            #[cfg(feature = "tls-connections")]
+            response.add(Redirect(self.ssl.listener.local_addr().unwrap().port()).send_self())
+        }
+
+        handlers::handle_client_accept(
+            &mut self.server,
+            client_id,
+            &mut response,
+            self.clients[client_id].peer_addr.ip().is_loopback(),
+        );
+        self.handle_response(response, poll);
+    }
+
+    pub fn accept_client(&mut self, poll: &Poll, server_token: mio::Token) -> io::Result<()> {
+        match server_token {
+            utils::SERVER_TOKEN => {
+                let (client_socket, addr) = self.listener.accept()?;
+                info!("Connected(plaintext): {}", addr);
+                let client_id =
+                    self.register_client(poll, self.create_client_socket(client_socket)?, addr)?;
+                self.init_client(poll, client_id);
+            }
+            #[cfg(feature = "tls-connections")]
+            utils::SECURE_SERVER_TOKEN => {
+                let (client_socket, addr) = self.ssl.listener.accept()?;
+                info!("Connected(TLS): {}", addr);
+                self.register_client(poll, self.create_client_secure_socket(client_socket)?, addr)?;
+            }
+            _ => unreachable!(),
+        }
+
+        Ok(())
+    }
+
+    fn operation_failed(
+        &mut self,
+        poll: &Poll,
+        client_id: ClientId,
+        error: &Error,
+        msg: &str,
+    ) -> io::Result<()> {
+        let addr = if let Some(ref mut client) = self.clients.get_mut(client_id) {
+            client.peer_addr
+        } else {
+            SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 0)
+        };
+        debug!("{}({}): {}", msg, addr, error);
+        self.client_error(poll, client_id)
+    }
+
+    pub fn client_readable(&mut self, poll: &Poll, client_id: ClientId) -> io::Result<()> {
+        let messages = if let Some(ref mut client) = self.clients.get_mut(client_id) {
+            let timeout = client.replace_timeout(create_ping_timeout(
+                &mut self.timer,
+                PING_PROBES_COUNT - 1,
+                client_id,
+            ));
+            self.timer.cancel_timeout(&timeout);
+            client.read()
+        } else {
+            warn!("invalid readable client: {}", client_id);
+            Ok((Vec::new(), NetworkClientState::Idle))
+        };
+
+        let mut response = handlers::Response::new(client_id);
+
+        match messages {
+            Ok((messages, state)) => {
+                for message in messages {
+                    debug!("Handling message {:?} for client {}", message, client_id);
+                    handlers::handle(&mut self.server, client_id, &mut response, message);
+                }
+                match state {
+                    NetworkClientState::NeedsRead => {
+                        self.pending.insert((client_id, state));
+                    }
+                    NetworkClientState::Closed => self.client_error(&poll, client_id)?,
+                    #[cfg(feature = "tls-connections")]
+                    NetworkClientState::Connected => self.init_client(poll, client_id),
+                    _ => {}
+                };
+            }
+            Err(e) => self.operation_failed(
+                poll,
+                client_id,
+                &e,
+                "Error while reading from client socket",
+            )?,
+        }
+
+        self.handle_response(response, poll);
+
+        Ok(())
+    }
+
+    pub fn client_writable(&mut self, poll: &Poll, client_id: ClientId) -> io::Result<()> {
+        let result = if let Some(ref mut client) = self.clients.get_mut(client_id) {
+            client.write()
+        } else {
+            warn!("invalid writable client: {}", client_id);
+            Ok(((), NetworkClientState::Idle))
+        };
+
+        match result {
+            Ok(((), state)) if state == NetworkClientState::NeedsWrite => {
+                self.pending.insert((client_id, state));
+            }
+            Ok(((), state)) if state == NetworkClientState::Closed => {
+                self.deregister_client(poll, client_id, false);
+            }
+            Ok(_) => (),
+            Err(e) => {
+                self.operation_failed(poll, client_id, &e, "Error while writing to client socket")?
+            }
+        }
+
+        Ok(())
+    }
+
+    pub fn client_error(&mut self, poll: &Poll, client_id: ClientId) -> io::Result<()> {
+        let pending_close = self.clients[client_id].pending_close;
+        self.deregister_client(poll, client_id, true);
+
+        if !pending_close {
+            let mut response = handlers::Response::new(client_id);
+            handlers::handle_client_loss(&mut self.server, client_id, &mut response);
+            self.handle_response(response, poll);
+        }
+
+        Ok(())
+    }
+
+    pub fn has_pending_operations(&self) -> bool {
+        !self.pending.is_empty()
+    }
+
+    pub fn on_idle(&mut self, poll: &Poll) -> io::Result<()> {
+        if self.has_pending_operations() {
+            let mut cache = replace(&mut self.pending_cache, Vec::new());
+            cache.extend(self.pending.drain());
+            for (id, state) in cache.drain(..) {
+                match state {
+                    NetworkClientState::NeedsRead => self.client_readable(poll, id)?,
+                    NetworkClientState::NeedsWrite => self.client_writable(poll, id)?,
+                    _ => {}
+                }
+            }
+            swap(&mut cache, &mut self.pending_cache);
+        }
+        Ok(())
+    }
+}
+
+pub struct NetworkLayerBuilder {
+    listener: Option<TcpListener>,
+    secure_listener: Option<TcpListener>,
+    clients_capacity: usize,
+    rooms_capacity: usize,
+}
+
+impl Default for NetworkLayerBuilder {
+    fn default() -> Self {
+        Self {
+            clients_capacity: 1024,
+            rooms_capacity: 512,
+            listener: None,
+            secure_listener: None,
+        }
+    }
+}
+
+impl NetworkLayerBuilder {
+    pub fn with_listener(self, listener: TcpListener) -> Self {
+        Self {
+            listener: Some(listener),
+            ..self
+        }
+    }
+
+    pub fn with_secure_listener(self, listener: TcpListener) -> Self {
+        Self {
+            secure_listener: Some(listener),
+            ..self
+        }
+    }
+
+    #[cfg(feature = "tls-connections")]
+    fn create_ssl_context(listener: TcpListener) -> ServerSsl {
+        let mut builder = SslContextBuilder::new(SslMethod::tls()).unwrap();
+        builder.set_verify(SslVerifyMode::NONE);
+        builder.set_read_ahead(true);
+        builder
+            .set_certificate_file("ssl/cert.pem", SslFiletype::PEM)
+            .expect("Cannot find certificate file");
+        builder
+            .set_private_key_file("ssl/key.pem", SslFiletype::PEM)
+            .expect("Cannot find private key file");
+        builder.set_options(SslOptions::NO_COMPRESSION);
+        builder.set_cipher_list("DEFAULT:!LOW:!RC4:!EXP").unwrap();
+        ServerSsl {
+            listener,
+            context: builder.build(),
+        }
+    }
+
+    pub fn build(self) -> NetworkLayer {
+        let server = HwServer::new(self.clients_capacity, self.rooms_capacity);
+        let clients = Slab::with_capacity(self.clients_capacity);
+        let pending = HashSet::with_capacity(2 * self.clients_capacity);
+        let pending_cache = Vec::with_capacity(2 * self.clients_capacity);
+        let timer = timer::Builder::default().build();
+
+        NetworkLayer {
+            listener: self.listener.expect("No listener provided"),
+            server,
+            clients,
+            pending,
+            pending_cache,
+            #[cfg(feature = "tls-connections")]
+            ssl: Self::create_ssl_context(
+                self.secure_listener.expect("No secure listener provided"),
+            ),
+            #[cfg(feature = "official-server")]
+            io: IoLayer::new(),
+            timer,
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hedgewars-server/src/utils.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,74 @@
+use base64::encode;
+use mio;
+use std::iter::Iterator;
+
+pub const SERVER_VERSION: u32 = 3;
+pub const SERVER_TOKEN: mio::Token = mio::Token(1_000_000_000);
+pub const SECURE_SERVER_TOKEN: mio::Token = mio::Token(1_000_000_001);
+pub const TIMER_TOKEN: mio::Token = mio::Token(1_000_000_002);
+pub const IO_TOKEN: mio::Token = mio::Token(1_000_000_003);
+
+pub fn is_name_illegal(name: &str) -> bool {
+    name.len() > 40
+        || name.trim().is_empty()
+        || name.trim() != name
+        || name
+            .chars()
+            .any(|c| "$()*+?[]^{|}\x7F".contains(c) || ('\x00'..='\x1F').contains(&c))
+}
+
+pub fn to_engine_msg<T>(msg: T) -> String
+where
+    T: Iterator<Item = u8> + Clone,
+{
+    let mut tmp = Vec::new();
+    tmp.push(msg.clone().count() as u8);
+    tmp.extend(msg);
+    encode(&tmp)
+}
+
+pub fn protocol_version_string(protocol_number: u16) -> &'static str {
+    match protocol_number {
+        17 => "0.9.7-dev",
+        19 => "0.9.7",
+        20 => "0.9.8-dev",
+        21 => "0.9.8",
+        22 => "0.9.9-dev",
+        23 => "0.9.9",
+        24 => "0.9.10-dev",
+        25 => "0.9.10",
+        26 => "0.9.11-dev",
+        27 => "0.9.11",
+        28 => "0.9.12-dev",
+        29 => "0.9.12",
+        30 => "0.9.13-dev",
+        31 => "0.9.13",
+        32 => "0.9.14-dev",
+        33 => "0.9.14",
+        34 => "0.9.15-dev",
+        35 => "0.9.14.1",
+        37 => "0.9.15",
+        38 => "0.9.16-dev",
+        39 => "0.9.16",
+        40 => "0.9.17-dev",
+        41 => "0.9.17",
+        42 => "0.9.18-dev",
+        43 => "0.9.18",
+        44 => "0.9.19-dev",
+        45 => "0.9.19",
+        46 => "0.9.20-dev",
+        47 => "0.9.20",
+        48 => "0.9.21-dev",
+        49 => "0.9.21",
+        50 => "0.9.22-dev",
+        51 => "0.9.22",
+        52 => "0.9.23-dev",
+        53 => "0.9.23",
+        54 => "0.9.24-dev",
+        55 => "0.9.24",
+        56 => "0.9.25-dev",
+        57 => "0.9.25",
+        58 => "1.0.0-dev",
+        _ => "Unknown",
+    }
+}
--- a/rust/hwphysics/src/collision.rs	Mon Jan 14 15:11:15 2019 -0500
+++ b/rust/hwphysics/src/collision.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -1,128 +1,157 @@
-use std::{
-    ops::RangeInclusive
-};
-
-use crate::{
-    common::{GearId, GearData, GearDataProcessor},
-    physics::PhysicsData,
-    grid::Grid
-};
-
-use fpnum::*;
-use integral_geometry::{
-    Point, Size, GridIndex
-};
-use land2d::Land2D;
-
-pub fn fppoint_round(point: &FPPoint) -> Point {
-    Point::new(point.x().round() as i32, point.y().round() as i32)
-}
-
-#[derive(PartialEq, Eq, Clone, Copy, Debug)]
-pub struct CircleBounds {
-    pub center: FPPoint,
-    pub radius: FPNum
-}
-
-impl CircleBounds {
-    pub fn intersects(&self, other: &CircleBounds) -> bool {
-        (other.center - self.center).is_in_range(self.radius + other.radius)
-    }
-
-    pub fn rows(&self) -> impl Iterator<Item = (usize, RangeInclusive<usize>)> {
-        let radius = self.radius.abs_round() as usize;
-        let center = Point::from_fppoint(&self.center);
-        (center.y as usize - radius..=center.y as usize + radius)
-            .map(move |row| (row, center.x as usize - radius..=center.x as usize + radius))
-    }
-}
-
-#[derive(PartialEq, Eq, Clone, Copy, Debug)]
-pub struct CollisionData {
-    pub bounds: CircleBounds
-}
-
-impl GearData for CollisionData {}
-
-#[derive(PartialEq, Eq, Clone, Copy, Debug)]
-pub struct ContactData {
-    pub elasticity: FPNum,
-    pub friction: FPNum
-}
-
-impl GearData for ContactData {}
-
-struct EnabledCollisionsCollection {
-    gear_ids: Vec<GearId>,
-    collisions: Vec<CollisionData>
-}
-
-impl EnabledCollisionsCollection {
-    fn new() -> Self {
-        Self {
-            gear_ids: Vec::new(),
-            collisions: Vec::new()
-        }
-    }
-
-    fn push(&mut self, gear_id: GearId, collision: CollisionData) {
-        self.gear_ids.push(gear_id);
-        self.collisions.push(collision);
-    }
-
-    fn iter(&self) -> impl Iterator<Item = (GearId, &CollisionData)> {
-        self.gear_ids.iter().cloned().zip(self.collisions.iter())
-    }
-}
-
-pub struct CollisionProcessor {
-    grid: Grid,
-    enabled_collisions: EnabledCollisionsCollection,
-
-    detected_collisions: DetectedCollisions,
-}
-
-pub struct DetectedCollisions {
-    pub pairs: Vec<(GearId, GearId)>,
-    pub positions: Vec<Point>
-}
-
-impl DetectedCollisions {
-    pub fn new(capacity: usize) -> Self {
-        Self {
-            pairs: Vec::with_capacity(capacity),
-            positions: Vec::with_capacity(capacity),
-        }
-    }
-
-    pub fn push(&mut self, contact_gear_id1: GearId, contact_gear_id2: GearId, position: &FPPoint) {
-        self.pairs.push((contact_gear_id1, contact_gear_id2));
-        self.positions.push(fppoint_round(&position));
-    }
-}
-
-impl CollisionProcessor {
-    pub fn new(size: Size) -> Self {
-        Self {
-            grid: Grid::new(size),
-            enabled_collisions: EnabledCollisionsCollection::new(),
-            detected_collisions: DetectedCollisions::new(0)
-        }
-    }
-
-    pub fn process(&mut self, land: &Land2D<u32>, updates: &crate::physics::PositionUpdates) {
-        self.grid.check_collisions(&mut self.detected_collisions);
-
-        for (gear_id, collision) in self.enabled_collisions.iter() {
-            if collision.bounds.rows().any(|(y, r)| (&land[y][r]).iter().any(|v| *v != 0)) {
-                self.detected_collisions.push(gear_id, 0, &collision.bounds.center)
-            }
-        }
-    }
-}
-
-impl GearDataProcessor<CollisionData> for CollisionProcessor {
-    fn add(&mut self, gear_id: GearId, gear_data: CollisionData) {
-        self.grid.insert_static(gear_id, &gear_data.bounds);
-    }
-}
\ No newline at end of file
+use std::ops::RangeInclusive;
+
+use crate::{
+    common::{GearData, GearDataProcessor, GearId},
+    grid::Grid,
+};
+
+use fpnum::*;
+use integral_geometry::{Point, Size};
+use land2d::Land2D;
+
+pub fn fppoint_round(point: &FPPoint) -> Point {
+    Point::new(point.x().round(), point.y().round())
+}
+
+#[derive(PartialEq, Eq, Clone, Copy, Debug)]
+pub struct CircleBounds {
+    pub center: FPPoint,
+    pub radius: FPNum,
+}
+
+impl CircleBounds {
+    pub fn intersects(&self, other: &CircleBounds) -> bool {
+        (other.center - self.center).is_in_range(self.radius + other.radius)
+    }
+
+    pub fn rows(&self) -> impl Iterator<Item = (usize, RangeInclusive<usize>)> {
+        let radius = self.radius.abs_round() as usize;
+        let center = Point::from_fppoint(&self.center);
+        (center.y as usize - radius..=center.y as usize + radius)
+            .map(move |row| (row, center.x as usize - radius..=center.x as usize + radius))
+    }
+}
+
+#[derive(PartialEq, Eq, Clone, Copy, Debug)]
+pub struct CollisionData {
+    pub bounds: CircleBounds,
+}
+
+impl GearData for CollisionData {}
+
+#[derive(PartialEq, Eq, Clone, Copy, Debug)]
+pub struct ContactData {
+    pub elasticity: FPNum,
+    pub friction: FPNum,
+}
+
+impl GearData for ContactData {}
+
+struct EnabledCollisionsCollection {
+    gear_ids: Vec<GearId>,
+    collisions: Vec<CollisionData>,
+}
+
+impl EnabledCollisionsCollection {
+    fn new() -> Self {
+        Self {
+            gear_ids: Vec::new(),
+            collisions: Vec::new(),
+        }
+    }
+
+    fn push(&mut self, gear_id: GearId, collision: CollisionData) {
+        self.gear_ids.push(gear_id);
+        self.collisions.push(collision);
+    }
+
+    fn iter(&self) -> impl Iterator<Item = (GearId, &CollisionData)> {
+        self.gear_ids.iter().cloned().zip(self.collisions.iter())
+    }
+}
+
+pub struct CollisionProcessor {
+    grid: Grid,
+    enabled_collisions: EnabledCollisionsCollection,
+
+    detected_collisions: DetectedCollisions,
+}
+
+pub struct DetectedCollisions {
+    pub pairs: Vec<(GearId, Option<GearId>)>,
+    pub positions: Vec<Point>,
+}
+
+impl DetectedCollisions {
+    pub fn new(capacity: usize) -> Self {
+        Self {
+            pairs: Vec::with_capacity(capacity),
+            positions: Vec::with_capacity(capacity),
+        }
+    }
+
+    pub fn push(
+        &mut self,
+        contact_gear_id1: GearId,
+        contact_gear_id2: Option<GearId>,
+        position: &FPPoint,
+    ) {
+        self.pairs.push((contact_gear_id1, contact_gear_id2));
+        self.positions.push(fppoint_round(&position));
+    }
+
+    pub fn clear(&mut self) {
+        self.pairs.clear();
+        self.positions.clear()
+    }
+}
+
+impl CollisionProcessor {
+    pub fn new(size: Size) -> Self {
+        Self {
+            grid: Grid::new(size),
+            enabled_collisions: EnabledCollisionsCollection::new(),
+            detected_collisions: DetectedCollisions::new(0),
+        }
+    }
+
+    pub fn process(
+        &mut self,
+        land: &Land2D<u32>,
+        updates: &crate::physics::PositionUpdates,
+    ) -> &DetectedCollisions {
+        self.detected_collisions.clear();
+        for (id, old_position, new_position) in updates.iter() {
+            self.grid.update_position(id, old_position, new_position)
+        }
+
+        self.grid.check_collisions(&mut self.detected_collisions);
+
+        for (gear_id, collision) in self.enabled_collisions.iter() {
+            if collision
+                .bounds
+                .rows()
+                .any(|(y, r)| (&land[y][r]).iter().any(|v| *v != 0))
+            {
+                self.detected_collisions
+                    .push(gear_id, None, &collision.bounds.center)
+            }
+        }
+
+        &self.detected_collisions
+    }
+}
+
+impl GearDataProcessor<CollisionData> for CollisionProcessor {
+    fn add(&mut self, gear_id: GearId, gear_data: CollisionData) {
+        self.grid.insert_static(gear_id, &gear_data.bounds);
+    }
+
+    fn remove(&mut self, gear_id: GearId) {
+        self.grid.remove(gear_id);
+    }
+
+    fn get(&mut self, gear_id: GearId) -> Option<CollisionData> {
+        None
+    }
+}
--- a/rust/hwphysics/src/common.rs	Mon Jan 14 15:11:15 2019 -0500
+++ b/rust/hwphysics/src/common.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -1,10 +1,163 @@
-pub type GearId = u16;
-pub trait GearData {}
-
-pub trait GearDataProcessor<T: GearData> {
-    fn add(&mut self, gear_id: GearId, gear_data: T);
-}
-
-pub trait GearDataAggregator<T: GearData> {
-    fn find_processor(&mut self) -> &mut GearDataProcessor<T>;
-}
+use fpnum::FPNum;
+use std::{
+    collections::BinaryHeap,
+    num::NonZeroU16,
+    ops::{Add, Index, IndexMut},
+};
+
+pub type GearId = NonZeroU16;
+pub trait GearData {}
+
+#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Debug)]
+#[repr(transparent)]
+pub struct Millis(u32);
+
+impl Millis {
+    #[inline]
+    pub fn new(value: u32) -> Self {
+        Self(value)
+    }
+
+    #[inline]
+    pub fn get(self) -> u32 {
+        self.0
+    }
+
+    #[inline]
+    pub fn to_fixed(self) -> FPNum {
+        FPNum::new(self.0 as i32, 1000)
+    }
+}
+
+impl Add for Millis {
+    type Output = Self;
+
+    fn add(self, rhs: Self) -> Self::Output {
+        Self(self.0 + rhs.0)
+    }
+}
+
+pub trait GearDataProcessor<T: GearData> {
+    fn add(&mut self, gear_id: GearId, gear_data: T);
+    fn remove(&mut self, gear_id: GearId);
+    fn get(&mut self, gear_id: GearId) -> Option<T>;
+}
+
+pub trait GearDataAggregator<T: GearData> {
+    fn find_processor(&mut self) -> &mut GearDataProcessor<T>;
+}
+
+pub struct GearAllocator {
+    max_id: u16,
+    free_ids: BinaryHeap<GearId>,
+}
+
+impl GearAllocator {
+    pub fn new() -> Self {
+        Self {
+            max_id: 0,
+            free_ids: BinaryHeap::with_capacity(1024),
+        }
+    }
+
+    pub fn alloc(&mut self) -> Option<GearId> {
+        self.free_ids.pop().or_else(|| {
+            self.max_id.checked_add(1).and_then(|new_max_id| {
+                self.max_id = new_max_id;
+                NonZeroU16::new(new_max_id)
+            })
+        })
+    }
+
+    pub fn free(&mut self, gear_id: GearId) {
+        self.free_ids.push(gear_id)
+    }
+}
+
+#[derive(Clone, Copy, Default)]
+pub struct LookupEntry<T> {
+    index: Option<NonZeroU16>,
+    value: T,
+}
+
+impl<T> LookupEntry<T> {
+    #[inline]
+    pub fn index(&self) -> u16 {
+        self.index.map(|i| i.get()).unwrap_or(0) - 1
+    }
+
+    #[inline]
+    pub fn set_index(&mut self, index: u16) {
+        self.index = unsafe { Some(NonZeroU16::new_unchecked(index.saturating_add(1))) };
+    }
+
+    #[inline]
+    pub fn value(&self) -> &T {
+        &self.value
+    }
+
+    #[inline]
+    pub fn value_mut(&mut self) -> &mut T {
+        &mut self.value
+    }
+
+    #[inline]
+    pub fn set_value(&mut self, value: T) {
+        self.value = value;
+    }
+}
+
+pub struct GearDataLookup<T> {
+    lookup: Box<[LookupEntry<T>]>,
+}
+
+impl<T: Default + Copy> GearDataLookup<T> {
+    pub fn new() -> Self {
+        Self {
+            lookup: vec![LookupEntry::default(); u16::max_value() as usize].into_boxed_slice(),
+        }
+    }
+}
+
+impl<T> GearDataLookup<T> {
+    pub fn add(&mut self, gear_id: GearId, index: u16, value: T) {
+        // All possible Gear IDs are valid indices
+        let entry = unsafe { self.lookup.get_unchecked_mut(gear_id.get() as usize - 1) };
+        entry.set_index(index);
+        entry.set_value(value);
+    }
+
+    pub fn get(&self, gear_id: GearId) -> Option<&LookupEntry<T>> {
+        // All possible Gear IDs are valid indices
+        let entry = unsafe { self.lookup.get_unchecked(gear_id.get() as usize - 1) };
+        if let Some(index) = entry.index {
+            Some(entry)
+        } else {
+            None
+        }
+    }
+
+    pub fn get_mut(&mut self, gear_id: GearId) -> Option<&mut LookupEntry<T>> {
+        // All possible Gear IDs are valid indices
+        let entry = unsafe { self.lookup.get_unchecked_mut(gear_id.get() as usize - 1) };
+        if let Some(index) = entry.index {
+            Some(entry)
+        } else {
+            None
+        }
+    }
+}
+
+impl<T> Index<GearId> for GearDataLookup<T> {
+    type Output = LookupEntry<T>;
+
+    fn index(&self, index: GearId) -> &Self::Output {
+        self.get(index).unwrap()
+    }
+}
+
+impl<T> IndexMut<GearId> for GearDataLookup<T> {
+    fn index_mut(&mut self, index: GearId) -> &mut Self::Output {
+        self.get_mut(index).unwrap()
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hwphysics/src/data.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,97 @@
+use std::any::{Any, TypeId};
+
+const BLOCK_SIZE: usize = 8192;
+
+pub trait TypeTuple {
+    type Storage: Default;
+
+    fn len() -> usize;
+    fn get_types(dest: &mut Vec<TypeId>);
+}
+
+//TODO macroise this template for tuples up to sufficient size
+impl<T: 'static> TypeTuple for (T,) {
+    type Storage = (Vec<T>,);
+
+    #[inline]
+    fn len() -> usize {
+        1
+    }
+
+    #[inline]
+    fn get_types(dest: &mut Vec<TypeId>) {
+        dest.push(TypeId::of::<T>());
+    }
+}
+
+pub struct GearDataCollection<T: TypeTuple> {
+    len: usize,
+    blocks: T::Storage,
+}
+
+impl<T: TypeTuple> GearDataCollection<T> {
+    fn new() -> Self {
+        Self {
+            len: 0,
+            blocks: T::Storage::default(),
+        }
+    }
+
+    fn iter<F: Fn(T)>(&self, f: F) {}
+}
+
+pub struct GearDataGroup {
+    group_selector: u64,
+    data: Box<dyn Any + 'static>,
+}
+
+impl GearDataGroup {
+    fn iter() {}
+}
+
+pub struct GearDataManager {
+    types: Vec<TypeId>,
+    groups: Vec<GearDataGroup>,
+}
+
+impl GearDataManager {
+    pub fn new() -> Self {
+        Self {
+            types: vec![],
+            groups: vec![],
+        }
+    }
+
+    pub fn register<T: 'static>(&mut self) {
+        assert!(self.types.len() <= 64);
+        let id = TypeId::of::<T>();
+        if !self.types.contains(&id) {
+            self.types.push(id);
+        }
+    }
+
+    fn create_selector(&self, types: &[TypeId]) -> u64 {
+        let mut selector = 0u64;
+        for (i, typ) in self.types.iter().enumerate() {
+            if types.contains(&typ) {
+                selector |= 1 << (i as u64)
+            }
+        }
+        selector
+    }
+
+    pub fn iter<T: TypeTuple + 'static, F: Fn(T) + Copy>(&self, f: F) {
+        let mut types = vec![];
+        T::get_types(&mut types);
+        let selector = self.create_selector(&types);
+        for group in &self.groups {
+            if group.group_selector & selector == selector {
+                group
+                    .data
+                    .downcast_ref::<GearDataCollection<T>>()
+                    .unwrap()
+                    .iter(f);
+            }
+        }
+    }
+}
--- a/rust/hwphysics/src/grid.rs	Mon Jan 14 15:11:15 2019 -0500
+++ b/rust/hwphysics/src/grid.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -1,91 +1,142 @@
-use crate::{
-    common::GearId,
-    collision::{
-        fppoint_round,
-        CircleBounds,
-        DetectedCollisions
-    }
-};
-
-use integral_geometry::{
-    Point,
-    Size,
-    GridIndex
-};
-use fpnum::FPPoint;
-
-struct GridBin {
-    refs: Vec<GearId>,
-    static_entries: Vec<CircleBounds>,
-    dynamic_entries: Vec<CircleBounds>
-}
-
-impl GridBin {
-    fn new() -> Self {
-        Self {
-            refs: vec![],
-            static_entries: vec![],
-            dynamic_entries: vec![]
-        }
-    }
-}
-
-const GRID_BIN_SIZE: usize = 128;
-
-pub struct Grid {
-    bins: Vec<GridBin>,
-    space_size: Size,
-    bins_count: Size,
-    index: GridIndex
-}
-
-impl Grid {
-    pub fn new(size: Size) -> Self {
-        assert!(size.is_power_of_two());
-        let bins_count =
-            Size::new(size.width / GRID_BIN_SIZE,
-                      size.height / GRID_BIN_SIZE);
-
-        Self {
-            bins: (0..bins_count.area()).map(|_| GridBin::new()).collect(),
-            space_size: size,
-            bins_count,
-            index: Size::square(GRID_BIN_SIZE).to_grid_index()
-        }
-    }
-
-    fn bin_index(&self, position: &FPPoint) -> Point {
-        self.index.map(fppoint_round(position))
-    }
-
-    fn lookup_bin(&mut self, position: &FPPoint) -> &mut GridBin {
-        let index = self.bin_index(position);
-        &mut self.bins[index.x as usize * self.bins_count.width + index.y as usize]
-    }
-
-    pub fn insert_static(&mut self, gear_id: GearId, bounds: &CircleBounds) {
-        self.lookup_bin(&bounds.center).static_entries.push(*bounds)
-    }
-
-    pub fn insert_dynamic(&mut self, gear_id: GearId, bounds: &CircleBounds) {
-        self.lookup_bin(&bounds.center).dynamic_entries.push(*bounds)
-    }
-
-    pub fn check_collisions(&self, collisions: &mut DetectedCollisions) {
-        for bin in &self.bins {
-            for bounds in &bin.dynamic_entries {
-                for other in &bin.dynamic_entries {
-                    if bounds.intersects(other) && bounds != other {
-                        collisions.push(0, 0, &bounds.center)
-                    }
-                }
-
-                for other in &bin.static_entries {
-                    if bounds.intersects(other) {
-                        collisions.push(0, 0, &bounds.center)
-                    }
-                }
-            }
-        }
-    }
-}
\ No newline at end of file
+use crate::{
+    collision::{fppoint_round, CircleBounds, DetectedCollisions},
+    common::GearId,
+};
+
+use fpnum::FPPoint;
+use integral_geometry::{GridIndex, Point, Size};
+
+struct GridBin {
+    static_refs: Vec<GearId>,
+    static_entries: Vec<CircleBounds>,
+
+    dynamic_refs: Vec<GearId>,
+    dynamic_entries: Vec<CircleBounds>,
+}
+
+impl GridBin {
+    fn new() -> Self {
+        Self {
+            static_refs: vec![],
+            static_entries: vec![],
+            dynamic_refs: vec![],
+            dynamic_entries: vec![],
+        }
+    }
+}
+
+const GRID_BIN_SIZE: usize = 128;
+
+pub struct Grid {
+    bins: Vec<GridBin>,
+    space_size: Size,
+    bins_count: Size,
+    index: GridIndex,
+}
+
+impl Grid {
+    pub fn new(size: Size) -> Self {
+        assert!(size.is_power_of_two());
+        let bins_count = Size::new(size.width / GRID_BIN_SIZE, size.height / GRID_BIN_SIZE);
+
+        Self {
+            bins: (0..bins_count.area()).map(|_| GridBin::new()).collect(),
+            space_size: size,
+            bins_count,
+            index: Size::square(GRID_BIN_SIZE).to_grid_index(),
+        }
+    }
+
+    fn bin_index(&self, position: &FPPoint) -> Point {
+        self.index.map(fppoint_round(position))
+    }
+
+    fn get_bin(&mut self, index: Point) -> &mut GridBin {
+        &mut self.bins[index.x as usize * self.bins_count.width + index.y as usize]
+    }
+
+    fn lookup_bin(&mut self, position: &FPPoint) -> &mut GridBin {
+        self.get_bin(self.bin_index(position))
+    }
+
+    pub fn insert_static(&mut self, gear_id: GearId, bounds: &CircleBounds) {
+        let bin = self.lookup_bin(&bounds.center);
+        bin.static_refs.push(gear_id);
+        bin.static_entries.push(*bounds)
+    }
+
+    pub fn insert_dynamic(&mut self, gear_id: GearId, bounds: &CircleBounds) {
+        let bin = self.lookup_bin(&bounds.center);
+        bin.dynamic_refs.push(gear_id);
+        bin.dynamic_entries.push(*bounds);
+    }
+
+    pub fn remove(&mut self, gear_id: GearId) {}
+
+    pub fn update_position(
+        &mut self,
+        gear_id: GearId,
+        old_position: &FPPoint,
+        new_position: &FPPoint,
+    ) {
+        let old_bin_index = self.bin_index(old_position);
+        let new_bin_index = self.bin_index(new_position);
+
+        let old_bin = self.lookup_bin(old_position);
+        if let Some(index) = old_bin.dynamic_refs.iter().position(|id| *id == gear_id) {
+            if old_bin_index == new_bin_index {
+                old_bin.dynamic_entries[index].center = *new_position
+            } else {
+                let bounds = old_bin.dynamic_entries.swap_remove(index);
+                let new_bin = self.get_bin(new_bin_index);
+
+                new_bin.dynamic_refs.push(gear_id);
+                new_bin.dynamic_entries.push(CircleBounds {
+                    center: *new_position,
+                    ..bounds
+                });
+            }
+        } else if let Some(index) = old_bin.static_refs.iter().position(|id| *id == gear_id) {
+            let bounds = old_bin.static_entries.swap_remove(index);
+            old_bin.static_refs.swap_remove(index);
+
+            let new_bin = if old_bin_index == new_bin_index {
+                old_bin
+            } else {
+                self.get_bin(new_bin_index)
+            };
+
+            new_bin.dynamic_refs.push(gear_id);
+            new_bin.dynamic_entries.push(CircleBounds {
+                center: *new_position,
+                ..bounds
+            });
+        }
+    }
+
+    pub fn check_collisions(&self, collisions: &mut DetectedCollisions) {
+        for bin in &self.bins {
+            for (index, bounds) in bin.dynamic_entries.iter().enumerate() {
+                for (other_index, other) in bin.dynamic_entries.iter().enumerate().skip(index + 1) {
+                    if bounds.intersects(other) && bounds != other {
+                        collisions.push(
+                            bin.dynamic_refs[index],
+                            Some(bin.dynamic_refs[other_index]),
+                            &((bounds.center + other.center) / 2),
+                        )
+                    }
+                }
+
+                for (other_index, other) in bin.static_entries.iter().enumerate() {
+                    if bounds.intersects(other) {
+                        collisions.push(
+                            bin.dynamic_refs[index],
+                            Some(bin.static_refs[other_index]),
+                            &((bounds.center + other.center) / 2),
+                        )
+                    }
+                }
+            }
+        }
+    }
+}
--- a/rust/hwphysics/src/lib.rs	Mon Jan 14 15:11:15 2019 -0500
+++ b/rust/hwphysics/src/lib.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -1,40 +1,32 @@
-mod common;
-mod physics;
+pub mod collision;
+pub mod common;
+mod data;
 mod grid;
-mod collision;
+pub mod physics;
+pub mod time;
 
-use fpnum::FPNum;
 use integral_geometry::Size;
 use land2d::Land2D;
 
 use crate::{
-    common::{
-        GearId,
-        GearData,
-        GearDataAggregator,
-        GearDataProcessor
-    },
-    physics::{
-        PhysicsProcessor,
-        PhysicsData
-    },
-    collision::{
-        CollisionProcessor,
-        CollisionData,
-        ContactData
-    }
+    collision::{CollisionData, CollisionProcessor, ContactData},
+    common::{GearAllocator, GearData, GearDataAggregator, GearDataProcessor, GearId, Millis},
+    physics::{PhysicsData, PhysicsProcessor},
+    time::TimeProcessor,
 };
 
 pub struct JoinedData {
     gear_id: GearId,
     physics: PhysicsData,
     collision: CollisionData,
-    contact: ContactData
+    contact: ContactData,
 }
 
 pub struct World {
+    allocator: GearAllocator,
     physics: PhysicsProcessor,
     collision: CollisionProcessor,
+    time: TimeProcessor,
 }
 
 macro_rules! processor_map {
@@ -44,7 +36,7 @@
                 &mut self.$field
             }
         }
-    }
+    };
 }
 
 processor_map!(PhysicsData => physics);
@@ -53,19 +45,36 @@
 impl World {
     pub fn new(world_size: Size) -> Self {
         Self {
+            allocator: GearAllocator::new(),
             physics: PhysicsProcessor::new(),
-            collision: CollisionProcessor::new(world_size)
+            collision: CollisionProcessor::new(world_size),
+            time: TimeProcessor::new(),
         }
     }
 
-    pub fn step(&mut self, time_step: FPNum, land: &Land2D<u32>) {
+    #[inline]
+    pub fn new_gear(&mut self) -> Option<GearId> {
+        self.allocator.alloc()
+    }
+
+    #[inline]
+    pub fn delete_gear(&mut self, gear_id: GearId) {
+        self.physics.remove(gear_id);
+        self.collision.remove(gear_id);
+        self.time.cancel(gear_id);
+        self.allocator.free(gear_id)
+    }
+
+    pub fn step(&mut self, time_step: Millis, land: &Land2D<u32>) {
         let updates = self.physics.process(time_step);
-        self.collision.process(land, &updates);
+        let collision = self.collision.process(land, &updates);
+        let events = self.time.process(time_step);
     }
 
     pub fn add_gear_data<T>(&mut self, gear_id: GearId, data: T)
-        where T: GearData,
-              Self: GearDataAggregator<T>
+    where
+        T: GearData,
+        Self: GearDataAggregator<T>,
     {
         self.find_processor().add(gear_id, data);
     }
@@ -74,11 +83,11 @@
 #[cfg(test)]
 mod tests {
     use crate::{
-        World,
+        collision::{CircleBounds, CollisionData},
         physics::PhysicsData,
-        collision::{CollisionData, CircleBounds}
+        World,
     };
-    use fpnum::{FPNum, FPPoint, fp};
+    use fpnum::{fp, FPNum, FPPoint};
     use integral_geometry::Size;
     use land2d::Land2D;
 
@@ -89,17 +98,23 @@
         let mut world = World::new(world_size);
         let gear_id = 46631;
 
-        world.add_gear_data(gear_id, PhysicsData {
-            position: FPPoint::zero(),
-            velocity: FPPoint::unit_y()
-        });
+        world.add_gear_data(
+            gear_id,
+            PhysicsData {
+                position: FPPoint::zero(),
+                velocity: FPPoint::unit_y(),
+            },
+        );
 
-        world.add_gear_data(gear_id, CollisionData {
-            bounds: CircleBounds {
-                center: FPPoint::zero(),
-                radius: fp!(10)
-            }
-        });
+        world.add_gear_data(
+            gear_id,
+            CollisionData {
+                bounds: CircleBounds {
+                    center: FPPoint::zero(),
+                    radius: fp!(10),
+                },
+            },
+        );
 
         let land = Land2D::new(Size::new(world_size.width - 2, world_size.height - 2), 0);
 
--- a/rust/hwphysics/src/physics.rs	Mon Jan 14 15:11:15 2019 -0500
+++ b/rust/hwphysics/src/physics.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -1,134 +1,202 @@
-use crate::{
-    common::{GearId, GearData, GearDataProcessor}
-};
-use fpnum::*;
-use integral_geometry::{
-    Point, Size, GridIndex
-};
-
-#[derive(PartialEq, Eq, Clone, Copy, Debug)]
-pub struct PhysicsData {
-    pub position: FPPoint,
-    pub velocity: FPPoint,
-}
-
-impl GearData for PhysicsData {}
-
-pub struct DynamicPhysicsCollection {
-    gear_ids: Vec<GearId>,
-    positions: Vec<FPPoint>,
-    velocities: Vec<FPPoint>,
-}
-
-impl DynamicPhysicsCollection {
-    fn new() -> Self {
-        Self {
-            gear_ids: Vec::new(),
-            positions: Vec::new(),
-            velocities: Vec::new()
-        }
-    }
-
-    fn len(&self) -> usize {
-        self.gear_ids.len()
-    }
-
-    fn push(&mut self, id: GearId, physics: PhysicsData) {
-        self.gear_ids.push(id);
-        self.positions.push(physics.position);
-        self.velocities.push(physics.velocity);
-    }
-
-    fn iter_pos_update(&mut self) -> impl Iterator<Item = (GearId, (&mut FPPoint, &FPPoint))> {
-        self.gear_ids.iter().cloned()
-            .zip(self.positions.iter_mut()
-                .zip(self.velocities.iter()))
-    }
-}
-
-pub struct StaticPhysicsCollection {
-    gear_ids: Vec<GearId>,
-    positions: Vec<FPPoint>
-}
-
-impl StaticPhysicsCollection {
-    fn new() -> Self {
-        Self {
-            gear_ids: Vec::new(),
-            positions: Vec::new()
-        }
-    }
-
-    fn push(&mut self, gear_id: GearId, physics: PhysicsData) {
-        self.gear_ids.push(gear_id);
-        self.positions.push(physics.position);
-    }
-}
-
-pub struct PhysicsProcessor {
-    dynamic_physics: DynamicPhysicsCollection,
-    static_physics: StaticPhysicsCollection,
-
-    physics_cleanup: Vec<GearId>,
-    position_updates: PositionUpdates
-}
-
-pub struct PositionUpdates {
-    pub gear_ids: Vec<GearId>,
-    pub positions: Vec<FPPoint>
-}
-
-impl PositionUpdates {
-    pub fn new(capacity: usize) -> Self {
-        Self {
-            gear_ids: Vec::with_capacity(capacity),
-            positions: Vec::with_capacity(capacity),
-        }
-    }
-
-    pub fn push(&mut self, gear_id: GearId, position: &FPPoint) {
-        self.gear_ids.push(gear_id);
-        self.positions.push(*position);
-    }
-}
-
-impl PhysicsProcessor {
-    pub fn new() -> Self {
-        PhysicsProcessor {
-            dynamic_physics: DynamicPhysicsCollection::new(),
-            static_physics: StaticPhysicsCollection::new(),
-            physics_cleanup: Vec::new(),
-            position_updates: PositionUpdates::new(0)
-        }
-    }
-
-    pub fn process(&mut self, time_step: FPNum) -> &PositionUpdates {
-        for (gear_id, (pos, vel)) in self.dynamic_physics.iter_pos_update() {
-            *pos += *vel * time_step;
-            if !vel.is_zero() {
-                self.position_updates.push(gear_id, pos)
-            } else {
-                self.physics_cleanup.push(gear_id)
-            }
-        }
-        &self.position_updates
-    }
-
-    pub fn push(&mut self, gear_id: GearId, physics_data: PhysicsData) {
-        if physics_data.velocity.is_zero() {
-            self.static_physics.push(gear_id, physics_data);
-        } else {
-            self.dynamic_physics.push(gear_id, physics_data);
-        }
-    }
-}
-
-impl GearDataProcessor<PhysicsData> for PhysicsProcessor {
-    fn add(&mut self, gear_id: GearId, gear_data: PhysicsData) {
-        if gear_data.velocity.is_zero() {
-            self.static_physics.push(gear_id, gear_data);
-        } else {
-            self.dynamic_physics.push(gear_id, gear_data);
-        }
-    }
-}
\ No newline at end of file
+use crate::common::{GearData, GearDataLookup, GearDataProcessor, GearId, Millis};
+use fpnum::*;
+
+#[derive(PartialEq, Eq, Clone, Copy, Debug)]
+pub struct PhysicsData {
+    pub position: FPPoint,
+    pub velocity: FPPoint,
+}
+
+impl GearData for PhysicsData {}
+
+impl PhysicsData {
+    pub fn new(position: FPPoint, velocity: FPPoint) -> Self {
+        Self { position, velocity }
+    }
+}
+
+pub struct DynamicPhysicsCollection {
+    gear_ids: Vec<GearId>,
+    positions: Vec<FPPoint>,
+    velocities: Vec<FPPoint>,
+}
+
+impl DynamicPhysicsCollection {
+    fn new() -> Self {
+        Self {
+            gear_ids: Vec::new(),
+            positions: Vec::new(),
+            velocities: Vec::new(),
+        }
+    }
+
+    fn len(&self) -> usize {
+        self.gear_ids.len()
+    }
+
+    fn push(&mut self, gear_id: GearId, physics: PhysicsData) -> u16 {
+        self.gear_ids.push(gear_id);
+        self.positions.push(physics.position);
+        self.velocities.push(physics.velocity);
+
+        (self.gear_ids.len() - 1) as u16
+    }
+
+    fn remove(&mut self, index: usize) -> Option<GearId> {
+        self.gear_ids.swap_remove(index);
+        self.positions.swap_remove(index);
+        self.velocities.swap_remove(index);
+
+        self.gear_ids.get(index).cloned()
+    }
+
+    fn iter_pos_update(&mut self) -> impl Iterator<Item = (GearId, (&mut FPPoint, &FPPoint))> {
+        self.gear_ids
+            .iter()
+            .cloned()
+            .zip(self.positions.iter_mut().zip(self.velocities.iter()))
+    }
+}
+
+pub struct StaticPhysicsCollection {
+    gear_ids: Vec<GearId>,
+    positions: Vec<FPPoint>,
+}
+
+impl StaticPhysicsCollection {
+    fn new() -> Self {
+        Self {
+            gear_ids: Vec::new(),
+            positions: Vec::new(),
+        }
+    }
+
+    fn push(&mut self, gear_id: GearId, physics: PhysicsData) -> u16 {
+        self.gear_ids.push(gear_id);
+        self.positions.push(physics.position);
+
+        (self.gear_ids.len() - 1) as u16
+    }
+
+    fn remove(&mut self, index: usize) -> Option<GearId> {
+        self.gear_ids.swap_remove(index);
+        self.positions.swap_remove(index);
+
+        self.gear_ids.get(index).cloned()
+    }
+}
+
+pub struct PhysicsProcessor {
+    gear_lookup: GearDataLookup<bool>,
+    dynamic_physics: DynamicPhysicsCollection,
+    static_physics: StaticPhysicsCollection,
+
+    physics_cleanup: Vec<GearId>,
+    position_updates: PositionUpdates,
+}
+
+pub struct PositionUpdates {
+    pub gear_ids: Vec<GearId>,
+    pub shifts: Vec<(FPPoint, FPPoint)>,
+}
+
+impl PositionUpdates {
+    pub fn new(capacity: usize) -> Self {
+        Self {
+            gear_ids: Vec::with_capacity(capacity),
+            shifts: Vec::with_capacity(capacity),
+        }
+    }
+
+    pub fn push(&mut self, gear_id: GearId, old_position: &FPPoint, new_position: &FPPoint) {
+        self.gear_ids.push(gear_id);
+        self.shifts.push((*old_position, *new_position));
+    }
+
+    pub fn iter(&self) -> impl Iterator<Item = (GearId, &FPPoint, &FPPoint)> {
+        self.gear_ids
+            .iter()
+            .cloned()
+            .zip(self.shifts.iter())
+            .map(|(id, (from, to))| (id, from, to))
+    }
+
+    pub fn clear(&mut self) {
+        self.gear_ids.clear();
+        self.shifts.clear();
+    }
+}
+
+impl PhysicsProcessor {
+    pub fn new() -> Self {
+        Self {
+            gear_lookup: GearDataLookup::new(),
+            dynamic_physics: DynamicPhysicsCollection::new(),
+            static_physics: StaticPhysicsCollection::new(),
+            physics_cleanup: Vec::new(),
+            position_updates: PositionUpdates::new(0),
+        }
+    }
+
+    pub fn process(&mut self, time_step: Millis) -> &PositionUpdates {
+        let fp_step = time_step.to_fixed();
+        self.position_updates.clear();
+        for (gear_id, (pos, vel)) in self.dynamic_physics.iter_pos_update() {
+            let old_pos = *pos;
+            *pos += *vel * fp_step;
+            if !vel.is_zero() {
+                self.position_updates.push(gear_id, &old_pos, pos)
+            } else {
+                self.physics_cleanup.push(gear_id)
+            }
+        }
+        &self.position_updates
+    }
+}
+
+impl GearDataProcessor<PhysicsData> for PhysicsProcessor {
+    fn add(&mut self, gear_id: GearId, gear_data: PhysicsData) {
+        let is_dynamic = !gear_data.velocity.is_zero();
+        let index = if is_dynamic {
+            self.dynamic_physics.push(gear_id, gear_data)
+        } else {
+            self.static_physics.push(gear_id, gear_data)
+        };
+
+        self.gear_lookup.add(gear_id, index, is_dynamic);
+    }
+
+    fn remove(&mut self, gear_id: GearId) {
+        if let Some(entry) = self.gear_lookup.get(gear_id) {
+            let relocated_gear_id = if *entry.value() {
+                self.dynamic_physics.remove(entry.index() as usize)
+            } else {
+                self.static_physics.remove(entry.index() as usize)
+            };
+
+            if let Some(id) = relocated_gear_id {
+                let index = entry.index();
+                self.gear_lookup[id].set_index(index);
+            }
+        }
+    }
+
+    fn get(&mut self, gear_id: GearId) -> Option<PhysicsData> {
+        if let Some(entry) = self.gear_lookup.get(gear_id) {
+            let data = if *entry.value() {
+                PhysicsData {
+                    position: self.dynamic_physics.positions[entry.index() as usize],
+                    velocity: self.dynamic_physics.velocities[entry.index() as usize],
+                }
+            } else {
+                PhysicsData {
+                    position: self.static_physics.positions[entry.index() as usize],
+                    velocity: FPPoint::zero(),
+                }
+            };
+            Some(data)
+        } else {
+            None
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hwphysics/src/time.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,97 @@
+use crate::common::{GearId, Millis};
+use std::{
+    cmp::{Eq, Ord, Ordering, PartialEq, PartialOrd},
+    collections::BinaryHeap,
+};
+
+pub type EventId = u16;
+
+struct TimeEvent {
+    time: Millis,
+    gear_id: GearId,
+    event_id: EventId,
+}
+
+impl PartialOrd for TimeEvent {
+    #[inline]
+    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+        self.time.partial_cmp(&other.time)
+    }
+}
+
+impl PartialEq for TimeEvent {
+    #[inline]
+    fn eq(&self, other: &Self) -> bool {
+        self.time.eq(&other.time)
+    }
+}
+
+impl Ord for TimeEvent {
+    #[inline]
+    fn cmp(&self, other: &Self) -> Ordering {
+        self.time.cmp(&other.time)
+    }
+}
+
+impl Eq for TimeEvent {}
+
+pub struct OccurredEvents {
+    events: Vec<(GearId, EventId)>,
+}
+
+impl OccurredEvents {
+    fn new() -> Self {
+        Self { events: vec![] }
+    }
+
+    fn clear(&mut self) {
+        self.events.clear()
+    }
+}
+
+pub struct TimeProcessor {
+    current_event_id: EventId,
+    current_time: Millis,
+    events: BinaryHeap<TimeEvent>,
+    timeouts: OccurredEvents,
+}
+
+impl TimeProcessor {
+    pub fn new() -> Self {
+        Self {
+            current_event_id: 0,
+            current_time: Millis::new(0),
+            events: BinaryHeap::with_capacity(1024),
+            timeouts: OccurredEvents::new(),
+        }
+    }
+
+    pub fn register(&mut self, gear_id: GearId, timeout: Millis) -> EventId {
+        let event_id = self.current_event_id;
+        self.current_event_id.wrapping_add(1);
+        let event = TimeEvent {
+            time: self.current_time + timeout,
+            gear_id,
+            event_id,
+        };
+        self.events.push(event);
+        event_id
+    }
+
+    pub fn cancel(&mut self, gear_id: GearId) {}
+
+    pub fn process(&mut self, time_step: Millis) -> &OccurredEvents {
+        self.timeouts.clear();
+        self.current_time = self.current_time + time_step;
+        while self
+            .events
+            .peek()
+            .filter(|e| e.time <= self.current_time)
+            .is_some()
+        {
+            let event = self.events.pop().unwrap();
+            self.timeouts.events.push((event.gear_id, event.event_id))
+        }
+        &self.timeouts
+    }
+}
--- a/rust/hwrunner/Cargo.toml	Mon Jan 14 15:11:15 2019 -0500
+++ b/rust/hwrunner/Cargo.toml	Fri Aug 16 10:59:50 2019 -0600
@@ -5,8 +5,8 @@
 edition = "2018"
 
 [dependencies]
-gfx = "0.17"
-glutin = "0.18"
-gfx_window_glutin = "0.26"
+glutin = "0.20"
+gl = "0.11"
+integral-geometry = { path = "../integral-geometry" }
 
 lib-hedgewars-engine = { path = "../lib-hedgewars-engine" }
--- a/rust/hwrunner/src/main.rs	Mon Jan 14 15:11:15 2019 -0500
+++ b/rust/hwrunner/src/main.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -1,68 +1,108 @@
 use glutin::{
-    dpi::LogicalSize,
-    Event,
-    WindowEvent,
-    EventsLoop,
-    GlWindow,
-    GlContext
+    dpi, ContextTrait, DeviceEvent, ElementState, Event, EventsLoop, GlProfile, GlRequest,
+    MouseButton, MouseScrollDelta, WindowEvent, WindowedContext,
 };
 
-use gfx::{
-    texture,
-    format,
-    Encoder,
-    Device
-};
-
-use gfx_window_glutin::init_existing;
-
 use hedgewars_engine::instance::EngineInstance;
 
-fn init(event_loop: &EventsLoop, size: LogicalSize) -> GlWindow {
-    use glutin::{
-        ContextBuilder,
-        WindowBuilder
-    };
+use integral_geometry::Point;
+use std::time::Duration;
+
+fn init(event_loop: &EventsLoop, size: dpi::LogicalSize) -> WindowedContext {
+    use glutin::{ContextBuilder, WindowBuilder};
 
     let window = WindowBuilder::new()
         .with_title("hwengine")
         .with_dimensions(size);
 
-    let context = ContextBuilder::new();
-    GlWindow::new(window, context, event_loop).unwrap()
+    let cxt = ContextBuilder::new()
+        .with_gl(GlRequest::Latest)
+        .with_gl_profile(GlProfile::Core)
+        .build_windowed(window, &event_loop)
+        .ok()
+        .unwrap();
+
+    unsafe {
+        cxt.make_current().unwrap();
+        gl::load_with(|ptr| cxt.get_proc_address(ptr) as *const _);
+
+        if let Some(sz) = cxt.get_inner_size() {
+            let phys = sz.to_physical(cxt.get_hidpi_factor());
+
+            gl::Viewport(0, 0, phys.width as i32, phys.height as i32);
+        }
+    }
+
+    cxt
 }
 
 fn main() {
     let mut event_loop = EventsLoop::new();
-    let window = init(&event_loop, LogicalSize::new(1024.0, 768.0));
+    let (w, h) = (1024.0, 768.0);
+    let window = init(&event_loop, dpi::LogicalSize::new(w, h));
+
+    let mut engine = EngineInstance::new();
+    engine.world.create_renderer(w as u16, h as u16);
 
-    let (mut device, mut factory, color_view, depth_view) =
-        init_existing::<format::Rgba8, format::Depth>(&window);
+    let mut dragging = false;
 
-    let mut encoder: Encoder<_, _> = factory.create_command_buffer().into();
+    use std::time::Instant;
 
-    let engine = EngineInstance::new();
+    let mut now = Instant::now();
+    let mut update = Instant::now();
 
     let mut is_running = true;
     while is_running {
-        event_loop.poll_events(|event| {
-            match event {
-                Event::WindowEvent { event, ..} => match event {
-                    WindowEvent::CloseRequested => {
-                        is_running = false;
-                    },
-                    _ => ()
-                },
-                _ => ()
-            }
+        let curr = Instant::now();
+        let delta = curr - now;
+        now = curr;
+        let ms = delta.as_secs() as f64 * 1000.0 + delta.subsec_millis() as f64;
+        window.set_title(&format!("hwengine {:.3}ms", ms));
+
+        if update.elapsed() > Duration::from_millis(10) {
+            update = curr;
+            engine.world.step()
+        }
+
+        event_loop.poll_events(|event| match event {
+            Event::WindowEvent { event, .. } => match event {
+                WindowEvent::CloseRequested => {
+                    is_running = false;
+                }
+                WindowEvent::MouseInput { button, state, .. } => {
+                    if let MouseButton::Right = button {
+                        dragging = state == ElementState::Pressed;
+                    }
+                }
+
+                WindowEvent::MouseWheel { delta, .. } => {
+                    let zoom_change = match delta {
+                        MouseScrollDelta::LineDelta(x, y) => y as f32 * 0.1f32,
+                        MouseScrollDelta::PixelDelta(delta) => {
+                            let physical = delta.to_physical(window.get_hidpi_factor());
+                            physical.y as f32 * 0.1f32
+                        }
+                    };
+                    engine.world.move_camera(Point::ZERO, zoom_change);
+                }
+                _ => (),
+            },
+            Event::DeviceEvent { event, .. } => match event {
+                DeviceEvent::MouseMotion { delta } => {
+                    if dragging {
+                        engine
+                            .world
+                            .move_camera(Point::new(delta.0 as i32, delta.1 as i32), 0.0)
+                    }
+                }
+                _ => {}
+            },
+            _ => (),
         });
 
-        encoder.clear(&color_view, [0.5, 0.0, 0.0, 1.0]);
-        engine.render(&mut encoder, &color_view);
+        unsafe { window.make_current().unwrap() };
 
-        encoder.flush(&mut device);
-
+        engine.render();
         window.swap_buffers().unwrap();
-        device.cleanup();
     }
 }
--- a/rust/integral-geometry/src/lib.rs	Mon Jan 14 15:11:15 2019 -0500
+++ b/rust/integral-geometry/src/lib.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -1,7 +1,7 @@
-use fpnum::{distance, FPNum, FPPoint, fp};
+use fpnum::{fp, integral_sqrt, FPNum, FPPoint};
 use std::{
     cmp::{max, min},
-    ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Range, RangeInclusive, Sub, SubAssign},
+    ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, RangeInclusive, Sub, SubAssign},
 };
 
 #[derive(PartialEq, Eq, Clone, Copy, Debug)]
@@ -11,22 +11,19 @@
 }
 
 impl Point {
+    pub const ZERO: Self = Self::new(0, 0);
+
     #[inline]
-    pub fn new(x: i32, y: i32) -> Self {
+    pub const fn new(x: i32, y: i32) -> Self {
         Self { x, y }
     }
 
     #[inline]
-    pub fn diag(v: i32) -> Self {
+    pub const fn diag(v: i32) -> Self {
         Self::new(v, v)
     }
 
     #[inline]
-    pub fn zero() -> Self {
-        Self::new(0, 0)
-    }
-
-    #[inline]
     pub fn signum(self) -> Self {
         Self::new(self.x.signum(), self.y.signum())
     }
@@ -37,7 +34,7 @@
     }
 
     #[inline]
-    pub fn dot(self, other: Point) -> i32 {
+    pub const fn dot(self, other: Point) -> i32 {
         self.x * other.x + self.y * other.y
     }
 
@@ -48,11 +45,12 @@
 
     #[inline]
     pub fn integral_norm(self) -> u32 {
-        distance(self.x, self.y).abs_round()
+        let sqr = (self.x as u64).pow(2) + (self.y as u64).pow(2);
+        integral_sqrt(sqr) as u32
     }
 
     #[inline]
-    pub fn transform(self, matrix: &[i32; 4]) -> Self {
+    pub const fn transform(self, matrix: &[i32; 4]) -> Self {
         Point::new(
             matrix[0] * self.x + matrix[1] * self.y,
             matrix[2] * self.x + matrix[3] * self.y,
@@ -60,12 +58,12 @@
     }
 
     #[inline]
-    pub fn rotate90(self) -> Self {
+    pub const fn rotate90(self) -> Self {
         Point::new(self.y, -self.x)
     }
 
     #[inline]
-    pub fn cross(self, other: Point) -> i32 {
+    pub const fn cross(self, other: Point) -> i32 {
         self.dot(other.rotate90())
     }
 
@@ -75,22 +73,22 @@
     }
 
     #[inline]
-    pub fn line_to(self, end: Point) -> Line {
+    pub const fn line_to(self, end: Point) -> Line {
         Line::new(self, end)
     }
 
     #[inline]
-    pub fn ray_with_dir(self, direction: Point) -> Ray {
+    pub const fn ray_with_dir(self, direction: Point) -> Ray {
         Ray::new(self, direction)
     }
 
     #[inline]
-    pub fn tangent_mul(self, x: i32) -> i32 {
+    pub const fn tangent_mul(self, x: i32) -> i32 {
         x * self.y / self.x
     }
 
     #[inline]
-    pub fn cotangent_mul(self, y: i32) -> i32 {
+    pub const fn cotangent_mul(self, y: i32) -> i32 {
         y * self.x / self.y
     }
 
@@ -112,26 +110,28 @@
 }
 
 impl Size {
+    pub const EMPTY: Self = Self::square(0);
+
     #[inline]
-    pub fn new(width: usize, height: usize) -> Self {
-        Size { width, height }
+    pub const fn new(width: usize, height: usize) -> Self {
+        Self { width, height }
     }
 
     #[inline]
-    pub fn square(size: usize) -> Self {
-        Size {
+    pub const fn square(size: usize) -> Self {
+        Self {
             width: size,
             height: size,
         }
     }
 
     #[inline]
-    pub fn area(&self) -> usize {
+    pub const fn area(&self) -> usize {
         self.width * self.height
     }
 
     #[inline]
-    pub fn linear_index(&self, x: usize, y: usize) -> usize {
+    pub const fn linear_index(&self, x: usize, y: usize) -> usize {
         y * self.width + x
     }
 
@@ -149,7 +149,7 @@
     }
 
     #[inline]
-    pub fn transpose(&self) -> Self {
+    pub const fn transpose(&self) -> Self {
         Self::new(self.height, self.width)
     }
 
@@ -159,13 +159,26 @@
     }
 
     #[inline]
-    pub fn to_square(&self) -> Size {
-        Size::square(max(self.width, self.height))
+    pub fn to_square(&self) -> Self {
+        Self::square(max(self.width, self.height))
     }
 
     pub fn to_grid_index(&self) -> GridIndex {
         GridIndex::new(*self)
     }
+
+    #[inline]
+    pub fn contains(&self, other: Self) -> bool {
+        self.width >= other.width && self.height >= other.height
+    }
+
+    #[inline]
+    pub fn join(&self, other: Self) -> Self {
+        Self {
+            width: max(self.width, other.width),
+            height: max(self.height, other.height)
+        }
+    }
 }
 
 #[derive(PartialEq, Eq, Clone, Copy, Debug)]
@@ -176,7 +189,7 @@
 impl SizeMask {
     #[inline]
     pub fn new(size: Size) -> Self {
-        assert!(size.is_power_of_two());
+        debug_assert!(size.is_power_of_two());
         let size = Size {
             width: !(size.width - 1),
             height: !(size.height - 1),
@@ -305,10 +318,15 @@
 }
 
 impl Rect {
+    pub const EMPTY: Self = Self {
+        top_left: Point::ZERO,
+        bottom_right: Point::diag(-1),
+    };
+
     #[inline]
     pub fn new(top_left: Point, bottom_right: Point) -> Self {
-        assert!(top_left.x <= bottom_right.x + 1);
-        assert!(top_left.y <= bottom_right.y + 1);
+        debug_assert!(top_left.x <= bottom_right.x + 1);
+        debug_assert!(top_left.y <= bottom_right.y + 1);
         Self {
             top_left,
             bottom_right,
@@ -331,56 +349,56 @@
     }
 
     pub fn at_origin(size: Size) -> Self {
-        Self::from_size(Point::zero(), size)
+        Self::from_size(Point::ZERO, size)
     }
 
     #[inline]
-    pub fn width(&self) -> usize {
+    pub const fn width(&self) -> usize {
         (self.right() - self.left() + 1) as usize
     }
 
     #[inline]
-    pub fn height(&self) -> usize {
+    pub const fn height(&self) -> usize {
         (self.bottom() - self.top() + 1) as usize
     }
 
     #[inline]
-    pub fn size(&self) -> Size {
+    pub const fn size(&self) -> Size {
         Size::new(self.width(), self.height())
     }
 
     #[inline]
-    pub fn area(&self) -> usize {
+    pub const fn area(&self) -> usize {
         self.size().area()
     }
 
     #[inline]
-    pub fn left(&self) -> i32 {
+    pub const fn left(&self) -> i32 {
         self.top_left().x
     }
 
     #[inline]
-    pub fn top(&self) -> i32 {
+    pub const fn top(&self) -> i32 {
         self.top_left().y
     }
 
     #[inline]
-    pub fn right(&self) -> i32 {
+    pub const fn right(&self) -> i32 {
         self.bottom_right().x
     }
 
     #[inline]
-    pub fn bottom(&self) -> i32 {
+    pub const fn bottom(&self) -> i32 {
         self.bottom_right().y
     }
 
     #[inline]
-    pub fn top_left(&self) -> Point {
+    pub const fn top_left(&self) -> Point {
         self.top_left
     }
 
     #[inline]
-    pub fn bottom_right(&self) -> Point {
+    pub const fn bottom_right(&self) -> Point {
         self.bottom_right
     }
 
@@ -407,7 +425,7 @@
 
     #[inline]
     pub fn contains(&self, point: Point) -> bool {
-        self.x_range().contains(point.x) && self.y_range().contains(point.y)
+        self.x_range().contains(&point.x) && self.y_range().contains(&point.y)
     }
 
     #[inline]
@@ -419,8 +437,13 @@
     }
 
     #[inline]
+    pub fn contains_rect(&self, other: &Self) -> bool {
+        self.contains(other.top_left()) && self.contains(other.bottom_right())
+    }
+
+    #[inline]
     pub fn intersects(&self, other: &Rect) -> bool {
-        self.left() <= self.right()
+        self.left() <= other.right()
             && self.right() >= other.left()
             && self.top() <= other.bottom()
             && self.bottom() >= other.top()
@@ -438,27 +461,21 @@
     }
 
     #[inline]
+    pub fn with_margins(&self, left: i32, right: i32, top: i32, bottom: i32) -> Self {
+        Self::from_box(
+            self.left() - left,
+            self.right() + right,
+            self.top() - top,
+            self.bottom() + bottom,
+        )
+    }
+
+    #[inline]
     pub fn quotient(self, x: usize, y: usize) -> Point {
         self.top_left() + Point::new((x % self.width()) as i32, (y % self.height()) as i32)
     }
 }
 
-trait RangeContains<T> {
-    fn contains(&self, value: T) -> bool;
-}
-
-impl<T: Ord> RangeContains<T> for Range<T> {
-    fn contains(&self, value: T) -> bool {
-        value >= self.start && value < self.end
-    }
-}
-
-impl<T: Ord> RangeContains<T> for RangeInclusive<T> {
-    fn contains(&self, value: T) -> bool {
-        value >= *self.start() && value <= *self.end()
-    }
-}
-
 trait RangeClamp<T> {
     fn clamp(&self, value: T) -> T;
 }
@@ -491,7 +508,7 @@
     }
 
     pub fn edges_count(&self) -> usize {
-        self.vertices.len() - 1
+        self.vertices.len().saturating_sub(1)
     }
 
     pub fn get_edge(&self, index: usize) -> Line {
@@ -629,17 +646,17 @@
 
 impl Ray {
     #[inline]
-    pub fn new(start: Point, direction: Point) -> Ray {
+    pub const fn new(start: Point, direction: Point) -> Ray {
         Self { start, direction }
     }
 
     #[inline]
-    pub fn tangent_mul(&self, x: i32) -> i32 {
+    pub const fn tangent_mul(&self, x: i32) -> i32 {
         self.direction.tangent_mul(x)
     }
 
     #[inline]
-    pub fn cotangent_mul(&self, y: i32) -> i32 {
+    pub const fn cotangent_mul(&self, y: i32) -> i32 {
         self.direction.cotangent_mul(y)
     }
 
@@ -656,14 +673,11 @@
 }
 
 impl Line {
-    #[inline]
-    pub fn new(start: Point, end: Point) -> Self {
-        Self { start, end }
-    }
+    pub const ZERO: Self = Self::new(Point::ZERO, Point::ZERO);
 
     #[inline]
-    pub fn zero() -> Self {
-        Self::new(Point::zero(), Point::zero())
+    pub const fn new(start: Point, end: Point) -> Self {
+        Self { start, end }
     }
 
     #[inline]
@@ -710,7 +724,7 @@
         let dir = line.end - line.start;
 
         Self {
-            accumulator: Point::zero(),
+            accumulator: Point::ZERO,
             direction: dir.abs(),
             sign: dir.signum(),
             current: line.start,
@@ -751,7 +765,7 @@
 }
 
 impl ArcPoints {
-    pub fn new(radius: i32) -> Self {
+    pub const fn new(radius: i32) -> Self {
         Self {
             point: Point::new(0, radius),
             step: 3 - 2 * radius,
@@ -787,39 +801,41 @@
 }
 
 pub struct EquidistantPoints {
-    vector: Point,
-    iteration: u8,
+    vector: Vec<Point>,
 }
 
 impl EquidistantPoints {
     pub fn new(vector: Point) -> Self {
         Self {
-            vector,
-            iteration: if vector.x == vector.y { 4 } else { 8 },
+            vector: if vector.x == vector.y {
+                vec![
+                    Point::new(vector.x, vector.x),
+                    Point::new(vector.x, -vector.x),
+                    Point::new(-vector.x, -vector.x),
+                    Point::new(-vector.x, vector.x),
+                ]
+            } else {
+                vec![
+                    Point::new(vector.x, vector.y),
+                    Point::new(vector.x, -vector.y),
+                    Point::new(-vector.x, -vector.y),
+                    Point::new(-vector.x, vector.y),
+                    Point::new(vector.y, vector.x),
+                    Point::new(vector.y, -vector.x),
+                    Point::new(-vector.y, -vector.x),
+                    Point::new(-vector.y, vector.x),
+                ]
+            },
         }
     }
 }
 
-impl Iterator for EquidistantPoints {
+impl IntoIterator for EquidistantPoints {
     type Item = Point;
-
-    fn next(&mut self) -> Option<Self::Item> {
-        if self.iteration > 0 {
-            self.vector.x = -self.vector.x;
-            if self.iteration & 1 == 0 {
-                self.vector.y = -self.vector.y;
-            }
+    type IntoIter = std::vec::IntoIter<Point>;
 
-            if self.iteration == 4 {
-                std::mem::swap(&mut self.vector.x, &mut self.vector.y);
-            }
-
-            self.iteration -= 1;
-
-            Some(self.vector)
-        } else {
-            None
-        }
+    fn into_iter(self) -> Self::IntoIter {
+        self.vector.into_iter()
     }
 }
 
@@ -916,16 +932,18 @@
 
     #[test]
     fn equidistant_full() {
-        let n: Vec<Point> = EquidistantPoints::new(Point::new(1, 3)).collect();
+        let n: Vec<Point> = EquidistantPoints::new(Point::new(1, 3))
+            .into_iter()
+            .collect();
         let v = get_points(&[
+            (1, 3),
+            (1, -3),
             (-1, -3),
-            (1, -3),
             (-1, 3),
-            (1, 3),
-            (-3, -1),
+            (3, 1),
             (3, -1),
+            (-3, -1),
             (-3, 1),
-            (3, 1),
         ]);
 
         assert_eq!(n, v);
@@ -933,8 +951,10 @@
 
     #[test]
     fn equidistant_half() {
-        let n: Vec<Point> = EquidistantPoints::new(Point::new(2, 2)).collect();
-        let v = get_points(&[(-2, -2), (2, -2), (-2, 2), (2, 2)]);
+        let n: Vec<Point> = EquidistantPoints::new(Point::new(2, 2))
+            .into_iter()
+            .collect();
+        let v = get_points(&[(2, 2), (2, -2), (-2, -2), (-2, 2)]);
 
         assert_eq!(n, v);
     }
--- a/rust/land2d/src/lib.rs	Mon Jan 14 15:11:15 2019 -0500
+++ b/rust/land2d/src/lib.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -30,6 +30,12 @@
         &self.pixels.as_slice()
     }
 
+    pub fn raw_pixel_bytes(&self) -> &[u8] {
+        unsafe {
+            self.pixels.as_bytes()
+        }
+    }
+
     #[inline]
     pub fn width(&self) -> usize {
         self.pixels.width()
--- a/rust/lfprng/src/lib.rs	Mon Jan 14 15:11:15 2019 -0500
+++ b/rust/lfprng/src/lib.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -16,14 +16,19 @@
             index: 54,
         };
 
-        for _i in 0..2048 {
-            prng.get_next();
-        }
+        prng.discard(2048);
 
         prng
     }
 
     #[inline]
+    pub fn discard(&mut self, count: usize) {
+        for _i in 0..count {
+            self.get_next();
+        }
+    }
+
+    #[inline]
     fn get_next(&mut self) -> u32 {
         self.index = (self.index + 1) & 0x3f;
         self.circular_buffer[self.index] = (self.circular_buffer[(self.index + 40) & 0x3f]
--- a/rust/lib-hedgewars-engine/Cargo.toml	Mon Jan 14 15:11:15 2019 -0500
+++ b/rust/lib-hedgewars-engine/Cargo.toml	Fri Aug 16 10:59:50 2019 -0600
@@ -5,9 +5,10 @@
 edition = "2018"
 
 [dependencies]
-gfx = "0.17"
-gfx_device_gl = "0.15"
+gl = "0.11"
 netbuf = "0.4"
+itertools = "0.8"
+png = "0.13"
 
 fpnum = { path = "../fpnum" }
 land2d = { path = "../land2d" }
@@ -16,6 +17,11 @@
 landgen = { path = "../landgen" }
 hedgewars-engine-messages = { path = "../hedgewars-engine-messages" }
 hwphysics = { path = "../hwphysics" }
+mapgen = { path = "../mapgen" }
+vec2d = { path = "../vec2d" }
+
+[dev-dependencies]
+proptest = "0.9.2"
 
 [lib]
 name = "hedgewars_engine"
--- a/rust/lib-hedgewars-engine/src/instance.rs	Mon Jan 14 15:11:15 2019 -0500
+++ b/rust/lib-hedgewars-engine/src/instance.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -2,46 +2,47 @@
     ConfigEngineMessage::*, EngineMessage::*, KeystrokeAction::*, SyncedEngineMessage::*,
     UnorderedEngineMessage::*, UnsyncedEngineMessage::*, *,
 };
-
-use self::gfx_gl::{CommandBuffer, Resources};
-use gfx::format::{Unorm, D24, R8_G8_B8_A8};
-use gfx_device_gl as gfx_gl;
-
-use super::{ipc::IPC, world::World};
+use hedgewars_engine_messages::queue::*;
 
-pub struct EngineGlContext {
-    pub device: gfx_gl::Device,
-    pub factory: gfx_gl::Factory,
-    pub render_target: gfx::handle::RenderTargetView<Resources, (R8_G8_B8_A8, Unorm)>,
-    pub depth_buffer: gfx::handle::DepthStencilView<Resources, (D24, Unorm)>,
-    pub command_buffer: gfx::Encoder<Resources, CommandBuffer>,
-}
+use integral_geometry::{Point, Rect, Size};
+use landgen::outline_template::OutlineTemplate;
+
+use super::{ipc::*, world::World};
 
 pub struct EngineInstance {
     pub world: World,
-    pub ipc: IPC,
-    pub gl_context: Option<EngineGlContext>,
+    pub ipc_channel: Channel,
+    ipc_queue: MessagesQueue,
 }
 
 impl EngineInstance {
     pub fn new() -> Self {
-        let world = World::new();
+        let mut world = World::new();
+
+        fn template() -> OutlineTemplate {
+            let mut template = OutlineTemplate::new(Size::new(4096 * 1, 2048 * 1));
+            template.islands = vec![vec![
+                Rect::from_size_coords(100, 2050, 1, 1),
+                Rect::from_size_coords(100, 500, 400, 1200),
+                Rect::from_size_coords(3600, 500, 400, 1200),
+                Rect::from_size_coords(3900, 2050, 1, 1),
+            ]];
+            template.fill_points = vec![Point::new(1, 0)];
+
+            template
+        }
+
+        world.init(template());
+
         Self {
             world,
-            ipc: IPC::new(),
-            gl_context: None,
+            ipc_channel: Channel::new(),
+            ipc_queue: MessagesQueue::new(QueueChatStrategy::LocalGame),
         }
     }
 
-    pub fn render<R, C>(
-        &self,
-        command_buffer: &mut gfx::Encoder<R, C>,
-        render_target: &gfx::handle::RenderTargetView<R, gfx::format::Rgba8>,
-    ) where
-        R: gfx::Resources,
-        C: gfx::CommandBuffer<R>,
-    {
-        command_buffer.clear(render_target, [0.0, 0.5, 0.0, 1.0]);
+    pub fn render(&mut self) {
+        self.world.render();
     }
 
     fn process_unordered_message(&mut self, message: &UnorderedEngineMessage) {
@@ -59,7 +60,11 @@
     }
 
     pub fn process_ipc_queue(&mut self) {
-        let messages: Vec<EngineMessage> = self.ipc.iter().collect();
+        for message in self.ipc_channel.iter() {
+            self.ipc_queue.push(message);
+        }
+
+        let messages: Vec<EngineMessage> = self.ipc_queue.iter(0).collect();
 
         for message in messages {
             println!("Processing message: {:?}", message);
--- a/rust/lib-hedgewars-engine/src/ipc.rs	Mon Jan 14 15:11:15 2019 -0500
+++ b/rust/lib-hedgewars-engine/src/ipc.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -1,67 +1,3 @@
-use hedgewars_engine_messages::{messages::*, parser::extract_message};
-use netbuf::*;
-use std::io::*;
-
-pub struct IPC {
-    in_buffer: Buf,
-    out_buffer: Buf,
-}
-
-impl IPC {
-    pub fn new() -> Self {
-        Self {
-            in_buffer: Buf::new(),
-            out_buffer: Buf::new(),
-        }
-    }
-
-    pub fn send_message(&mut self, message: &EngineMessage) {
-        self.out_buffer.write(&message.to_bytes()).unwrap();
-    }
-
-    pub fn iter(&mut self) -> IPCMessagesIterator {
-        IPCMessagesIterator::new(self)
-    }
-}
-
-impl Write for IPC {
-    fn write(&mut self, buf: &[u8]) -> Result<usize> {
-        self.in_buffer.write(buf)
-    }
+mod channel;
 
-    fn flush(&mut self) -> Result<()> {
-        self.in_buffer.flush()
-    }
-}
-
-impl Read for IPC {
-    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
-        let read_bytes = self.out_buffer.as_ref().read(buf)?;
-
-        self.out_buffer.consume(read_bytes);
-
-        Ok(read_bytes)
-    }
-}
-
-pub struct IPCMessagesIterator<'a> {
-    ipc: &'a mut IPC,
-}
-
-impl<'a> IPCMessagesIterator<'a> {
-    pub fn new(ipc: &'a mut IPC) -> Self {
-        Self { ipc }
-    }
-}
-
-impl<'a> Iterator for IPCMessagesIterator<'a> {
-    type Item = EngineMessage;
-
-    fn next(&mut self) -> Option<Self::Item> {
-        let (consumed, message) = extract_message(&self.ipc.in_buffer[..])?;
-
-        self.ipc.in_buffer.consume(consumed);
-
-        Some(message)
-    }
-}
+pub use self::channel::*;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/lib-hedgewars-engine/src/ipc/channel.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,67 @@
+use hedgewars_engine_messages::{messages::*, parser::extract_message};
+use netbuf::*;
+use std::io::*;
+
+pub struct Channel {
+    in_buffer: Buf,
+    out_buffer: Buf,
+}
+
+impl Channel {
+    pub fn new() -> Self {
+        Self {
+            in_buffer: Buf::new(),
+            out_buffer: Buf::new(),
+        }
+    }
+
+    pub fn send_message(&mut self, message: &EngineMessage) {
+        self.out_buffer.write(&message.to_bytes()).unwrap();
+    }
+
+    pub fn iter(&mut self) -> IPCMessagesIterator {
+        IPCMessagesIterator::new(self)
+    }
+}
+
+impl Write for Channel {
+    fn write(&mut self, buf: &[u8]) -> Result<usize> {
+        self.in_buffer.write(buf)
+    }
+
+    fn flush(&mut self) -> Result<()> {
+        self.in_buffer.flush()
+    }
+}
+
+impl Read for Channel {
+    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
+        let read_bytes = self.out_buffer.as_ref().read(buf)?;
+
+        self.out_buffer.consume(read_bytes);
+
+        Ok(read_bytes)
+    }
+}
+
+pub struct IPCMessagesIterator<'a> {
+    ipc: &'a mut Channel,
+}
+
+impl<'a> IPCMessagesIterator<'a> {
+    pub fn new(ipc: &'a mut Channel) -> Self {
+        Self { ipc }
+    }
+}
+
+impl<'a> Iterator for IPCMessagesIterator<'a> {
+    type Item = EngineMessage;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        let (consumed, message) = extract_message(&self.ipc.in_buffer[..])?;
+
+        self.ipc.in_buffer.consume(consumed);
+
+        Some(message)
+    }
+}
--- a/rust/lib-hedgewars-engine/src/lib.rs	Mon Jan 14 15:11:15 2019 -0500
+++ b/rust/lib-hedgewars-engine/src/lib.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -1,9 +1,8 @@
 pub mod instance;
-mod ipc;
+pub mod ipc;
 mod render;
 mod world;
 
-use gfx::{format::Formatted, Encoder};
 use std::{
     ffi::CString,
     io::{Read, Write},
@@ -11,9 +10,9 @@
     os::raw::{c_char, c_void},
 };
 
-use gfx_device_gl as gfx_gl;
+use integral_geometry::Point;
 
-use self::instance::{EngineGlContext, EngineInstance};
+use self::instance::EngineInstance;
 
 #[repr(C)]
 #[derive(Copy, Clone)]
@@ -24,9 +23,67 @@
     land: *const u8,
 }
 
+#[repr(C)]
+#[derive(Debug, PartialEq, Clone)]
+pub enum SimpleEventType {
+    SwitchHedgehog,
+    Timer,
+    LongJump,
+    HighJump,
+    Accept,
+    Deny,
+}
+
+#[repr(C)]
+#[derive(Debug, PartialEq, Clone)]
+pub enum LongEventType {
+    ArrowUp,
+    ArrowDown,
+    ArrowLeft,
+    ArrowRight,
+    Precision,
+    Attack,
+}
+
+#[repr(C)]
+#[derive(Debug, PartialEq, Clone)]
+pub enum LongEventState {
+    Set,
+    Unset,
+}
+
+#[repr(C)]
+#[derive(Debug, PartialEq, Clone)]
+pub enum PositionedEventType {
+    CursorMove,
+    CursorClick,
+}
+
 #[no_mangle]
-pub extern "C" fn protocol_version() -> u32 {
-    56
+pub extern "C" fn simple_event(engine_state: &mut EngineInstance, event_type: SimpleEventType) {}
+
+#[no_mangle]
+pub extern "C" fn long_event(
+    engine_state: &mut EngineInstance,
+    event_type: LongEventType,
+    state: LongEventState,
+) {
+    println!("{:?}: {:?}", event_type, state);
+}
+
+#[no_mangle]
+pub extern "C" fn positioned_event(
+    engine_state: &mut EngineInstance,
+    event_type: PositionedEventType,
+    x: i32,
+    y: i32,
+) {
+
+}
+
+#[no_mangle]
+pub extern "C" fn hedgewars_engine_protocol_version() -> u32 {
+    58
 }
 
 #[no_mangle]
@@ -42,21 +99,26 @@
 
     (*engine_state).world.generate_preview();
 
-    let land_preview = (*engine_state).world.preview();
+    if let Some(land_preview) = (*engine_state).world.preview() {
+        *preview = PreviewInfo {
+            width: land_preview.width() as u32,
+            height: land_preview.height() as u32,
+            hedgehogs_number: 0,
+            land: land_preview.raw_pixels().as_ptr(),
+        };
+    }
+}
 
-    *preview = PreviewInfo {
-        width: land_preview.width() as u32,
-        height: land_preview.height() as u32,
-        hedgehogs_number: 0,
-        land: land_preview.raw_pixels().as_ptr(),
-    };
+#[no_mangle]
+pub extern "C" fn dispose_preview(engine_state: &mut EngineInstance, preview: &mut PreviewInfo) {
+    (*engine_state).world.dispose_preview();
 }
 
 #[no_mangle]
 pub extern "C" fn send_ipc(engine_state: &mut EngineInstance, buf: *const u8, size: usize) {
     unsafe {
         (*engine_state)
-            .ipc
+            .ipc_channel
             .write(std::slice::from_raw_parts(buf, size))
             .unwrap();
     }
@@ -66,7 +128,7 @@
 pub extern "C" fn read_ipc(engine_state: &mut EngineInstance, buf: *mut u8, size: usize) -> usize {
     unsafe {
         (*engine_state)
-            .ipc
+            .ipc_channel
             .read(std::slice::from_raw_parts_mut(buf, size))
             .unwrap_or(0)
     }
@@ -79,36 +141,19 @@
     height: u16,
     gl_loader: extern "C" fn(*const c_char) -> *const c_void,
 ) {
-    let (device, mut factory) = gfx_gl::create(|name| {
+    gl::load_with(|name| {
         let c_name = CString::new(name).unwrap();
         gl_loader(c_name.as_ptr())
     });
-
-    let dimensions = (width, height, 1u16, gfx::texture::AaMode::Single);
-    let (render_target, depth_buffer) = gfx_gl::create_main_targets_raw(
-        dimensions,
-        gfx::format::Rgba8::get_format().0,
-        gfx::format::Depth::get_format().0,
-    );
-
-    let mut command_buffer: Encoder<_, _> = factory.create_command_buffer().into();
-
-    engine_state.gl_context = Some(EngineGlContext {
-        device,
-        factory,
-        render_target: gfx::memory::Typed::new(render_target),
-        depth_buffer: gfx::memory::Typed::new(depth_buffer),
-        command_buffer,
-    })
+    unsafe {
+        gl::Viewport(0, 0, width as i32, height as i32);
+    }
+    engine_state.world.create_renderer(width, height);
 }
 
 #[no_mangle]
 pub extern "C" fn render_frame(engine_state: &mut EngineInstance) {
-    let mut context = replace(&mut engine_state.gl_context, None);
-    if let Some(ref mut c) = context {
-        engine_state.render(&mut c.command_buffer, &mut c.render_target)
-    }
-    replace(&mut engine_state.gl_context, context);
+    engine_state.render()
 }
 
 #[no_mangle]
@@ -116,6 +161,14 @@
     engine_state.world.step();
     true
 }
+
+#[no_mangle]
+pub extern "C" fn move_camera(engine_state: &mut EngineInstance, delta_x: i32, delta_y: i32) {
+    engine_state
+        .world
+        .move_camera(Point::new(delta_x, delta_y), 0.0);
+}
+
 #[no_mangle]
 pub extern "C" fn cleanup(engine_state: *mut EngineInstance) {
     unsafe {
--- a/rust/lib-hedgewars-engine/src/render.rs	Mon Jan 14 15:11:15 2019 -0500
+++ b/rust/lib-hedgewars-engine/src/render.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -1,17 +1,9 @@
-use gfx::{
-    format,
-    ConstantBuffer,
-    DepthTarget,
-    RenderTarget,
-    TextureSampler,
-    VertexBuffer,
-};
-
-struct Camera {
-    pos: [f32; 2]
-}
-
-fn render() {
-
-}
-
+pub mod atlas;
+pub mod camera;
+mod gear;
+mod gl;
+mod map;
+
+use self::gl::*;
+pub use self::map::*;
+pub use gear::*;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/lib-hedgewars-engine/src/render/atlas.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,461 @@
+use integral_geometry::{Rect, Size};
+use itertools::Itertools;
+use std::{
+    cmp::{max, min, Ordering},
+    ops::Index,
+};
+
+#[derive(PartialEq, Eq, PartialOrd, Ord, Clone)]
+struct Fit {
+    short_side: u32,
+    long_side: u32,
+}
+
+impl Fit {
+    fn new() -> Self {
+        Self {
+            short_side: u32::max_value(),
+            long_side: u32::max_value(),
+        }
+    }
+
+    fn measure(container: Size, size: Size) -> Option<Self> {
+        if container.contains(size) {
+            let x_leftover = container.width - size.width;
+            let y_leftover = container.height - size.height;
+            Some(Self {
+                short_side: min(x_leftover, y_leftover) as u32,
+                long_side: max(x_leftover, y_leftover) as u32,
+            })
+        } else {
+            None
+        }
+    }
+}
+
+#[derive(PartialEq, Eq)]
+pub struct UsedSpace {
+    used_area: usize,
+    total_area: usize,
+}
+
+impl UsedSpace {
+    const fn new(used_area: usize, total_area: usize) -> Self {
+        Self {
+            used_area,
+            total_area,
+        }
+    }
+
+    const fn used(&self) -> usize {
+        self.used_area
+    }
+
+    const fn total(&self) -> usize {
+        self.total_area
+    }
+
+    const fn free(&self) -> usize {
+        self.total_area - self.used_area
+    }
+}
+
+impl std::fmt::Debug for UsedSpace {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
+        write!(
+            f,
+            "{:.2}%",
+            self.used() as f32 / self.total() as f32 * 100.0
+        )?;
+        Ok(())
+    }
+}
+
+pub struct Atlas<T> {
+    size: Size,
+    free_rects: Vec<Rect>,
+    used_rects: Vec<(Rect, T)>,
+    splits: Vec<Rect>,
+}
+
+impl<T: Copy> Atlas<T> {
+    pub fn new(size: Size) -> Self {
+        Self {
+            size,
+            free_rects: vec![Rect::at_origin(size)],
+            used_rects: vec![],
+            splits: vec![],
+        }
+    }
+
+    pub fn size(&self) -> Size {
+        self.size
+    }
+
+    pub fn used_space(&self) -> UsedSpace {
+        let used = self.used_rects.iter().map(|(r, _)| r.size().area()).sum();
+        UsedSpace::new(used, self.size.area())
+    }
+
+    fn find_position(&self, size: Size) -> Option<(Rect, Fit)> {
+        let mut best_rect = Rect::EMPTY;
+        let mut best_fit = Fit::new();
+
+        for rect in &self.free_rects {
+            if let Some(fit) = Fit::measure(rect.size(), size) {
+                if fit < best_fit {
+                    best_fit = fit;
+                    best_rect = Rect::from_size(rect.top_left(), size);
+                }
+            }
+
+            if let Some(fit) = Fit::measure(rect.size(), size.transpose()) {
+                if fit < best_fit {
+                    best_fit = fit;
+                    best_rect = Rect::from_size(rect.top_left(), size.transpose());
+                }
+            }
+        }
+
+        if best_rect == Rect::EMPTY {
+            None
+        } else {
+            Some((best_rect, best_fit))
+        }
+    }
+
+    fn split_insert(&mut self, rect: Rect, value: T) {
+        let mut splits = std::mem::replace(&mut self.splits, vec![]);
+        let mut buffer = [Rect::EMPTY; 4];
+
+        for i in (0..self.free_rects.len()).rev() {
+            if let Some(count) = split_rect(self.free_rects[i], rect, &mut splits, &mut buffer) {
+                self.free_rects.swap_remove(i as usize);
+                splits.extend_from_slice(&buffer[0..count]);
+            }
+        }
+
+        filter_swap_remove(&mut splits, |s| {
+            self.free_rects.iter().any(|r| r.contains_rect(s))
+        });
+        self.free_rects.extend(splits.drain(..));
+        std::mem::replace(&mut self.splits, splits);
+
+        self.used_rects.push((rect, value));
+    }
+
+    pub fn insert(&mut self, size: Size, value: T) -> Option<Rect> {
+        let (rect, _) = self.find_position(size)?;
+        self.split_insert(rect, value);
+        Some(rect)
+    }
+
+    pub fn insert_set<Iter>(&mut self, sizes: Iter) -> Vec<(Rect, T)>
+    where
+        Iter: Iterator<Item = (Size, T)>,
+    {
+        let mut sizes: Vec<_> = sizes.collect();
+        let mut result = Vec::with_capacity(sizes.len());
+
+        while let Some((index, (rect, _), value)) = sizes
+            .iter()
+            .enumerate()
+            .filter_map(|(i, (s, v))| self.find_position(*s).map(|res| (i, res, v)))
+            .min_by_key(|(_, (_, fit), _)| fit.clone())
+        {
+            self.split_insert(rect, *value);
+
+            result.push((rect, *value));
+            sizes.swap_remove(index);
+        }
+        result
+    }
+
+    pub fn reset(&mut self) {
+        self.free_rects.clear();
+        self.used_rects.clear();
+        self.free_rects.push(Rect::at_origin(self.size));
+    }
+}
+
+pub type SpriteIndex = u32;
+pub type SpriteLocation = (u32, Rect);
+
+pub struct AtlasCollection {
+    next_index: SpriteIndex,
+    texture_size: Size,
+    atlases: Vec<Atlas<SpriteIndex>>,
+    rects: Vec<SpriteLocation>,
+}
+
+impl AtlasCollection {
+    pub fn new(texture_size: Size) -> Self {
+        Self {
+            next_index: 0,
+            texture_size,
+            atlases: vec![],
+            rects: vec![],
+        }
+    }
+
+    fn repack(&mut self, size: Size) -> bool {
+        for (atlas_index, atlas) in self.atlases.iter_mut().enumerate() {
+            if atlas.used_space().free() >= size.area() {
+                let mut temp_atlas = Atlas::new(atlas.size());
+                let sizes = atlas
+                    .used_rects
+                    .iter()
+                    .map(|(r, v)| (r.size(), *v))
+                    .chain(std::iter::once((size, self.next_index)));
+                let inserts = temp_atlas.insert_set(sizes);
+                if inserts.len() > atlas.used_rects.len() {
+                    self.rects.push((0, Rect::EMPTY));
+                    for (rect, index) in inserts {
+                        self.rects[index as usize] = (atlas_index as u32, rect);
+                    }
+                    std::mem::swap(atlas, &mut temp_atlas);
+                    return true;
+                }
+            }
+        }
+        false
+    }
+
+    #[inline]
+    fn consume_index(&mut self) -> Option<SpriteIndex> {
+        let result = Some(self.next_index);
+        self.next_index += 1;
+        result
+    }
+
+    pub fn insert_sprite(&mut self, size: Size) -> Option<SpriteIndex> {
+        if !self.texture_size.contains(size) {
+            None
+        } else {
+            let index = self.next_index;
+            if let Some(index_rect) = self
+                .atlases
+                .iter_mut()
+                .enumerate()
+                .find_map(|(i, a)| a.insert(size, index).map(|r| (i as u32, r)))
+            {
+                self.rects.push(index_rect);
+            } else if !self.repack(size) {
+                let mut atlas = Atlas::new(self.texture_size);
+                let rect = atlas.insert(size, index)?;
+                self.atlases.push(atlas);
+                self.rects.push(((self.atlases.len() - 1) as u32, rect))
+            }
+            self.consume_index()
+        }
+    }
+
+    pub fn get_rect(&self, index: SpriteIndex) -> Option<(u32, Rect)> {
+        self.rects.get(index as usize).cloned()
+    }
+
+    pub fn used_space(&self) -> String {
+        self.atlases
+            .iter()
+            .enumerate()
+            .map(|(i, a)| format!("{}: {:?}", i, a.used_space()))
+            .join("\n")
+    }
+}
+
+impl Index<SpriteIndex> for AtlasCollection {
+    type Output = SpriteLocation;
+
+    #[inline]
+    fn index(&self, index: SpriteIndex) -> &Self::Output {
+        &self.rects[index as usize]
+    }
+}
+
+#[inline]
+fn filter_swap_remove<T, F>(vec: &mut Vec<T>, predicate: F)
+where
+    F: Fn(&T) -> bool,
+{
+    let mut i = 0;
+    while i < vec.len() {
+        if predicate(&vec[i]) {
+            vec.swap_remove(i);
+        } else {
+            i += 1;
+        }
+    }
+}
+
+#[inline]
+fn prune_push(
+    previous_splits: &mut Vec<Rect>,
+    buffer: &mut [Rect; 4],
+    buffer_size: &mut usize,
+    rect: Rect,
+) {
+    if !previous_splits.iter().any(|r| r.contains_rect(&rect)) {
+        filter_swap_remove(previous_splits, |s| rect.contains_rect(s));
+        buffer[*buffer_size] = rect;
+        *buffer_size += 1;
+    }
+}
+
+fn split_rect(
+    free_rect: Rect,
+    rect: Rect,
+    previous_splits: &mut Vec<Rect>,
+    buffer: &mut [Rect; 4],
+) -> Option<usize> {
+    let mut buffer_size = 0usize;
+    let split = free_rect.intersects(&rect);
+    if split {
+        if rect.left() > free_rect.left() {
+            let trim = free_rect.right() - rect.left() + 1;
+            prune_push(
+                previous_splits,
+                buffer,
+                &mut buffer_size,
+                free_rect.with_margins(0, -trim, 0, 0),
+            );
+        }
+        if rect.right() < free_rect.right() {
+            let trim = rect.right() - free_rect.left() + 1;
+            prune_push(
+                previous_splits,
+                buffer,
+                &mut buffer_size,
+                free_rect.with_margins(-trim, 0, 0, 0),
+            );
+        }
+        if rect.top() > free_rect.top() {
+            let trim = free_rect.bottom() - rect.top() + 1;
+            prune_push(
+                previous_splits,
+                buffer,
+                &mut buffer_size,
+                free_rect.with_margins(0, 0, 0, -trim),
+            );;
+        }
+        if rect.bottom() < free_rect.bottom() {
+            let trim = rect.bottom() - free_rect.top() + 1;
+            prune_push(
+                previous_splits,
+                buffer,
+                &mut buffer_size,
+                free_rect.with_margins(0, 0, -trim, 0),
+            );;
+        }
+    }
+    if split {
+        Some(buffer_size)
+    } else {
+        None
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::Atlas;
+    use integral_geometry::{Rect, Size};
+    use itertools::Itertools as _;
+    use proptest::prelude::*;
+
+    #[test]
+    fn insert() {
+        let atlas_size = Size::square(16);
+        let mut atlas = Atlas::new(atlas_size);
+
+        assert_eq!(None, atlas.insert(Size::square(20), ()));
+
+        let rect_size = Size::new(11, 3);
+        let rect = atlas.insert(rect_size, ()).unwrap();
+
+        assert_eq!(rect, Rect::at_origin(rect_size));
+        assert_eq!(2, atlas.free_rects.len());
+    }
+
+    #[derive(Debug, Clone)]
+    struct TestRect(Size);
+    struct TestRectParameters(Size);
+
+    impl Default for TestRectParameters {
+        fn default() -> Self {
+            Self(Size::square(64))
+        }
+    }
+
+    impl Arbitrary for TestRect {
+        type Parameters = TestRectParameters;
+
+        fn arbitrary_with(args: Self::Parameters) -> Self::Strategy {
+            (1..=args.0.width, 1..=args.0.height)
+                .prop_map(|(w, h)| TestRect(Size::new(w, h)))
+                .boxed()
+        }
+
+        type Strategy = BoxedStrategy<TestRect>;
+    }
+
+    trait HasSize {
+        fn size(&self) -> Size;
+    }
+
+    impl HasSize for TestRect {
+        fn size(&self) -> Size {
+            self.0
+        }
+    }
+
+    impl HasSize for Rect {
+        fn size(&self) -> Size {
+            self.size()
+        }
+    }
+
+    impl HasSize for (Rect, ()) {
+        fn size(&self) -> Size {
+            self.0.size()
+        }
+    }
+
+    fn sum_area<S: HasSize>(items: &[S]) -> usize {
+        items.iter().map(|s| s.size().area()).sum()
+    }
+
+    proptest! {
+        #[test]
+        fn prop_insert(rects in Vec::<TestRect>::arbitrary()) {
+            let container = Rect::at_origin(Size::square(2048));
+            let mut atlas = Atlas::new(container.size());
+            let inserted: Vec<_> = rects.iter().filter_map(|TestRect(size)| atlas.insert(*size, ())).collect();
+
+            let mut inserted_pairs = inserted.iter().cartesian_product(inserted.iter());
+
+            assert!(inserted.iter().all(|r| container.contains_rect(r)));
+            assert!(inserted_pairs.all(|(r1, r2)| r1 == r2 || r1 != r2 && !r1.intersects(r2)));
+
+            assert_eq!(inserted.len(), rects.len());
+            assert_eq!(sum_area(&inserted), sum_area(&rects));
+        }
+    }
+
+    proptest! {
+        #[test]
+        fn prop_insert_set(rects in Vec::<TestRect>::arbitrary()) {
+            let container = Rect::at_origin(Size::square(2048));
+            let mut atlas = Atlas::new(container.size());
+            let mut set_atlas = Atlas::new(container.size());
+
+            let inserted: Vec<_> = rects.iter().filter_map(|TestRect(size)| atlas.insert(*size, ())).collect();
+            let set_inserted: Vec<_> = set_atlas.insert_set(rects.iter().map(|TestRect(size)| (*size, ())));
+
+            let mut set_inserted_pairs = set_inserted.iter().cartesian_product(set_inserted.iter());
+
+            assert!(set_inserted_pairs.all(|((r1, _), (r2, _))| r1 == r2 || r1 != r2 && !r1.intersects(r2)));
+            assert!(set_atlas.used_space().used() <= atlas.used_space().used());
+
+            assert_eq!(sum_area(&set_inserted), sum_area(&inserted));
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/lib-hedgewars-engine/src/render/camera.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,64 @@
+use integral_geometry::{Point, Rect, Size};
+
+#[derive(Debug)]
+pub struct Camera {
+    pub position: Point,
+    pub zoom: f32,
+    size: Size,
+}
+
+impl Camera {
+    pub fn new() -> Self {
+        Self::with_size(Size::new(1024, 768))
+    }
+
+    pub fn with_size(size: Size) -> Self {
+        Self {
+            position: Point::ZERO,
+            zoom: 1.0,
+            size,
+        }
+    }
+
+    pub fn viewport(&self) -> Rect {
+        #[inline]
+        fn scale(value: usize, zoom: f32) -> i32 {
+            (value as f32 / zoom / 2.0) as i32
+        }
+        let half_width = scale(self.size.width, self.zoom);
+        let half_height = scale(self.size.height, self.zoom);
+        Rect::from_box(
+            self.position.x - half_width,
+            self.position.x + half_width,
+            self.position.y - half_height,
+            self.position.y + half_height,
+        )
+    }
+
+    pub fn projection(&self) -> [f32; 16] {
+        let viewport = self.viewport();
+        let left = viewport.left() as f32;
+        let width = viewport.width() as f32;
+        let height = viewport.height() as f32;
+        let top = viewport.top() as f32;
+
+        [
+            2f32 / width,
+            0f32,
+            0f32,
+            0f32,
+            0f32,
+            2f32 / -height,
+            0f32,
+            0f32,
+            0f32,
+            0f32,
+            0.5f32,
+            0f32,
+            -(2.0 * left + width) / width,
+            (2.0 * top + height) / height,
+            0.5f32,
+            1f32,
+        ]
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/lib-hedgewars-engine/src/render/gear.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,114 @@
+use super::{atlas::AtlasCollection, gl::Texture2D};
+use crate::render::camera::Camera;
+
+use integral_geometry::{Rect, Size};
+
+use crate::render::atlas::SpriteIndex;
+use png::{ColorType, Decoder, DecodingError};
+use std::path::PathBuf;
+use std::{
+    collections::HashMap,
+    ffi::OsString,
+    fs::{read_dir, File},
+    io,
+    io::BufReader,
+    path::Path,
+};
+
+pub struct GearRenderer {
+    atlas: AtlasCollection,
+}
+
+struct SpriteData {
+    size: Size,
+    filename: PathBuf,
+}
+
+const ATLAS_SIZE: Size = Size::square(2048);
+
+impl GearRenderer {
+    pub fn new() -> Self {
+        let mut lookup = Vec::with_capacity(2048);
+
+        let mut atlas = AtlasCollection::new(ATLAS_SIZE);
+        let mut sprites = load_sprites(Path::new("../../share/hedgewars/Data/Graphics/"))
+            .expect("Unable to load Graphics");
+        let max_size = sprites
+            .iter()
+            .fold(Size::EMPTY, |size, sprite| size.join(sprite.size));
+        for sprite in sprites.drain(..) {
+            lookup.push((sprite.filename, atlas.insert_sprite(sprite.size).unwrap()));
+        }
+
+        println!(
+            "Filled atlas with {} sprites:\n{}",
+            sprites.len(),
+            atlas.used_space()
+        );
+
+        let texture = Texture2D::new(ATLAS_SIZE, gl::RGBA8, gl::LINEAR);
+
+        let mut pixels = vec![0; max_size.area()].into_boxed_slice();
+        let mut pixels_transposed = vec![0; max_size.area()].into_boxed_slice();
+
+        for (path, sprite_index) in lookup.drain(..) {
+            if let Some((atlas_index, rect)) = atlas.get_rect(sprite_index) {
+                let size = load_sprite_pixels(&path, mapgen::theme::slice_u32_to_u8_mut(&mut pixels[..])).expect("Unable to load Graphics");
+
+                let used_pixels = if size.width != rect.width() {
+                    for y in 0..rect.height() {
+                        for x in 0..rect.width() {
+                            pixels_transposed[y * rect.width() + x] = pixels[x * rect.height() + y];
+                        }
+                    }
+                    &mut pixels_transposed[..]
+                } else {
+                    &mut pixels[..]
+                };
+
+                texture.update(rect, mapgen::theme::slice_u32_to_u8_mut(used_pixels), 0, gl::RGBA, gl::UNSIGNED_BYTE);
+            }
+        }
+
+        Self { atlas }
+    }
+
+    pub fn render(&mut self, camera: &Camera) {
+        let projection = camera.projection();
+    }
+}
+
+fn load_sprite_pixels(path: &Path, buffer: &mut [u8]) -> io::Result<Size> {
+    let decoder = Decoder::new(BufReader::new(File::open(path)?));
+    let (info, mut reader) = decoder.read_info()?;
+
+    let size = Size::new(info.width as usize, info.height as usize);
+    reader.next_frame(buffer)?;
+    Ok(size)
+}
+
+fn load_sprite_size(path: &Path) -> io::Result<Size> {
+    let decoder = Decoder::new(BufReader::new(File::open(path)?));
+    let (info, mut reader) = decoder.read_info()?;
+
+    let size = Size::new(info.width as usize, info.height as usize);
+    Ok(size)
+}
+
+fn load_sprites(path: &Path) -> io::Result<Vec<SpriteData>> {
+    let mut result = vec![];
+    for file in read_dir(path)? {
+        let file = file?;
+        if let Some(extension) = file.path().extension() {
+            if extension == "png" {
+                let path = file.path();
+                let sprite = load_sprite_size(&path)?;
+                result.push(SpriteData {
+                    size: sprite,
+                    filename: path,
+                });
+            }
+        }
+    }
+    Ok(result)
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/lib-hedgewars-engine/src/render/gl.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,511 @@
+use integral_geometry::{Rect, Size};
+
+use std::{ffi, ffi::CString, mem, num::NonZeroU32, ptr, slice};
+
+#[derive(Default)]
+pub struct PipelineState {
+    blending: bool,
+}
+
+impl PipelineState {
+    pub fn new() -> Self {
+        Self::default()
+    }
+
+    pub fn with_blend(mut self) -> Self {
+        unsafe {
+            gl::Enable(gl::BLEND);
+            gl::BlendFunc(gl::SRC_ALPHA, gl::ONE_MINUS_SRC_ALPHA);
+        }
+        self.blending = true;
+        self
+    }
+}
+
+impl Drop for PipelineState {
+    fn drop(&mut self) {
+        if self.blending {
+            unsafe { gl::Disable(gl::BLEND) }
+        }
+    }
+}
+
+#[derive(Debug)]
+pub struct Texture2D {
+    pub handle: Option<NonZeroU32>,
+}
+
+impl Drop for Texture2D {
+    fn drop(&mut self) {
+        if let Some(handle) = self.handle {
+            unsafe {
+                gl::DeleteTextures(1, &handle.get());
+            }
+        }
+    }
+}
+
+fn new_texture() -> Option<NonZeroU32> {
+    let mut handle = 0;
+    unsafe {
+        gl::GenTextures(1, &mut handle);
+    }
+    NonZeroU32::new(handle)
+}
+
+fn tex_params(filter: u32) {
+    unsafe {
+        gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_WRAP_S, gl::CLAMP_TO_EDGE as i32);
+        gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_WRAP_T, gl::CLAMP_TO_EDGE as i32);
+        gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MIN_FILTER, filter as i32);
+        gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MAG_FILTER, filter as i32);
+    }
+}
+
+impl Texture2D {
+    pub fn new(size: Size, internal_format: u32, filter: u32) -> Self {
+        if let Some(handle) = new_texture() {
+            unsafe {
+                gl::BindTexture(gl::TEXTURE_2D, handle.get());
+                gl::TexImage2D(
+                    gl::TEXTURE_2D,
+                    0,
+                    internal_format as i32,
+                    size.width as i32,
+                    size.height as i32,
+                    0,
+                    gl::RGBA,
+                    gl::UNSIGNED_BYTE,
+                    std::ptr::null(),
+                )
+            }
+
+            tex_params(filter);
+            Self {
+                handle: Some(handle),
+            }
+        } else {
+            Self { handle: None }
+        }
+    }
+
+    pub fn with_data(
+        data: &[u8],
+        data_stride: u32,
+        size: Size,
+        internal_format: u32,
+        format: u32,
+        ty: u32,
+        filter: u32,
+    ) -> Self {
+        if let Some(handle) = new_texture() {
+            unsafe {
+                gl::BindTexture(gl::TEXTURE_2D, handle.get());
+                gl::PixelStorei(gl::UNPACK_ROW_LENGTH, data_stride as i32);
+                gl::TexImage2D(
+                    gl::TEXTURE_2D,
+                    0,
+                    internal_format as i32,
+                    size.width as i32,
+                    size.height as i32,
+                    0,
+                    format as u32,
+                    ty,
+                    data.as_ptr() as *const _,
+                )
+            }
+
+            tex_params(filter);
+            Self {
+                handle: Some(handle),
+            }
+        } else {
+            Self { handle: None }
+        }
+    }
+
+    pub fn update(&self, region: Rect, data: &[u8], data_stride: u32, format: u32, ty: u32) {
+        if let Some(handle) = self.handle {
+            unsafe {
+                gl::BindTexture(gl::TEXTURE_2D, handle.get());
+                gl::PixelStorei(gl::UNPACK_ROW_LENGTH, data_stride as i32);
+                gl::TexSubImage2D(
+                    gl::TEXTURE_2D,
+                    0,             // texture level
+                    region.left(), // texture region
+                    region.top(),
+                    region.width() as i32,
+                    region.height() as i32,
+                    format,                    // data format
+                    ty,                        // data type
+                    data.as_ptr() as *const _, // data ptr
+                );
+            }
+        }
+    }
+
+    pub fn retrieve(&self, data: &mut [u8]) {
+        if let Some(handle) = self.handle {
+            unsafe {
+                gl::BindTexture(gl::TEXTURE_2D, handle.get());
+                gl::GetTexImage(
+                    gl::TEXTURE_2D,
+                    0,                           // texture level
+                    gl::RGBA,                    // data format
+                    gl::UNSIGNED_BYTE,           // data type
+                    data.as_mut_ptr() as *mut _, // data ptr
+                );
+            }
+        }
+    }
+}
+
+#[derive(Debug)]
+pub struct Buffer {
+    pub handle: u32,
+    pub ty: u32,
+    pub usage: u32,
+}
+
+impl Buffer {
+    pub fn empty(
+        ty: u32,
+        usage: u32,
+        //size: isize
+    ) -> Buffer {
+        let mut buffer = 0;
+
+        unsafe {
+            gl::GenBuffers(1, &mut buffer);
+            gl::BindBuffer(ty, buffer);
+            //gl::BufferData(ty, size, ptr::null_mut(), usage);
+        }
+
+        Buffer {
+            handle: buffer,
+            ty,
+            usage,
+        }
+    }
+
+    fn with_data(ty: u32, usage: u32, data: &[u8]) -> Buffer {
+        let mut buffer = 0;
+
+        unsafe {
+            gl::GenBuffers(1, &mut buffer);
+            gl::BindBuffer(ty, buffer);
+            gl::BufferData(ty, data.len() as isize, data.as_ptr() as _, usage);
+        }
+
+        Buffer {
+            handle: buffer,
+            ty,
+            usage,
+        }
+    }
+
+    pub fn ty(&self) -> u32 {
+        self.ty
+    }
+
+    pub fn handle(&self) -> u32 {
+        self.handle
+    }
+
+    pub fn write_typed<T>(&self, data: &[T]) {
+        unsafe {
+            let data =
+                slice::from_raw_parts(data.as_ptr() as *const u8, data.len() * mem::size_of::<T>());
+
+            gl::BindBuffer(self.ty, self.handle);
+            gl::BufferData(
+                self.ty,
+                data.len() as isize,
+                data.as_ptr() as *const _ as *const _,
+                self.usage,
+            );
+        }
+    }
+
+    pub fn write(&self, data: &[u8]) {
+        unsafe {
+            gl::BindBuffer(self.ty, self.handle);
+            gl::BufferData(
+                self.ty,
+                data.len() as isize,
+                data.as_ptr() as *const _ as *const _,
+                self.usage,
+            );
+        }
+    }
+}
+
+impl Drop for Buffer {
+    fn drop(&mut self) {
+        unsafe {
+            gl::DeleteBuffers(1, &self.handle);
+        }
+    }
+}
+
+#[derive(Debug)]
+pub enum VariableBinding<'a> {
+    Attribute(&'a str, u32),
+    Uniform(&'a str, u32),
+    UniformBlock(&'a str, u32),
+    Sampler(&'a str, u32),
+}
+
+#[derive(Debug)]
+pub struct Shader {
+    pub program: u32,
+}
+
+impl Drop for Shader {
+    fn drop(&mut self) {
+        unsafe {
+            gl::DeleteProgram(self.program);
+        }
+    }
+}
+
+impl Shader {
+    pub fn new<'a>(
+        vs: &str,
+        ps: Option<&str>,
+        bindings: &[VariableBinding<'a>],
+    ) -> Result<Self, String> {
+        unsafe fn compile_shader(ty: u32, shdr: &str) -> Result<u32, String> {
+            let shader = gl::CreateShader(ty);
+            let len = shdr.len() as i32;
+            let shdr = shdr.as_ptr() as *const i8;
+            gl::ShaderSource(shader, 1, &shdr, &len);
+            gl::CompileShader(shader);
+
+            let mut success = 0i32;
+            gl::GetShaderiv(shader, gl::COMPILE_STATUS, &mut success as _);
+
+            if success == gl::FALSE as i32 {
+                let mut log_size = 0i32;
+                gl::GetShaderiv(shader, gl::INFO_LOG_LENGTH, &mut log_size as _);
+
+                let mut log = vec![0u8; log_size as usize];
+                gl::GetShaderInfoLog(shader, log_size, ptr::null_mut(), log.as_mut_ptr() as _);
+
+                gl::DeleteShader(shader);
+                Err(String::from_utf8_unchecked(log))
+            } else {
+                Ok(shader)
+            }
+        }
+
+        let vs = unsafe { compile_shader(gl::VERTEX_SHADER, vs)? };
+        let ps = if let Some(ps) = ps {
+            Some(unsafe { compile_shader(gl::FRAGMENT_SHADER, ps)? })
+        } else {
+            None
+        };
+
+        unsafe {
+            let program = gl::CreateProgram();
+
+            gl::AttachShader(program, vs);
+            if let Some(ps) = ps {
+                gl::AttachShader(program, ps);
+            }
+
+            for bind in bindings {
+                match bind {
+                    &VariableBinding::Attribute(ref name, id) => {
+                        let c_str = CString::new(name.as_bytes()).unwrap();
+                        gl::BindAttribLocation(
+                            program,
+                            id,
+                            c_str.to_bytes_with_nul().as_ptr() as *const _,
+                        );
+                    }
+                    _ => {}
+                }
+            }
+
+            gl::LinkProgram(program);
+
+            let mut success = 0i32;
+            gl::GetProgramiv(program, gl::LINK_STATUS, &mut success);
+            if success == gl::FALSE as i32 {
+                let mut log_size = 0i32;
+                gl::GetProgramiv(program, gl::INFO_LOG_LENGTH, &mut log_size as _);
+
+                let mut log = vec![0u8; log_size as usize];
+                gl::GetProgramInfoLog(program, log_size, ptr::null_mut(), log.as_mut_ptr() as _);
+
+                gl::DeleteProgram(program);
+                return Err(String::from_utf8_unchecked(log));
+            }
+
+            //gl::DetachShader(program, vs);
+            if let Some(ps) = ps {
+                //gl::DetachShader(program, ps);
+            }
+
+            gl::UseProgram(program);
+
+            // after linking we setup sampler bindings as specified in the shader
+            for bind in bindings {
+                match bind {
+                    VariableBinding::Uniform(name, id) => {
+                        let c_str = CString::new(name.as_bytes()).unwrap();
+                        let index = gl::GetUniformLocation(
+                            program,
+                            c_str.to_bytes_with_nul().as_ptr() as *const _,
+                        );
+
+                        // TODO: impl for block?
+                    }
+                    VariableBinding::UniformBlock(name, id) => {
+                        let c_str = CString::new(name.as_bytes()).unwrap();
+                        let index = gl::GetUniformBlockIndex(
+                            program,
+                            c_str.to_bytes_with_nul().as_ptr() as *const _,
+                        );
+
+                        gl::UniformBlockBinding(program, index, *id);
+                    }
+                    VariableBinding::Sampler(name, id) => {
+                        let c_str = CString::new(name.as_bytes()).unwrap();
+                        let index = gl::GetUniformLocation(
+                            program,
+                            c_str.to_bytes_with_nul().as_ptr() as *const _,
+                        );
+
+                        gl::Uniform1i(index, *id as i32);
+                    }
+                    _ => {}
+                }
+            }
+
+            Ok(Shader { program })
+        }
+    }
+
+    pub fn bind(&self) {
+        unsafe {
+            gl::UseProgram(self.program);
+        }
+    }
+
+    pub fn set_matrix(&self, name: &str, matrix: *const f32) {
+        unsafe {
+            let c_str = CString::new(name).unwrap();
+            let index = gl::GetUniformLocation(
+                self.program,
+                c_str.to_bytes_with_nul().as_ptr() as *const _,
+            );
+
+            gl::UniformMatrix4fv(index, 1, gl::FALSE, matrix);
+        }
+    }
+
+    pub fn bind_texture_2d(&self, index: u32, texture: &Texture2D) {
+        self.bind();
+
+        if let Some(handle) = texture.handle {
+            unsafe {
+                gl::ActiveTexture(gl::TEXTURE0 + index);
+                gl::BindTexture(gl::TEXTURE_2D, handle.get());
+            }
+        }
+    }
+}
+
+pub enum InputFormat {
+    Float(u32, bool),
+    Integer(u32),
+}
+
+pub struct InputElement {
+    pub shader_slot: u32,
+    pub buffer_slot: u32,
+    pub format: InputFormat,
+    pub components: u32,
+    pub stride: u32,
+    pub offset: u32,
+}
+
+// TODO:
+pub struct InputLayout {
+    pub elements: Vec<InputElement>,
+}
+
+pub struct LayoutGuard {
+    vao: u32,
+}
+
+impl Drop for LayoutGuard {
+    fn drop(&mut self) {
+        unsafe {
+            gl::DeleteVertexArrays(1, [self.vao].as_ptr());
+            gl::BindVertexArray(0);
+        }
+    }
+}
+
+impl InputLayout {
+    pub fn new(elements: Vec<InputElement>) -> Self {
+        InputLayout { elements }
+    }
+
+    pub fn bind(
+        &mut self,
+        buffers: &[(u32, &Buffer)],
+        index_buffer: Option<&Buffer>,
+    ) -> LayoutGuard {
+        let mut vao = 0;
+
+        unsafe {
+            gl::GenVertexArrays(1, &mut vao);
+            gl::BindVertexArray(vao);
+        }
+
+        for &(slot, ref buffer) in buffers {
+            unsafe {
+                gl::BindBuffer(buffer.ty(), buffer.handle());
+            }
+
+            for attr in self.elements.iter().filter(|a| a.buffer_slot == slot) {
+                unsafe {
+                    gl::EnableVertexAttribArray(attr.shader_slot);
+                    match attr.format {
+                        InputFormat::Float(fmt, normalized) => {
+                            gl::VertexAttribPointer(
+                                attr.shader_slot,
+                                attr.components as i32,
+                                fmt,
+                                if normalized { gl::TRUE } else { gl::FALSE },
+                                attr.stride as i32,
+                                attr.offset as *const _,
+                            );
+                        }
+                        InputFormat::Integer(fmt) => {
+                            gl::VertexAttribIPointer(
+                                attr.shader_slot,
+                                attr.components as i32,
+                                fmt,
+                                attr.stride as i32,
+                                attr.offset as *const _,
+                            );
+                        }
+                    }
+                }
+            }
+        }
+
+        if let Some(buf) = index_buffer {
+            unsafe {
+                gl::BindBuffer(gl::ELEMENT_ARRAY_BUFFER, buf.handle());
+            }
+        }
+
+        LayoutGuard { vao }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/lib-hedgewars-engine/src/render/map.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,302 @@
+use integral_geometry::{GridIndex, Point, Rect, Size};
+use land2d::Land2D;
+use vec2d::Vec2D;
+
+use super::{
+    camera::Camera,
+    gl::{
+        Buffer, InputElement, InputFormat, InputLayout, PipelineState, Shader, Texture2D,
+        VariableBinding,
+    },
+};
+
+// TODO: temp
+const VERTEX_SHADER: &'static str = r#"
+#version 150
+
+in vec2 Position;
+in vec3 Uv;
+
+out vec3 a_Uv;
+
+//uniform Common {
+uniform mat4 Projection;
+//};
+
+void main()
+{
+	a_Uv = Uv;
+	gl_Position = Projection * vec4(Position, 0.0, 1.0);
+}
+"#;
+
+const PIXEL_SHADER: &'static str = r#"
+#version 150
+
+in vec3 a_Uv;
+
+uniform sampler2D Texture;
+
+out vec4 Target;
+
+void main()
+{
+	 Target = texture2D(Texture, a_Uv.xy);
+}
+"#;
+
+pub struct MapTile {
+    // either index into GL texture array or emulated [Texture; N]
+    texture_index: u32,
+
+    width: u32,
+    height: u32,
+}
+
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub struct TileVertex {
+    pos: [f32; 2],
+    // doesn't hurt to include another float, just in case..
+    uv: [f32; 3],
+}
+
+pub struct DrawTile {
+    texture_index: u32,
+    index_len: u32,
+}
+
+pub struct MapRenderer {
+    tiles: Vec<MapTile>,
+    textures: Vec<Texture2D>,
+
+    tile_vertex_buffer: Buffer,
+    tile_index_buffer: Buffer,
+    tile_vertices: Vec<TileVertex>,
+    tile_indices: Vec<u16>,
+    tile_draw_calls: Vec<DrawTile>,
+    index_offset: u16,
+    tile_shader: Shader,
+    tile_layout: InputLayout,
+
+    tile_size: Size,
+    num_tile_x: usize,
+}
+
+impl MapRenderer {
+    pub fn new(tile_size: Size) -> Self {
+        debug_assert!(tile_size.is_power_of_two());
+
+        let tile_shader = Shader::new(
+            VERTEX_SHADER,
+            Some(PIXEL_SHADER),
+            &[
+                VariableBinding::Attribute("Position", 0),
+                VariableBinding::Attribute("Uv", 1),
+                VariableBinding::Sampler("Texture", 0),
+            ],
+        )
+        .unwrap();
+
+        let vertex_size = std::mem::size_of::<TileVertex>() as u32;
+        let tile_layout = InputLayout::new(vec![
+            // position
+            InputElement {
+                shader_slot: 0,
+                buffer_slot: 0,
+                format: InputFormat::Float(gl::FLOAT, false),
+                components: 2,
+                stride: vertex_size,
+                offset: 0,
+            },
+            // uv
+            InputElement {
+                shader_slot: 1,
+                buffer_slot: 0,
+                format: InputFormat::Float(gl::FLOAT, false),
+                components: 3,
+                stride: vertex_size,
+                offset: 8,
+            },
+        ]);
+
+        MapRenderer {
+            tiles: Vec::new(),
+            textures: Vec::new(),
+
+            tile_vertex_buffer: Buffer::empty(gl::ARRAY_BUFFER, gl::DYNAMIC_DRAW),
+            tile_index_buffer: Buffer::empty(gl::ELEMENT_ARRAY_BUFFER, gl::DYNAMIC_DRAW),
+            tile_vertices: Vec::new(),
+            tile_indices: Vec::new(),
+            index_offset: 0,
+
+            tile_draw_calls: Vec::new(),
+            tile_shader,
+            tile_layout,
+
+            tile_size,
+            num_tile_x: 0,
+        }
+    }
+
+    pub fn init(&mut self, land: &Vec2D<u32>) {
+        // clear tiles, but keep our textures for potential re-use
+        self.tiles.clear();
+
+        let tw = self.tile_size.width;
+        let th = self.tile_size.height;
+        let lw = land.width();
+        let lh = land.height();
+        let num_tile_x = lw / tw;
+        let num_tile_y = lh / th;
+
+        self.num_tile_x = num_tile_x;
+
+        for y in 0..num_tile_y {
+            for x in 0..num_tile_x {
+                let idx = x + y * num_tile_x;
+
+                let (data, stride) = {
+                    let bpp = 4;
+
+                    let offset = x * tw * bpp + y * th * lw * bpp;
+
+                    let data = unsafe { &land.as_bytes()[offset..] };
+                    let stride = land.width();
+
+                    (data, stride as u32)
+                };
+
+                let texture_index = if idx >= self.textures.len() {
+                    let texture = Texture2D::with_data(
+                        data,
+                        stride,
+                        self.tile_size,
+                        gl::RGBA8,
+                        gl::RGBA,
+                        gl::UNSIGNED_BYTE,
+                        gl::NEAREST,
+                    );
+
+                    let texture_index = self.textures.len();
+                    self.textures.push(texture);
+
+                    texture_index
+                } else {
+                    let texture_region = Rect::at_origin(self.tile_size);
+
+                    self.textures[idx].update(
+                        texture_region,
+                        data,
+                        stride,
+                        gl::RGBA,
+                        gl::UNSIGNED_BYTE,
+                    );
+                    idx
+                };
+
+                let tile = MapTile {
+                    texture_index: texture_index as u32,
+
+                    // TODO: are there ever non-power of two textures?
+                    width: self.tile_size.width as u32,
+                    height: self.tile_size.height as u32,
+                };
+                self.tiles.push(tile);
+            }
+        }
+    }
+
+    pub fn update(&mut self, land: &Land2D<u32>, region: Rect) {}
+
+    pub fn render(&mut self, camera: &Camera) {
+        let viewport = camera.viewport();
+        self.tile_vertices.clear();
+        self.tile_indices.clear();
+        self.tile_draw_calls.clear();
+        self.index_offset = 0;
+
+        for (idx, tile) in self.tiles.iter().enumerate() {
+            let tile_x = idx % self.num_tile_x;
+            let tile_y = idx / self.num_tile_x;
+            let tile_w = self.tile_size.width;
+            let tile_h = self.tile_size.width;
+
+            let origin = Point::new((tile_x * tile_w) as i32, (tile_y * tile_h) as i32);
+            let tile_rect = Rect::from_size(origin, self.tile_size);
+
+            if viewport.intersects(&tile_rect) {
+                // lazy
+                //dbg!(origin);
+                let tile_x = origin.x as f32;
+                let tile_y = origin.y as f32;
+                let tile_w = tile_x + tile_w as f32;
+                let tile_h = tile_y + tile_h as f32;
+                let uv_depth = tile.texture_index as f32;
+
+                //dbg!(tile_x);
+                let tl = TileVertex {
+                    pos: [tile_x, tile_y],
+                    uv: [0f32, 0f32, uv_depth],
+                };
+                let bl = TileVertex {
+                    pos: [tile_x, tile_h],
+                    uv: [0f32, 1f32, uv_depth],
+                };
+                let br = TileVertex {
+                    pos: [tile_w, tile_h],
+                    uv: [1f32, 1f32, uv_depth],
+                };
+                let tr = TileVertex {
+                    pos: [tile_w, tile_y],
+                    uv: [1f32, 0f32, uv_depth],
+                };
+
+                self.tile_vertices.extend(&[tl, bl, br, tr]);
+
+                let i = self.index_offset;
+                self.tile_indices
+                    .extend(&[i + 0, i + 1, i + 2, i + 2, i + 3, i + 0]);
+                self.index_offset += 4;
+
+                self.tile_draw_calls.push(DrawTile {
+                    texture_index: tile.texture_index,
+                    index_len: 6,
+                });
+            }
+        }
+
+        self.tile_vertex_buffer.write_typed(&self.tile_vertices);
+        self.tile_index_buffer.write_typed(&self.tile_indices);
+
+        let _g = self.tile_layout.bind(
+            &[(0, &self.tile_vertex_buffer)],
+            Some(&self.tile_index_buffer),
+        );
+
+        let projection = camera.projection();
+
+        self.tile_shader.bind();
+        self.tile_shader
+            .set_matrix("Projection", projection.as_ptr());
+
+        let _state = PipelineState::new().with_blend();
+
+        let mut draw_offset = 0;
+        for draw_call in &self.tile_draw_calls {
+            unsafe {
+                self.tile_shader
+                    .bind_texture_2d(0, &self.textures[draw_call.texture_index as usize]);
+
+                gl::DrawElements(
+                    gl::TRIANGLES,
+                    draw_call.index_len as i32,
+                    gl::UNSIGNED_SHORT,
+                    draw_offset as *const _,
+                );
+            }
+
+            draw_offset += draw_call.index_len * 2;
+        }
+    }
+}
--- a/rust/lib-hedgewars-engine/src/world.rs	Mon Jan 14 15:11:15 2019 -0500
+++ b/rust/lib-hedgewars-engine/src/world.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -1,14 +1,17 @@
-use fpnum::{FPNum, fp};
+use fpnum::{fp, FPNum, FPPoint};
+use hwphysics::{
+    self as hwp,
+    common::{GearId, Millis},
+};
 use integral_geometry::{Point, Rect, Size};
 use land2d::Land2D;
 use landgen::{
-    outline_template::OutlineTemplate,
-    template_based::TemplatedLandGenerator,
-    LandGenerationParameters,
-    LandGenerator,
+    outline_template::OutlineTemplate, template_based::TemplatedLandGenerator,
+    LandGenerationParameters, LandGenerator,
 };
 use lfprng::LaggedFibonacciPRNG;
-use hwphysics as hwp;
+
+use crate::render::{camera::Camera, GearRenderer, MapRenderer};
 
 struct GameState {
     land: Land2D<u32>,
@@ -17,25 +20,49 @@
 
 impl GameState {
     fn new(land: Land2D<u32>, physics: hwp::World) -> Self {
-        Self {
-            land,
-            physics,
-        }
+        Self { land, physics }
     }
 }
 
 pub struct World {
     random_numbers_gen: LaggedFibonacciPRNG,
-    preview: Land2D<u8>,
+    preview: Option<Land2D<u8>>,
     game_state: Option<GameState>,
+    map_renderer: Option<MapRenderer>,
+    gear_renderer: Option<GearRenderer>,
+    camera: Camera,
 }
 
 impl World {
     pub fn new() -> Self {
         Self {
             random_numbers_gen: LaggedFibonacciPRNG::new(&[]),
-            preview: Land2D::new(Size::new(0, 0), 0),
+            preview: None,
             game_state: None,
+            map_renderer: None,
+            gear_renderer: None,
+            camera: Camera::new(),
+        }
+    }
+
+    pub fn create_renderer(&mut self, width: u16, height: u16) {
+        let land_tile_size = Size::square(512);
+        self.map_renderer = Some(MapRenderer::new(land_tile_size));
+        self.gear_renderer = Some(GearRenderer::new());
+        self.camera = Camera::with_size(Size::new(width as usize, height as usize));
+
+        use mapgen::{theme::Theme, MapGenerator};
+        use std::path::Path;
+
+        if let Some(ref state) = self.game_state {
+            self.camera.position = state.land.play_box().center();
+
+            let theme =
+                Theme::load(Path::new("../../share/hedgewars/Data/Themes/Cheese/")).unwrap();
+            let texture = MapGenerator::new().make_texture(&state.land, &theme);
+            if let Some(ref mut renderer) = self.map_renderer {
+                renderer.init(&texture);
+            }
         }
     }
 
@@ -43,7 +70,7 @@
         self.random_numbers_gen = LaggedFibonacciPRNG::new(seed);
     }
 
-    pub fn preview(&self) -> &Land2D<u8> {
+    pub fn preview(&self) -> &Option<Land2D<u8>> {
         &self.preview
     }
 
@@ -63,7 +90,11 @@
 
         let params = LandGenerationParameters::new(0u8, u8::max_value(), 5, false, false);
         let landgen = TemplatedLandGenerator::new(template());
-        self.preview = landgen.generate_land(&params, &mut self.random_numbers_gen);
+        self.preview = Some(landgen.generate_land(&params, &mut self.random_numbers_gen));
+    }
+
+    pub fn dispose_preview(&mut self) {
+        self.preview = None
     }
 
     pub fn init(&mut self, template: OutlineTemplate) {
@@ -76,9 +107,53 @@
         self.game_state = Some(GameState::new(land, physics));
     }
 
+    pub fn move_camera(&mut self, position_shift: Point, zoom_shift: f32) {
+        self.camera.zoom += zoom_shift;
+        self.camera.position += Point::new(
+            (position_shift.x as f32 / self.camera.zoom) as i32,
+            (position_shift.y as f32 / self.camera.zoom) as i32,
+        );
+    }
+
+    pub fn render(&mut self) {
+        if let Some(ref mut renderer) = self.map_renderer {
+            unsafe {
+                gl::ClearColor(0.4f32, 0f32, 0.2f32, 1f32);
+                gl::Clear(gl::COLOR_BUFFER_BIT);
+            }
+
+            renderer.render(&self.camera);
+        }
+        if let Some(ref mut renderer) = self.gear_renderer {
+            renderer.render(&self.camera)
+        }
+    }
+
+    fn create_gear(&mut self, position: Point) {
+        if let Some(ref mut state) = self.game_state {
+            let id = state.physics.new_gear().unwrap();
+            let fp_position = FPPoint::new(position.x.into(), position.y.into());
+            state.physics.add_gear_data(
+                id,
+                hwp::physics::PhysicsData::new(fp_position, FPPoint::zero()),
+            )
+        }
+    }
+
     pub fn step(&mut self) {
         if let Some(ref mut state) = self.game_state {
-            state.physics.step(fp!(1), &state.land);
+            let next = self.random_numbers_gen.next().unwrap();
+            if next % 32 == 0 {
+                let position = Point::new(
+                    (self.random_numbers_gen.next().unwrap() % state.land.width() as u32) as i32,
+                    0,
+                );
+                self.create_gear(position);
+            }
+        }
+
+        if let Some(ref mut state) = self.game_state {
+            state.physics.step(Millis::new(1), &state.land);
         }
     }
 }
--- a/rust/mapgen/src/lib.rs	Mon Jan 14 15:11:15 2019 -0500
+++ b/rust/mapgen/src/lib.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -1,25 +1,19 @@
 pub mod theme;
 
-use std::{
-    collections::hash_map::HashMap,
-    borrow::Borrow,
-    mem::replace
-};
-use serde_derive::{Deserialize};
+use self::theme::Theme;
+use integral_geometry::{Point, Rect, Size};
+use land2d::Land2D;
+use landgen::outline_template::OutlineTemplate;
+use rand::{thread_rng, Rng};
+use serde_derive::Deserialize;
 use serde_yaml;
-use integral_geometry::{Point, Size, Rect};
-use landgen::{
-    outline_template::OutlineTemplate
-};
-use rand::{thread_rng, Rng};
-use land2d::Land2D;
+use std::{borrow::Borrow, collections::hash_map::HashMap, mem::replace};
 use vec2d::Vec2D;
-use self::theme::Theme;
 
 #[derive(Deserialize)]
 struct PointDesc {
     x: u32,
-    y: u32
+    y: u32,
 }
 
 #[derive(Deserialize)]
@@ -27,7 +21,7 @@
     x: u32,
     y: u32,
     w: u32,
-    h: u32
+    h: u32,
 }
 
 #[derive(Deserialize)]
@@ -41,33 +35,42 @@
     put_girders: bool,
     max_hedgehogs: u8,
     outline_points: Vec<Vec<RectDesc>>,
-    fill_points: Vec<PointDesc>
+    fill_points: Vec<PointDesc>,
 }
 
 #[derive(Deserialize)]
 struct TemplateCollectionDesc {
     templates: Vec<TemplateDesc>,
-    template_types: HashMap<String, Vec<usize>>
+    template_types: HashMap<String, Vec<usize>>,
 }
 
 impl From<&TemplateDesc> for OutlineTemplate {
     fn from(desc: &TemplateDesc) -> Self {
         OutlineTemplate {
-            islands: desc.outline_points.iter()
-                .map(|v| v.iter()
-                    .map(|r| Rect::from_size(
-                        Point::new(r.x as i32, r.y as i32),
-                        Size::new(r.w as usize, r.h as usize)))
-                    .collect())
+            islands: desc
+                .outline_points
+                .iter()
+                .map(|v| {
+                    v.iter()
+                        .map(|r| {
+                            Rect::from_size(
+                                Point::new(r.x as i32, r.y as i32),
+                                Size::new(r.w as usize, r.h as usize),
+                            )
+                        })
+                        .collect()
+                })
                 .collect(),
-            fill_points: desc.fill_points.iter()
+            fill_points: desc
+                .fill_points
+                .iter()
                 .map(|p| Point::new(p.x as i32, p.y as i32))
                 .collect(),
             size: Size::new(desc.width, desc.height),
             can_flip: desc.can_flip,
             can_invert: desc.can_invert,
             can_mirror: desc.can_mirror,
-            is_negative: desc.is_negative
+            is_negative: desc.is_negative,
         }
     }
 }
@@ -83,36 +86,45 @@
 
 #[derive(Debug)]
 pub struct MapGenerator {
-    pub(crate) templates: HashMap<TemplateType, Vec<OutlineTemplate>>
+    pub(crate) templates: HashMap<TemplateType, Vec<OutlineTemplate>>,
 }
 
 impl MapGenerator {
     pub fn new() -> Self {
-        Self { templates: HashMap::new() }
+        Self {
+            templates: HashMap::new(),
+        }
     }
 
     pub fn import_yaml_templates(&mut self, text: &str) {
         let mut desc: TemplateCollectionDesc = serde_yaml::from_str(text).unwrap();
         let templates = replace(&mut desc.templates, vec![]);
-        self.templates = desc.template_types.into_iter()
-            .map(|(size, indices)|
-                (TemplateType(size), indices.iter()
-                    .map(|i| (&templates[*i]).into())
-                    .collect()))
+        self.templates = desc
+            .template_types
+            .into_iter()
+            .map(|(size, indices)| {
+                (
+                    TemplateType(size),
+                    indices.iter().map(|i| (&templates[*i]).into()).collect(),
+                )
+            })
             .collect();
     }
 
     pub fn get_template(&self, template_type: &str) -> Option<&OutlineTemplate> {
-        self.templates.get(template_type).and_then(|t| thread_rng().choose(t))
+        self.templates
+            .get(template_type)
+            .and_then(|t| thread_rng().choose(t))
     }
 
-    pub fn make_texture(&self, land: &Land2D<u8>, theme: &Theme) -> Vec2D<u32> {
+    pub fn make_texture<LandT>(&self, land: &Land2D<LandT>, theme: &Theme) -> Vec2D<u32>
+    where
+        LandT: Copy + Default + PartialEq,
+    {
         let mut texture = Vec2D::new(land.size(), 0);
 
         if let Some(land_sprite) = theme.land_texture() {
-            for (row_index, (land_row, tex_row)) in land.rows()
-                .zip(texture.rows_mut())
-                .enumerate()
+            for (row_index, (land_row, tex_row)) in land.rows().zip(texture.rows_mut()).enumerate()
             {
                 let sprite_row = land_sprite.get_row(row_index % land_sprite.height());
                 let mut x_offset = 0;
@@ -121,7 +133,7 @@
                     tex_row_copy(
                         &land_row[copy_range.clone()],
                         &mut tex_row[copy_range],
-                        sprite_row
+                        sprite_row,
                     );
 
                     x_offset += land_sprite.width()
@@ -132,7 +144,7 @@
                     tex_row_copy(
                         &land_row[final_range.clone()],
                         &mut tex_row[final_range],
-                        &sprite_row[..land.width() - x_offset]
+                        &sprite_row[..land.width() - x_offset],
                     );
                 }
             }
@@ -149,10 +161,10 @@
                 land.rows().rev().zip(texture.rows_mut().rev()),
                 &mut offsets,
                 border_width,
-                |x, y| border_sprite.get_pixel(
-                    x % border_sprite.width(),
-                    border_sprite.height() - 1 - y,
-                )
+                |x, y| {
+                    border_sprite
+                        .get_pixel(x % border_sprite.width(), border_sprite.height() - 1 - y)
+                },
             );
 
             offsets.iter_mut().for_each(|v| *v = 255);
@@ -161,10 +173,7 @@
                 land.rows().zip(texture.rows_mut()),
                 &mut offsets,
                 border_width,
-                |x, y| border_sprite.get_pixel(
-                    x % border_sprite.width(),
-                    y,
-                )
+                |x, y| border_sprite.get_pixel(x % border_sprite.width(), y),
             );
         }
 
@@ -213,22 +222,22 @@
     (red as u32) << 0 | (green as u32) << 8 | (blue as u32) << 16 | (alpha as u32) << 24
 }
 
-fn land_border_pass<'a, T, F>(rows: T, offsets: &mut [u8], border_width: u8, pixel_getter: F)
-    where T: Iterator<Item = (&'a [u8], &'a mut [u32])>,
-          F: (Fn(usize, usize) -> u32)
+fn land_border_pass<'a, LandT, T, F>(rows: T, offsets: &mut [u8], border_width: u8, pixel_getter: F)
+where
+    LandT: Default + PartialEq + 'a,
+    T: Iterator<Item = (&'a [LandT], &'a mut [u32])>,
+    F: (Fn(usize, usize) -> u32),
 {
     for (land_row, tex_row) in rows {
-        for (x, ((land_v, tex_v), offset_v)) in land_row.iter()
+        for (x, ((land_v, tex_v), offset_v)) in land_row
+            .iter()
             .zip(tex_row.iter_mut())
             .zip(offsets.iter_mut())
             .enumerate()
         {
-            *offset_v = if *land_v == 0 {
+            *offset_v = if *land_v == LandT::default() {
                 if *offset_v < border_width {
-                    *tex_v = blend(
-                        pixel_getter(x, *offset_v as usize),
-                        *tex_v,
-                    )
+                    *tex_v = blend(pixel_getter(x, *offset_v as usize), *tex_v)
                 }
                 offset_v.saturating_add(1)
             } else {
@@ -238,11 +247,12 @@
     }
 }
 
-fn tex_row_copy(land_row: &[u8], tex_row: &mut [u32], sprite_row: &[u32]) {
-    for ((land_v, tex_v), sprite_v) in
-        land_row.iter().zip(tex_row.iter_mut()).zip(sprite_row)
-    {
-        *tex_v = if *land_v == 0 {
+fn tex_row_copy<LandT>(land_row: &[LandT], tex_row: &mut [u32], sprite_row: &[u32])
+where
+    LandT: Default + PartialEq,
+{
+    for ((land_v, tex_v), sprite_v) in land_row.iter().zip(tex_row.iter_mut()).zip(sprite_row) {
+        *tex_v = if *land_v == LandT::default() {
             *sprite_v
         } else {
             0
@@ -252,10 +262,7 @@
 
 #[cfg(test)]
 mod tests {
-    use crate::{
-        MapGenerator,
-        TemplateType
-    };
+    use crate::{MapGenerator, TemplateType};
 
     #[test]
     fn simple_load() {
@@ -292,7 +299,9 @@
         let mut generator = MapGenerator::new();
         generator.import_yaml_templates(&text);
 
-        assert!(generator.templates.contains_key(&TemplateType("test".to_string())));
+        assert!(generator
+            .templates
+            .contains_key(&TemplateType("test".to_string())));
 
         let template = generator.get_template("test").unwrap();
 
--- a/rust/mapgen/src/theme.rs	Mon Jan 14 15:11:15 2019 -0500
+++ b/rust/mapgen/src/theme.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -1,207 +1,194 @@
-use std::{
-    slice::{
-        from_raw_parts,
-        from_raw_parts_mut
-    },
-    io,
-    io::BufReader,
-    fs::{File, read_dir},
-    path::Path
-};
-use png::{
-    ColorType,
-    Decoder,
-    DecodingError
-};
-
-use integral_geometry::Size;
-use vec2d::Vec2D;
-
-pub struct ThemeSprite {
-    pixels: Vec2D<u32>
-}
-
-impl ThemeSprite {
-    #[inline]
-    pub fn size(&self) -> Size {
-        self.pixels.size()
-    }
-
-    #[inline]
-    pub fn width(&self) -> usize {
-        self.size().width
-    }
-
-    #[inline]
-    pub fn height(&self) -> usize {
-        self.size().height
-    }
-
-    #[inline]
-    pub fn rows(&self) -> impl DoubleEndedIterator<Item = &[u32]> {
-        self.pixels.rows()
-    }
-
-    #[inline]
-    pub fn get_row(&self, index: usize) -> &[u32] {
-        &self.pixels[index]
-    }
-
-    #[inline]
-    pub fn get_pixel(&self, x: usize, y: usize) -> u32 {
-        self.pixels[y][x]
-    }
-
-    pub fn to_transposed(&self) -> ThemeSprite {
-        let size = self.size().transpose();
-        let mut pixels = Vec2D::new(size, 0u32);
-        for (y, row) in self.pixels.rows().enumerate() {
-            for (x, v) in row.iter().enumerate() {
-                pixels[x][y] = *v;
-            }
-        }
-        ThemeSprite { pixels }
-    }
-
-    pub fn to_tiled(&self) -> TiledSprite {
-        let size = self.size();
-        assert!(size.is_power_of_two());
-        let tile_width_shift = size.width.trailing_zeros() as usize + 2;
-        let mut pixels = vec![0u32; size.area()];
-
-        for (y, row) in self.pixels.rows().enumerate() {
-            for (x, v) in row.iter().enumerate() {
-                pixels[get_tiled_index(x, y, tile_width_shift)] = *v;
-            }
-        }
-
-        TiledSprite { tile_width_shift, size, pixels }
-    }
-}
-
-#[inline]
-fn get_tiled_index(x: usize, y: usize, tile_width_shift: usize) -> usize {
-    (((y >> 2) << tile_width_shift) + ((x >> 2) << 4)) + ((y & 0b11) << 2) + (x & 0b11)
-}
-
-pub struct TiledSprite {
-    tile_width_shift: usize,
-    size: Size,
-    pixels: Vec<u32>
-}
-
-impl TiledSprite {
-    #[inline]
-    pub fn size(&self) -> Size {
-        self.size
-    }
-
-    #[inline]
-    pub fn width(&self) -> usize {
-        self.size().width
-    }
-
-    #[inline]
-    pub fn height(&self) -> usize {
-        self.size().height
-    }
-
-    #[inline]
-    pub fn get_pixel(&self, x: usize, y: usize) -> u32 {
-        self.pixels[get_tiled_index(x, y, self.tile_width_shift)]
-    }
-}
-
-pub struct Theme {
-    land_texture: Option<ThemeSprite>,
-    border_texture: Option<ThemeSprite>
-}
-
-impl Theme {
-    pub fn land_texture(&self) -> Option<&ThemeSprite> {
-        self.land_texture.as_ref()
-    }
-
-    pub fn border_texture(&self) -> Option<&ThemeSprite> {
-        self.border_texture.as_ref()
-    }
-}
-
-#[derive(Debug)]
-pub enum ThemeLoadError {
-    File(io::Error),
-    Decoding(DecodingError),
-    Format(String)
-}
-
-impl From<io::Error> for ThemeLoadError {
-    fn from(e: io::Error) -> Self {
-        ThemeLoadError::File(e)
-    }
-}
-
-impl From<DecodingError> for ThemeLoadError {
-    fn from(e: DecodingError) -> Self {
-        ThemeLoadError::Decoding(e)
-    }
-}
-
-impl Theme {
-    pub fn new() -> Self {
-        Theme {
-            land_texture: None,
-            border_texture: None,
-        }
-    }
-
-    pub fn load(path: &Path) -> Result<Theme, ThemeLoadError> {
-        let mut theme = Self::new();
-
-        for entry in read_dir(path)? {
-            let file = entry?;
-            if file.file_name() == "LandTex.png" {
-                theme.land_texture = Some(load_sprite(&file.path())?)
-            } else if file.file_name() == "Border.png" {
-                theme.border_texture = Some(load_sprite(&file.path())?)
-            }
-        }
-
-        Ok(theme)
-    }
-}
-
-fn load_sprite(path: &Path) -> Result<ThemeSprite, ThemeLoadError> {
-    let decoder = Decoder::new(
-        BufReader::new(File::open(path)?));
-    let (info, mut reader) = decoder.read_info()?;
-
-    if info.color_type != ColorType::RGBA {
-        return Err(ThemeLoadError::Format(
-            format!("Unexpected format: {:?}", info.color_type)));
-    }
-    let size = Size::new(info.width as usize, info.height as usize);
-
-    let mut pixels: Vec2D<u32> = Vec2D::new(size, 0);
-    reader.next_frame(slice_u32_to_u8_mut(pixels.as_mut_slice()))?;
-
-    Ok(ThemeSprite { pixels })
-}
-
-pub fn slice_u32_to_u8(slice_u32: &[u32]) -> &[u8] {
-    unsafe {
-        from_raw_parts::<u8>(
-            slice_u32.as_ptr() as *const u8,
-            slice_u32.len() * 4
-        )
-    }
-}
-
-pub fn slice_u32_to_u8_mut(slice_u32: &mut [u32]) -> &mut [u8] {
-    unsafe {
-        from_raw_parts_mut::<u8>(
-            slice_u32.as_mut_ptr() as *mut u8,
-            slice_u32.len() * 4
-        )
-    }
-}
-
+use png::{ColorType, Decoder, DecodingError};
+use std::{
+    fs::{read_dir, File},
+    io,
+    io::BufReader,
+    path::Path,
+    slice::{from_raw_parts, from_raw_parts_mut},
+};
+
+use integral_geometry::Size;
+use vec2d::Vec2D;
+
+pub struct ThemeSprite {
+    pixels: Vec2D<u32>,
+}
+
+impl ThemeSprite {
+    #[inline]
+    pub fn size(&self) -> Size {
+        self.pixels.size()
+    }
+
+    #[inline]
+    pub fn width(&self) -> usize {
+        self.size().width
+    }
+
+    #[inline]
+    pub fn height(&self) -> usize {
+        self.size().height
+    }
+
+    #[inline]
+    pub fn rows(&self) -> impl DoubleEndedIterator<Item = &[u32]> {
+        self.pixels.rows()
+    }
+
+    #[inline]
+    pub fn get_row(&self, index: usize) -> &[u32] {
+        &self.pixels[index]
+    }
+
+    #[inline]
+    pub fn get_pixel(&self, x: usize, y: usize) -> u32 {
+        self.pixels[y][x]
+    }
+
+    pub fn to_transposed(&self) -> ThemeSprite {
+        let size = self.size().transpose();
+        let mut pixels = Vec2D::new(size, 0u32);
+        for (y, row) in self.pixels.rows().enumerate() {
+            for (x, v) in row.iter().enumerate() {
+                pixels[x][y] = *v;
+            }
+        }
+        ThemeSprite { pixels }
+    }
+
+    pub fn to_tiled(&self) -> TiledSprite {
+        let size = self.size();
+        assert!(size.is_power_of_two());
+        let tile_width_shift = size.width.trailing_zeros() as usize + 2;
+        let mut pixels = vec![0u32; size.area()];
+
+        for (y, row) in self.pixels.rows().enumerate() {
+            for (x, v) in row.iter().enumerate() {
+                pixels[get_tiled_index(x, y, tile_width_shift)] = *v;
+            }
+        }
+
+        TiledSprite {
+            tile_width_shift,
+            size,
+            pixels,
+        }
+    }
+}
+
+#[inline]
+fn get_tiled_index(x: usize, y: usize, tile_width_shift: usize) -> usize {
+    (((y >> 2) << tile_width_shift) + ((x >> 2) << 4)) + ((y & 0b11) << 2) + (x & 0b11)
+}
+
+pub struct TiledSprite {
+    tile_width_shift: usize,
+    size: Size,
+    pixels: Vec<u32>,
+}
+
+impl TiledSprite {
+    #[inline]
+    pub fn size(&self) -> Size {
+        self.size
+    }
+
+    #[inline]
+    pub fn width(&self) -> usize {
+        self.size().width
+    }
+
+    #[inline]
+    pub fn height(&self) -> usize {
+        self.size().height
+    }
+
+    #[inline]
+    pub fn get_pixel(&self, x: usize, y: usize) -> u32 {
+        self.pixels[get_tiled_index(x, y, self.tile_width_shift)]
+    }
+}
+
+pub struct Theme {
+    land_texture: Option<ThemeSprite>,
+    border_texture: Option<ThemeSprite>,
+}
+
+impl Theme {
+    pub fn land_texture(&self) -> Option<&ThemeSprite> {
+        self.land_texture.as_ref()
+    }
+
+    pub fn border_texture(&self) -> Option<&ThemeSprite> {
+        self.border_texture.as_ref()
+    }
+}
+
+#[derive(Debug)]
+pub enum ThemeLoadError {
+    File(io::Error),
+    Decoding(DecodingError),
+    Format(String),
+}
+
+impl From<io::Error> for ThemeLoadError {
+    fn from(e: io::Error) -> Self {
+        ThemeLoadError::File(e)
+    }
+}
+
+impl From<DecodingError> for ThemeLoadError {
+    fn from(e: DecodingError) -> Self {
+        ThemeLoadError::Decoding(e)
+    }
+}
+
+impl Theme {
+    pub fn new() -> Self {
+        Theme {
+            land_texture: None,
+            border_texture: None,
+        }
+    }
+
+    pub fn load(path: &Path) -> Result<Theme, ThemeLoadError> {
+        let mut theme = Self::new();
+
+        for entry in read_dir(path)? {
+            let file = entry?;
+            if file.file_name() == "LandTex.png" {
+                theme.land_texture = Some(load_sprite(&file.path())?)
+            } else if file.file_name() == "Border.png" {
+                theme.border_texture = Some(load_sprite(&file.path())?)
+            }
+        }
+
+        Ok(theme)
+    }
+}
+
+fn load_sprite(path: &Path) -> Result<ThemeSprite, ThemeLoadError> {
+    let decoder = Decoder::new(BufReader::new(File::open(path)?));
+    let (info, mut reader) = decoder.read_info()?;
+
+    if info.color_type != ColorType::RGBA {
+        return Err(ThemeLoadError::Format(format!(
+            "Unexpected format: {:?}",
+            info.color_type
+        )));
+    }
+    let size = Size::new(info.width as usize, info.height as usize);
+
+    let mut pixels: Vec2D<u32> = Vec2D::new(size, 0);
+    reader.next_frame(slice_u32_to_u8_mut(pixels.as_mut_slice()))?;
+
+    Ok(ThemeSprite { pixels })
+}
+
+pub fn slice_u32_to_u8(slice_u32: &[u32]) -> &[u8] {
+    unsafe { from_raw_parts::<u8>(slice_u32.as_ptr() as *const u8, slice_u32.len() * 4) }
+}
+
+pub fn slice_u32_to_u8_mut(slice_u32: &mut [u32]) -> &mut [u8] {
+    unsafe { from_raw_parts_mut::<u8>(slice_u32.as_mut_ptr() as *mut u8, slice_u32.len() * 4) }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/physfs-rs/Cargo.toml	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,15 @@
+[package]
+
+name = "physfs-rs"
+version = "0.1.0"
+license = "zlib"
+authors = [ "Robert Habermeier" ]
+
+[lib]
+
+name = "physfs"
+
+[dependencies]
+
+libc = "0.1"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/physfs-rs/LICENSE.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,20 @@
+Copyright (c) 2014 Robert Habermeier
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+   1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
+
+   2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original software.
+
+   3. This notice may not be removed or altered from any source
+   distribution.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/physfs-rs/README.md	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,7 @@
+# physfs-rs [![Build Status](https://travis-ci.org/PistonDevelopers/physfs-rs.svg?branch=master)](https://travis-ci.org/PistonDevelopers/physfs-rs)
+
+## Rust bindings for PhysFS
+
+This project is built against the Rust nightly and PhysFS 2.0.3
+
+[How to contribute](https://github.com/PistonDevelopers/piston/blob/master/CONTRIBUTING.md)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/physfs-rs/build.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,4 @@
+fn main() {
+    #[cfg(target_os = "freebsd")]
+    println!("cargo:rustc-link-search=native=/usr/local/lib");
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/physfs-rs/src/lib.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,13 @@
+//! PhysFS bindings for Rust
+
+#![deny(missing_docs)]
+
+extern crate libc;
+
+pub use physfs::*;
+pub use physfs::file::*;
+
+/// PhysFS bindings
+mod physfs;
+/// Definitions for the PhysFS primitives
+mod primitives;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/physfs-rs/src/physfs/file.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,216 @@
+use std::ffi::CString;
+use std::io::{ Read, Write, Seek, SeekFrom, Result };
+use std::mem;
+use libc::{ c_int, c_char, c_void };
+use primitives::*;
+use super::{ PhysFSContext };
+use super::util::physfs_error_as_io_error;
+
+#[link(name = "physfs")]
+extern {
+    // valid filehandle on success, NULL on failure
+    fn PHYSFS_openAppend(filename: *const c_char) -> *const RawFile;
+    fn PHYSFS_openRead(filename: *const c_char) -> *const RawFile;
+    fn PHYSFS_openWrite(filename: *const c_char) -> *const RawFile;
+
+    // nonzero on success, 0 on failure (and the handle stays open)
+    // The docs make it sound like failure is rare.
+    fn PHYSFS_close(file: *const RawFile) -> c_int;
+
+    // Number of bytes read on success, -1 on failure.
+    fn PHYSFS_read(file: *const RawFile, buffer: *mut c_void,
+                   obj_size: PHYSFS_uint32, obj_count: PHYSFS_uint32) -> PHYSFS_sint64;
+
+    // Number of bytes written on success, -1 on failure.
+    fn PHYSFS_write(file: *const RawFile, buffer: *const c_void,
+                    obj_size: PHYSFS_uint32, obj_count: PHYSFS_uint32) -> PHYSFS_sint64;
+
+    // Flush buffered file; no-op for unbuffered files.
+    fn PHYSFS_flush(file: *const RawFile) -> c_int;
+
+    // Seek to position in file; nonzero on succss, zero on error.
+    fn PHYSFS_seek(file: *const RawFile, pos: PHYSFS_uint64) -> c_int;
+
+    // Current position in file, -1 on failure.
+    fn PHYSFS_tell(file: *const RawFile) -> PHYSFS_sint64;
+
+    // nonzero if EOF, zero if not.
+    fn PHYSFS_eof(file: *const RawFile) -> c_int;
+
+    // Determine file size; returns -1 if impossible
+    fn PHYSFS_fileLength(file: *const RawFile) -> PHYSFS_sint64;
+}
+
+/// Possible ways to open a file.
+#[derive(Copy, Clone)]
+pub enum Mode {
+    /// Append to the end of the file.
+    Append,
+    /// Read from the file.
+    Read,
+    /// Write to the file, overwriting previous data.
+    Write,
+}
+
+/// A wrapper for the PHYSFS_File type.
+#[repr(C)]
+struct RawFile {
+    opaque: *const c_void,
+}
+
+/// A file handle.
+#[allow(dead_code)]
+pub struct File<'f> {
+    raw: *const RawFile,
+    mode: Mode,
+    context: &'f PhysFSContext,
+}
+
+impl<'f> File<'f> {
+    /// Opens a file with a specific mode.
+    pub fn open<'g>(context: &'g PhysFSContext, filename: String, mode: Mode) -> Result<File<'g>> {
+        let c_filename = try!(CString::new(filename));
+        let raw = unsafe { match mode {
+            Mode::Append => PHYSFS_openAppend(c_filename.as_ptr()),
+            Mode::Read => PHYSFS_openRead(c_filename.as_ptr()),
+            Mode::Write => PHYSFS_openWrite(c_filename.as_ptr())
+        }};
+
+        if raw.is_null() {
+            Err(physfs_error_as_io_error())
+        }
+        else {
+            Ok(File{raw: raw, mode: mode, context: context})
+        }
+    }
+
+    /// Closes a file handle.
+    fn close(&self) -> Result<()> {
+        match unsafe {
+            PHYSFS_close(self.raw)
+        } {
+            0 => Err(physfs_error_as_io_error()),
+            _ => Ok(())
+        }
+    }
+
+    /// Checks whether eof is reached or not.
+    pub fn eof(&self) -> bool {
+        let ret = unsafe {
+            PHYSFS_eof(self.raw)
+        };
+
+        ret != 0
+    }
+
+    /// Determine length of file, if possible
+    pub fn len(&self) -> Result<u64> {
+        let len = unsafe { PHYSFS_fileLength(self.raw) };
+
+        if len >= 0 {
+            Ok(len as u64)
+        } else {
+            Err(physfs_error_as_io_error())
+        }
+    }
+
+    /// Determines current position within a file
+    pub fn tell(&self) -> Result<u64> {
+        let ret = unsafe {
+            PHYSFS_tell(self.raw)
+        };
+
+        match ret {
+            -1 => Err(physfs_error_as_io_error()),
+            _ => Ok(ret as u64)
+        }
+    }
+}
+
+impl<'f> Read for File<'f> {
+    /// Reads from a file
+    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
+        let ret = unsafe {
+            PHYSFS_read(
+                self.raw,
+                buf.as_ptr() as *mut c_void,
+                mem::size_of::<u8>() as PHYSFS_uint32,
+                buf.len() as PHYSFS_uint32
+            )
+        };
+
+        match ret {
+            -1 => Err(physfs_error_as_io_error()),
+            _ => Ok(ret as usize)
+        }
+    }
+}
+
+impl<'f> Write for File<'f> {
+    /// Writes to a file.
+    /// This code performs no safety checks to ensure
+    /// that the buffer is the correct length.
+    fn write(&mut self, buf: &[u8]) -> Result<usize> {
+        let ret = unsafe {
+            PHYSFS_write(
+                self.raw,
+                buf.as_ptr() as *const c_void,
+                mem::size_of::<u8>() as PHYSFS_uint32,
+                buf.len() as PHYSFS_uint32
+            )
+        };
+
+        match ret {
+            -1 => Err(physfs_error_as_io_error()),
+            _ => Ok(ret as usize)
+        }
+    }
+
+    /// Flushes a file if buffered; no-op if unbuffered.
+    fn flush(&mut self) -> Result<()> {
+        let ret = unsafe {
+            PHYSFS_flush(self.raw)
+        };
+
+        match ret {
+            0 => Err(physfs_error_as_io_error()),
+            _ => Ok(())
+        }
+    }
+}
+
+impl<'f> Seek for File<'f> {
+    /// Seek to a new position within a file
+    fn seek(&mut self, pos: SeekFrom) -> Result<u64> {
+        let seek_pos = match pos {
+            SeekFrom::Start(n) => n as i64,
+            SeekFrom::End(n) => {
+                let len = try!(self.len());
+                n + len as i64
+            }
+            SeekFrom::Current(n) => {
+                let curr_pos = try!(self.tell());
+                n + curr_pos as i64
+            }
+        };
+
+        let result = unsafe {
+            PHYSFS_seek(
+                self.raw,
+                seek_pos as PHYSFS_uint64
+            )
+        };
+
+        if result == -1 {
+            return Err(physfs_error_as_io_error());
+        }
+
+        self.tell()
+    }
+}
+
+impl<'f> Drop for File<'f> {
+    fn drop(&mut self) {
+        let _ = self.close();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/physfs-rs/src/physfs/mod.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,190 @@
+use std::ffi::{ CString, CStr, OsStr };
+use std::io::Result;
+use std::sync::{ Mutex };
+use libc::{ c_int, c_char };
+
+/// Keep track of the number of global contexts.
+static mut NUM_CONTEXTS: usize = 0;
+
+/// Utility
+mod util;
+/// File operations
+pub mod file;
+
+#[link(name = "physfs")]
+extern {
+    // nonzero on success, zero on error.
+    fn PHYSFS_init(arg0: *const c_char) -> c_int;
+    // nonzero if initialized, zero if not.
+    fn PHYSFS_isInit() -> c_int;
+    // nonzero if success, zero if error.
+    fn PHYSFS_deinit() -> c_int;
+    // string if success, NULL if error.
+    fn PHYSFS_getLastError() -> *const c_char;
+    // nonzero if success, zero if error
+    fn PHYSFS_mount(new_dir: *const c_char, mount_point: *const c_char, append_to_path: c_int) -> c_int;
+    // nonzero if success, zero if error.
+    fn PHYSFS_setWriteDir(write_dir: *const c_char) -> c_int;
+    // nonzero on success, zero on error.
+    fn PHYSFS_mkdir(dir_name: *const c_char) -> c_int;
+    // Checks if a given path exists; returns nonzero if true
+    fn PHYSFS_exists(path: *const c_char) -> c_int;
+    // Checks if a given path is a directory; returns nonzero if true
+    fn PHYSFS_isDirectory(path: *const c_char) -> c_int;
+}
+
+/// The access point for PhysFS function calls.
+pub struct PhysFSContext;
+
+unsafe impl Send for PhysFSContext {}
+
+impl PhysFSContext {
+    /// Creates a new PhysFS context.
+    pub fn new() -> Result<Self> {
+        let con = PhysFSContext;
+        match PhysFSContext::init() {
+            Err(e) => Err(e),
+            _ => {
+                // Everything's gone right so far
+                // now, increment the instance counter
+                println!("Inc");
+                unsafe {
+                    NUM_CONTEXTS += 1;
+                }
+                // and return the newly created context
+                Ok(con)
+            }
+        }
+    }
+
+    /// initializes the PhysFS library.
+    fn init() -> Result<()> {
+        // Initializing multiple times throws an error. So let's not!
+        if PhysFSContext::is_init() { return Ok(()); }
+
+        let mut args = ::std::env::args();
+        let default_arg0 = "".to_string();
+        let arg0 = args.next().unwrap_or(default_arg0);
+        let c_arg0 = try!(CString::new(arg0));
+        let ret = unsafe { PHYSFS_init(c_arg0.as_ptr()) };
+
+        match ret {
+            0 => Err(util::physfs_error_as_io_error()),
+            _ => Ok(())
+        }
+    }
+
+    /// Checks if PhysFS is initialized
+    pub fn is_init() -> bool {
+        unsafe { PHYSFS_isInit() != 0 }
+    }
+
+    /// De-initializes PhysFS. It is recommended to close
+    /// all file handles manually before calling this.
+    fn de_init() {
+        // de_init'ing more than once can cause a double-free -- do not want.
+        if !PhysFSContext::is_init() { return }
+        unsafe {
+            PHYSFS_deinit();
+        }
+    }
+    /// Adds an archive or directory to the search path.
+    /// mount_point is the location in the tree to mount it to.
+    pub fn mount<P>(&self, new_dir: P, mount_point: String, append_to_path: bool) -> Result<()>
+        where P: AsRef<OsStr>
+    {
+        let c_new_dir = CString::new(new_dir.as_ref().to_string_lossy().as_bytes()).unwrap();
+        let c_mount_point = try!(CString::new(mount_point));
+        match unsafe {
+            PHYSFS_mount(
+                c_new_dir.as_c_str().as_ptr(),
+                c_mount_point.as_ptr(),
+                append_to_path as c_int
+            )
+        } {
+            0 => Err(util::physfs_error_as_io_error()),
+            _ => Ok(())
+        }
+    }
+
+    /// Gets the last error message in a human-readable format
+    /// This message may be localized, so do not expect it to
+    /// match a specific string of characters.
+    pub fn get_last_error() -> String {
+        let ptr: *const c_char = unsafe {
+            PHYSFS_getLastError()
+        };
+        if ptr.is_null() {
+            return "".to_string()
+        }
+
+        let buf = unsafe { CStr::from_ptr(ptr).to_bytes().to_vec() };
+
+        String::from_utf8(buf).unwrap()
+    }
+
+    /// Sets a new write directory.
+    /// This method will fail if the current write dir
+    /// still has open files in it.
+    pub fn set_write_dir<P>(&self, write_dir: P) -> Result<()>
+        where P: AsRef<OsStr>
+    {
+        let write_dir = CStr::from_bytes_with_nul(write_dir.as_ref().to_str().unwrap().as_bytes()).unwrap();
+        let ret = unsafe {
+            PHYSFS_setWriteDir(write_dir.as_ptr())
+        };
+
+        match ret {
+            0 => Err(util::physfs_error_as_io_error()),
+            _ => Ok(())
+        }
+    }
+
+    /// Creates a new dir relative to the write_dir.
+    pub fn mkdir(&self, dir_name: &str) -> Result<()> {
+        let c_dir_name = try!(CString::new(dir_name));
+        let ret = unsafe {
+            PHYSFS_mkdir(c_dir_name.as_ptr())
+        };
+
+        match ret {
+            0 => Err(util::physfs_error_as_io_error()),
+            _ => Ok(())
+        }
+    }
+
+    /// Checks if given path exists
+    pub fn exists(&self, path: &str) -> Result<()> {
+        let c_path = try!(CString::new(path));
+        let ret = unsafe { PHYSFS_exists(c_path.as_ptr()) };
+
+        match ret {
+            0 => Err(util::physfs_error_as_io_error()),
+            _ => Ok(())
+        }
+    }
+
+    /// Checks if given path is a directory
+    pub fn is_directory(&self, path: &str) -> Result<()> {
+        let c_path = try!(CString::new(path));
+        let ret = unsafe { PHYSFS_isDirectory(c_path.as_ptr()) };
+
+        match ret {
+            0 => Err(util::physfs_error_as_io_error()),
+            _ => Ok(())
+        }
+    }
+}
+
+impl Drop for PhysFSContext {
+    fn drop(&mut self) {
+        // decrement NUM_CONTEXTS
+        unsafe {
+            NUM_CONTEXTS -= 1;
+        }
+        // and de_init if there aren't any contexts left.
+        if unsafe { NUM_CONTEXTS == 0 } {
+            PhysFSContext::de_init();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/physfs-rs/src/physfs/util.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,7 @@
+use std::io::{ Error, ErrorKind };
+use super::PhysFSContext;
+
+pub fn physfs_error_as_io_error() -> Error {
+    Error::new(ErrorKind::Other,
+               &format!("PhysicsFS Error: `{}`", PhysFSContext::get_last_error())[..])
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/physfs-rs/src/primitives.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,19 @@
+#![allow(non_camel_case_types)]
+
+pub type PHYSFS_uint8  = ::libc::c_uchar;
+pub type PHYSFS_sint8  = ::libc::c_char;
+pub type PHYSFS_uint16 = ::libc::c_ushort;
+pub type PHYSFS_sint16 = ::libc::c_short;
+pub type PHYSFS_uint32 = ::libc::c_uint;
+pub type PHYSFS_sint32 = ::libc::c_int;
+
+#[cfg(target_pointer_width = "64")]
+pub type PHYSFS_uint64 = ::libc::c_ulonglong;
+#[cfg(target_pointer_width = "64")]
+pub type PHYSFS_sint64 = ::libc::c_longlong;
+
+// PhysFS defines the 64-bit types to 32 bits on 32-bit systems.
+#[cfg(target_pointer_width = "32")]
+pub type PHYSFS_uint64 = ::libc::c_uint;
+#[cfg(target_pointer_width = "32")]
+pub type PHYSFS_sint64 = ::libc::c_int;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/physfs-rs/tests/directory/mod.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,40 @@
+use std::io::Read;
+use std::path::Path;
+
+use physfs::{ PhysFSContext, file };
+
+#[test]
+fn read_file_from_directory() {
+    let con = match PhysFSContext::new() {
+        Err(e) => panic!(e),
+        Ok(con) => con
+    };
+
+    assert!(PhysFSContext::is_init());
+
+    match con.mount(&Path::new(super::PATH_TO_HERE), "/test/".to_string(), true) {
+        Err(e) => panic!(e),
+        _ => ()
+    }
+
+    let mut file = match file::File::open(&con, "/test/directory/read.txt".to_string(), file::Mode::Read) {
+        Ok(f) => f,
+        Err(e) => panic!(e)
+    };
+
+    let buf = &mut [0; 32];
+
+    match file.read(buf) {
+        Err(e) => panic!(e),
+        _ => ()
+    }
+
+    let mut contents = String::new();
+    for &mut byte in buf {
+        if byte == 0 { break }
+        contents.push(byte as char);
+    }
+
+    assert!(contents == "Read from me.");
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/physfs-rs/tests/directory/read.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,1 @@
+Read from me.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/physfs-rs/tests/test.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,15 @@
+extern crate physfs;
+
+use physfs::PhysFSContext;
+
+mod directory;
+
+// from project_root
+const PATH_TO_HERE: &'static str = "tests/";
+
+//#[test]
+fn test_create_physfs_context() {
+    let _c = PhysFSContext::new().unwrap();
+    assert!(PhysFSContext::is_init());
+}
+
--- a/rust/vec2d/src/lib.rs	Mon Jan 14 15:11:15 2019 -0500
+++ b/rust/vec2d/src/lib.rs	Fri Aug 16 10:59:50 2019 -0600
@@ -95,6 +95,19 @@
         let width = self.width();
         self.data.chunks_exact_mut(width)
     }
+
+    #[inline]
+    pub unsafe fn as_bytes(&self) -> &[u8] {
+        use std::{
+            slice,
+            mem
+        };
+        
+        slice::from_raw_parts(
+            self.data.as_ptr() as *const u8,
+            self.data.len() * mem::size_of::<T>(),
+        )
+    }
 }
 
 impl<T: Copy> AsRef<[T]> for Vec2D<T> {
--- a/share/CMakeLists.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/CMakeLists.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -7,11 +7,6 @@
     #CFBundleVersion is HEDGEWARS_REVISION
     #CFBundleShortVersionString is HEDGEWARS_VERSION
 
-    #libav/ffmpeg always brings in VideoDecoderAcceleration, avaible only from 10.6.3
-    if(LIBAV_FOUND AND ${minimum_macosx_version} VERSION_EQUAL "10.6")
-        set(minimum_macosx_version "10.6.3")
-    endif()
-
     configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in
                    ${CMAKE_CURRENT_BINARY_DIR}/Info.plist)
     #path here should be Hedgewars.app/Contents/MacOS
--- a/share/hedgewars.appdata.xml	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars.appdata.xml	Fri Aug 16 10:59:50 2019 -0600
@@ -6,6 +6,7 @@
  <name>Hedgewars</name>
  <summary>Funny turn-based artillery game, featuring fighting Hedgehogs!</summary>
  <summary xml:lang="de">Lustiges zugbasiertes Artilleriespiel mit kämpfenden Igeln!</summary>
+ <summary xml:lang="gd">Geama sabaid èibhinn le gràineagan a’ losgadh air a chèile tè mu seach!</summary>
  <description>
   <p>
    Hedgewars is a turn-based strategy, artillery, action and comedy game, featuring the antics of pink hedgehogs with attitude as they battle from the depths of hell to the depths of space.
Binary file share/hedgewars/Data/Graphics/AirDrill.png has changed
Binary file share/hedgewars/Data/Graphics/AirMine.png has changed
Binary file share/hedgewars/Data/Graphics/Airplane.png has changed
Binary file share/hedgewars/Data/Graphics/AmmoMenu/Ammos_base.png has changed
Binary file share/hedgewars/Data/Graphics/AmmoMenu/Ammos_bw_base.png has changed
Binary file share/hedgewars/Data/Graphics/Drill.png has changed
Binary file share/hedgewars/Data/Graphics/Finger.png has changed
Binary file share/hedgewars/Data/Graphics/FingerBack.png has changed
Binary file share/hedgewars/Data/Graphics/FingerBackInv.png has changed
Binary file share/hedgewars/Data/Graphics/HaloHUD.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/zoo_crocodile.png has changed
Binary file share/hedgewars/Data/Graphics/HealthHUD.png has changed
Binary file share/hedgewars/Data/Graphics/HealthPoisonHUD.png has changed
Binary file share/hedgewars/Data/Graphics/Hedgehog.png has changed
Binary file share/hedgewars/Data/Graphics/Hedgehog/amCleaver.png has changed
Binary file share/hedgewars/Data/Graphics/Hedgehog/amJetpack.png has changed
Binary file share/hedgewars/Data/Graphics/Hedgehog/amLandGun.png has changed
Binary file share/hedgewars/Data/Graphics/Hedgehog/amShoryuken.png has changed
Binary file share/hedgewars/Data/Graphics/InvulnHUD.png has changed
Binary file share/hedgewars/Data/Graphics/KarmaHUD.png has changed
Binary file share/hedgewars/Data/Graphics/MedicHUD.png has changed
Binary file share/hedgewars/Data/Graphics/MedicPoisonHUD.png has changed
Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/desert01@2x.png has changed
Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/moon01@2x.png has changed
Binary file share/hedgewars/Data/Graphics/RopeNode.png has changed
Binary file share/hedgewars/Data/Graphics/Splash.png has changed
Binary file share/hedgewars/Data/Graphics/SuddenDeath/SDSplash.png has changed
Binary file share/hedgewars/Data/Graphics/Switch.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Graphics/Switch.svg	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="100%" height="100%" version="1.1" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"
+viewBox="0 0 213 213"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+  <style type="text/css">
+   <![CDATA[
+    .fil1 {fill:red}
+    .fil0 {fill:black;fill-rule:nonzero}
+   ]]>
+  </style>
+ </defs>
+ <g id="Background">
+  <path class="fil0" d="M118 44l16 17c1,1 2,2 3,3l0 1c0,1 0,2 0,3 0,2 0,3 0,4 -1,2 -2,3 -3,4l-17 16c-1,2 -2,3 -4,3 -1,1 -3,1 -5,0l-1 0c-1,0 -3,-1 -4,-2l0 0c-1,-1 -2,-2 -3,-4l-1 -1c-2,1 -5,2 -7,5 -4,3 -6,8 -6,14 0,1 0,2 0,3 1,1 1,2 1,3 2,5 0,10 -5,11l-18 6c-5,1 -9,-1 -11,-5l0 -1c-1,-2 -1,-5 -2,-8 0,-3 -1,-6 -1,-9 0,-16 6,-29 16,-39 9,-9 20,-15 32,-17 1,-1 1,-2 2,-3l1 -2c0,-1 1,-2 2,-3l1 -1c1,0 3,-1 4,-1l0 0c2,0 4,0 5,0 2,1 3,2 5,3l0 0zm-22 125l-17 -16c-1,-1 -2,-2 -2,-4l-1 0c0,-2 0,-3 0,-4 0,-1 0,-3 1,-4 0,-1 1,-2 2,-3l17 -17c1,-1 3,-2 4,-3 2,0 4,0 5,0l2 0c1,1 2,1 3,2l0 0c1,1 2,2 3,4l1 2c3,-1 5,-3 7,-5 4,-4 6,-9 6,-14 0,-2 0,-3 0,-4 0,-1 -1,-2 -1,-3 -2,-4 1,-9 5,-11l19 -6c4,-1 9,1 10,6l0 0c1,3 2,6 2,8 1,4 1,7 1,10 0,15 -6,29 -16,39 -8,8 -20,14 -32,16 -1,1 -1,2 -2,4l0 1c-1,1 -2,2 -3,3l-1 1c-1,1 -2,1 -4,1l0 0c-1,1 -3,1 -5,0 -1,0 -3,-1 -4,-3l0 0z"/>
+ </g>
+ <g id="Foreground">
+  <path class="fil1" d="M112 50l16 16c1,1 1,1 1,2 0,1 0,1 -1,2 -5,5 -11,11 -16,17 -1,0 -2,0 -2,0 -1,0 -2,0 -2,-1 -1,-3 -2,-4 -3,-8 -15,1 -27,13 -27,29 0,3 0,6 2,9l-19 6c-1,-5 -2,-10 -2,-15 0,-26 20,-47 46,-48 1,-4 2,-6 3,-9 0,0 1,-1 2,-1 0,0 1,0 2,1zm-10 114l-17 -17c-1,-1 -1,-1 -1,-2 0,0 0,-1 1,-1 6,-6 11,-12 17,-17 0,-1 1,-1 2,-1 1,0 1,1 2,1 1,3 2,4 2,8 15,0 27,-13 27,-28 0,-4 0,-7 -1,-10l18 -6c2,5 3,10 3,16 0,26 -21,47 -47,47 0,5 -1,6 -2,9 -1,1 -1,1 -2,1 -1,0 -2,0 -2,0z"/>
+ </g>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Graphics/SwitchBackOld.svg	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   height="40"
+   viewBox="0 0 38.717269 40.141553"
+   width="40"
+   version="1.1"
+   id="svg846">
+  <defs
+     id="defs850" />
+  <metadata
+     id="metadata834">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+        <cc:license
+           rdf:resource="" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <path
+     style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3.42808867;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
+     d="m 15.507879,4.1897282 -0.0059,4.850169 A 11.890786,11.890786 0 0 0 7.4827571,20.269221 11.890786,11.890786 0 0 0 15.86032,31.616276 l 7.299998,4.686695 0.0029,-4.77443 A 11.890786,11.890786 0 0 0 31.264178,20.269221 11.890786,11.890786 0 0 0 20.861213,8.4872412 Z m 5.725269,8.8777268 a 7.3191032,7.3191032 0 0 1 5.471063,7.072038 7.3191032,7.3191032 0 0 1 -3.538642,6.259176 l 0.0014,-2.284857 -4.378497,3.31518 a 7.3191032,7.3191032 0 0 1 -6.722553,-7.289499 7.3191032,7.3191032 0 0 1 3.429162,-6.195438 l -0.0037,2.86376 z"
+     id="path1168" />
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Graphics/SwitchOld.svg	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   id="svg846"
+   version="1.1"
+   width="40"
+   viewBox="0 0 38.717269 40.141553"
+   height="40">
+  <defs
+     id="defs850" />
+  <metadata
+     id="metadata834">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+        <cc:license
+           rdf:resource="" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <path
+     id="path1168"
+     d="m 15.507879,4.1897282 -0.0059,4.850169 A 11.890786,11.890786 0 0 0 7.4827571,20.269221 11.890786,11.890786 0 0 0 15.86032,31.616276 l 7.299998,4.686695 0.0029,-4.77443 A 11.890786,11.890786 0 0 0 31.264178,20.269221 11.890786,11.890786 0 0 0 20.861213,8.4872412 Z m 5.725269,8.8777268 a 7.3191032,7.3191032 0 0 1 5.471063,7.072038 7.3191032,7.3191032 0 0 1 -3.538642,6.259176 l 0.0014,-2.284857 -4.378497,3.31518 a 7.3191032,7.3191032 0 0 1 -6.722553,-7.289499 7.3191032,7.3191032 0 0 1 3.429162,-6.195438 l -0.0037,2.86376 z"
+     style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.42808867;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers" />
+</svg>
Binary file share/hedgewars/Data/Graphics/Targetp.png has changed
Binary file share/hedgewars/Data/Graphics/Targetp@2x.png has changed
Binary file share/hedgewars/Data/Graphics/TargetpBack.png has changed
Binary file share/hedgewars/Data/Graphics/TargetpBack@2x.png has changed
Binary file share/hedgewars/Data/Graphics/TargetpBackInv.png has changed
Binary file share/hedgewars/Data/Graphics/TargetpBackInv@2x.png has changed
Binary file share/hedgewars/Data/Graphics/VampHUD.png has changed
Binary file share/hedgewars/Data/Graphics/WindL.png has changed
Binary file share/hedgewars/Data/Graphics/WindR.png has changed
Binary file share/hedgewars/Data/Graphics/amPiano.png has changed
Binary file share/hedgewars/Data/Graphics/missions.png has changed
Binary file share/hedgewars/Data/Graphics/slider.png has changed
Binary file share/hedgewars/Data/Graphics/sliderInverted.png has changed
Binary file share/hedgewars/Data/Graphics/throughWrap.png has changed
--- a/share/hedgewars/Data/Locale/CMakeLists.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/CMakeLists.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -2,7 +2,7 @@
 
 file(GLOB txttrans2 ??.txt)
 file(GLOB txttrans5 ?????.txt)
-file(GLOB tsfiles *.ts)
+file(GLOB tsfiles hedgewars_*.ts)
 file(GLOB luafiles *.lua)
 file(GLOB missionfiles missions_*.txt)
 file(GLOB campaignfiles campaigns_*.txt)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Locale/UNUSED_ar.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,468 @@
+; Arabic locale
+
+00:00=رمانة‫
+00:01=عنقودية‫
+00:02=صاروخ‫
+00:03=صاروخ موجه‫
+00:04=بندقية
+00:05=مطرقة
+00:06=ترك
+00:07=حبل
+00:08=لغم
+00:09=مسدس حربي
+00:10=ديناميت
+00:11=مضرب بيسبول
+00:12=Shoryuken
+00:13=ثانية
+00:14=برشوت
+00:15=هجوم جوي
+00:16=هجوم الغام
+00:17=شعلة
+00:18=بناء
+00:19=نقل
+00:20=تبديل
+00:21=هاون
+00:22=سوط
+00:23=انتحار
+00:24=كيك
+00:25=اغواء
+00:26=ركية
+00:27=قنبلة جحيم
+00:28=صاروخ حفر
+00:29=مسدس كرات
+00:30=حارق
+00:31=طيارة مسيطرة عن بعد
+00:32=جاذبية قليلة
+00:33=تاثير مضاعف
+00:34=غير قابل للاضرار
+00:35=وقت اضافي
+00:36=منظار ليزر
+00:37=مصاص دماء
+00:38=قناص
+00:39=صحن طائر
+00:40=زجاجة حارقة
+00:41=طير
+
+; 01:00=Loading …
+01:01=تعادل
+01:02=%1 يفوز
+01:03=جزء %1%
+01:04=توقف
+01:05=خروج (%1/%2)?
+01:06=موت مفاجئ
+01:07=%1 متبقي
+01:08=طاقة: %1%
+01:09=تحديث...
+01:10=استعمال هذه لن ينهي دورك
+01:11=This weapon or utility is not yet available!
+
+; Event messages
+; Hog (%1) died
+02:00=%1 has kicked the bucket!
+02:00=%1 has seen the light!
+02:00=%1 never saw that coming!
+02:00=%1 waves goodbye!
+02:00=%1 has gone to a better place!
+02:00=%1 meets his maker!
+02:00=%1 can hang on no longer!
+02:00=%1 has done his duty!
+02:00=%1 makes the ultimate sacrifice!
+02:00=%1 departs this mortal coil!
+02:00=%1 makes like a tree and leaves!
+02:00=%1 has timed out!
+02:00=%1 says peace out!
+02:00=%1 will be fondly remembered!
+02:00=%1 has an aneurysm!
+02:00=%1 leaves behind a wife and child
+02:00=%1 has launched his last bazooka
+02:00=%1 has tossed his last grenade
+02:00=%1 has baked his last cake
+02:00=%1 has swung on his last rope
+02:00=%1 has called his last airstrike
+02:00=%1 has pumped his last shotgun
+02:00=%1 has thrown his last melon
+02:00=%1 has drawn his last deagle
+02:00=%1 took one shot too many
+02:00=%1 could really have used a health crate
+02:00=%1 has gone to play a better game
+02:00=%1 has ragequit life
+02:00=%1 fails
+02:00=Poor poor %1...
+02:00=%1 prefers wormux
+02:00=%1 has been blocking shots with his face
+02:00=%1 is a hero amongst me...err..hogs
+02:00=%1 finds his place in Valhalla
+02:00=%1 has left the building
+02:00=%1 goes the way of the dinosaurs
+02:00=%1 brings hedgehogs one step closer to extinction
+02:00=%1 brings a tear to my eye
+02:00=%1 is an ex-hog
+02:00=%1 is pushing up the daisies
+02:00=%1 has ceased to be
+02:00=Say goodbye to %1
+02:00=No hope left for %1
+02:00=%1 faces the final curtain
+02:00=Smoke 'em if you got 'em, %1
+02:00=%1 suffers a Spontaneous Massive Existence Failure
+02:00=%1 has passed on
+02:00=%1 is stone dead
+02:00=%1 is no more
+02:00=%1 has expired
+02:00=Bereft of life, %1 rests in peace
+02:00=%1 joins the choir invisible
+02:00=Farewell %1, we hardly knew ye!
+02:00=%1 had a low tolerance for being shot
+02:00=%1 could have used an extra life
+02:00=Is there a doctor in the house?
+
+; Hog (%1) drowned
+02:01=%1 plays submarine!
+02:01=%1 mimics the Titanic!
+02:01=%1 swims like a stone!
+02:01=%1 floats like a brick!
+02:01=%1 checks out the deep end
+02:01=%1 goes glug glug glug
+02:01=%1 goes splash
+02:01=%1 forgot his armbands
+02:01=%1 really should have taken swimming lessons
+02:01=%1 left his surfboard at home
+02:01=%1 is washed up
+02:01=%1 is one soggy hog
+02:01=%1 forgot to bring his life jacket
+02:01=%1 goes splish splash splish
+02:01=%1 is sleeping with the fishes
+02:01=%1 thinks the water physics suck in this game
+02:01=%1 looks thirsty
+02:01=the sea claims %1
+02:01=%1 is lost at sea
+02:01=%1 should have brought his scuba gear
+02:01=%1 gets a burial at sea
+02:01=%1 has that sinking feeling
+02:01=%1 is practicing his backstroke
+02:01=%1 goes in search of the Titanic
+02:01=%1 is not Jesus
+02:01=%1 is finding Nemo
+02:01=%1 springs a leak
+02:01=You've gotta wonder how many hogs are down there
+02:01=%1 makes the ocean slightly higher
+02:01=%1 didn't enlist in the Navy
+02:01=%1 is doing his impersonation of a dead fish
+02:01=At least you didn't go down the toilet, %1
+02:01=Sonic couldn't swim and neither can %1
+02:01=%1 wants to play Ecco the dolphin
+02:01=%1 has gone to visit Aquaria
+02:01=%1 has found the lost city of Atlantis
+02:01=Your doggy paddle could use a little work, %1
+02:01=%1 should have brought a jet ski
+02:01=%1 doesn't like watersports
+02:01=%1 is forever blowing bubbles
+02:01=%1 is short of a raft
+02:01=%1 thinks salt water is good for the skin
+02:01=%1 gets salt water in his wounds
+02:01=%1 has walked the plank
+02:01=%1 has a bath
+02:01=%1 is wet wet wet
+02:01=%1 gets his quills wet
+02:01=It's Davy Jones' locker for %1
+
+; Round starts
+02:02=Let's fight!
+02:02=Armed and ready!
+02:02=Let's get ready to rumble!
+02:02=Let's get it on!
+02:02=Let's get this party started
+02:02=Last hog standing wins
+02:02=Let's go!
+02:02=Let's rock!
+02:02=Let's jam!
+02:02=It's beginning...
+02:02=This is the start of something big
+02:02=Welcome to Hedgewars
+02:02=Welcome to the front lines
+02:02=Crush your enemies!
+02:02=May the best hog win
+02:02=Victory or death
+02:02=To the victor goes the spoils
+02:02=Losing is not an option
+02:02=Cry havoc! Let loose the hogs of war!
+02:02=Hedgewars, brought to you by Hedgewars.org
+02:02=GL HF
+02:02=Just count yourself lucky you're not up against Tiyuri
+02:02=Just count yourself lucky you're not up against unC0Rr
+02:02=Just count yourself lucky you're not up against Nemo
+02:02=Just count yourself lucky you're not up against Smaxx
+02:02=Just count yourself lucky you're not up against Jessor
+02:02=Give it your all!
+02:02=The losers do the cleaning up!
+02:02=Let the fight of the millenium begin
+02:02=Let the fight of the century begin
+02:02=Let the fight of the decade begin
+02:02=Let the fight of the year begin
+02:02=Let the fight of the month begin
+02:02=Let the fight of the week begin
+02:02=Let the fight of the day begin
+02:02=Let the fight of the hour begin
+02:02=Do your best!
+02:02=Destroy the enemy!
+02:02=Good luck
+02:02=Have fun
+02:02=Fight the good fight
+02:02=Fight dirty
+02:02=Fight with honour
+02:02=Don't give up
+02:02=Never surrender
+02:02=Rock 'em and sock 'em!
+02:02=Let the fragfest begin!
+02:02=I hope you're ready for a tussle!
+02:02=Go Go Go!
+02:02=Hedgehogs advance!
+02:02=Bring it to them!
+02:02=Have no fear!
+02:02=Be brave and conquer
+
+; Round ends and team/clan (%1) wins
+02:03=%1 يفوز
+
+; Round ends in a draw
+02:04=تعادل
+
+; New health crate
+02:05=Incoming aid!
+02:05=Medic!
+02:05=First aid from the skies!
+02:05=A health pack for you
+02:05=Good health.. in box form!
+02:05=The doctor calls
+02:05=Fresh band-aids!
+02:05=This will make you feel better
+02:05=A Hi-Potion! Whoops wrong game
+02:05=A pick-me-up!
+02:05=Grab it
+02:05=A healthy snack
+02:05=A remedy to pain
+02:05=Correct Dosage: as many as you can find!
+02:05=Urgent delivery
+02:05=Supplies!
+
+; New ammo crate
+02:06=More weapons!
+02:06=Reinforcements!
+02:06=Lock and load!
+02:06=I wonder what weapon is in there?
+02:06=Supplies!
+02:06=What could be inside?
+02:06=Christmas comes early in Hedgewars
+02:06=A present!
+02:06=Special delivery!
+02:06=It was a nightmare getting this through customs
+02:06=Destructive toys from the heavens
+02:06=Warning! Contents Volatile
+02:06=Pick it up or blow it up, choice is yours
+02:06=Goodies!
+02:06=Mmmmm Ammo
+02:06=A box of destructive power
+02:06=Airmail!
+02:06=Whatever's in that box, it ain't pizza
+02:06=Get it!
+02:06=Weapon drop incoming
+02:06=Don't let the enemy grab that!
+02:06=Shiny new toys!
+02:06=A mysterious box!
+
+; New utility crate
+02:07=Tooltime!
+02:07=This could come in handy...
+02:07=Utilities!
+02:07=Utilise this box
+02:07=Watch out below
+02:07=More utilities!
+02:07=Tools for you!
+02:07=This should be good!
+02:07=Use this wisely
+02:07=Ooo this box is heavy
+02:07=You might need this
+
+; Hog (%1) skips his turn
+02:08=%1 is sooo boring...
+02:08=%1 couldn't be bothered
+02:08=%1 is one lazy hog
+02:08=%1 is thoughtless
+02:08=%1 gave up
+02:08=You snooze you lose, %1
+02:08=%1 shamelessly skips
+02:08=%1 is really lazy
+02:08=%1 needs a little more motivation
+02:08=%1 is a pacifist
+02:08=%1 has a breather
+02:08=%1 has a rest
+02:08=%1 chills out
+02:08=%1 has no faith in his own abilities
+02:08=%1 decides to do nothing at all
+02:08=%1 lets the enemy destroy itself
+02:08=%1 would be terrible at parties
+02:08=%1 hides out
+02:08=%1 has decided to pass on this opportunity
+02:08=%1 decides the best thing he can do is...nothing
+02:08=%1 is a big wuss
+02:08=Buck Buck Buck, %1 is a chicken
+02:08=%1 is looking a little yellow
+02:08=%1 is a coward!
+02:08=%1 is waiting for sudden death
+02:08=%1 is not the fighting type
+02:08=%1 is reconsidering his purpose in life
+02:08=%1 was never much of a good shot anyway
+02:08=%1 didn't want to join the army in the first place
+02:08=Stop wasting our time, %1
+02:08=I'm dissapointed in you, %1
+02:08=Come on, you can do better than that %1
+02:08=%1's will has broken
+02:08=%1 apparently has better things to do
+02:08=%1 is scared stiff
+02:08=%1 has fallen asleep
+
+; Hog (%1) hurts himself only
+02:09=%1 should practice aiming!
+02:09=%1 seems to hate himself
+02:09=%1 is standing on the wrong side!
+02:09=%1 makes like an emo
+02:09=%1 was holding his weapon the wrong way around
+02:09=%1 is a little sadistic
+02:09=%1 is a masochist
+02:09=%1 has no instinct of self-preservation
+02:09=%1 messed up
+02:09=%1 screwed up
+02:09=That was a poor shot, %1
+02:09=%1 is a little too careless with dangerous weapons
+02:09=%1 should consider a change of career
+02:09=Worst. Shot. Ever!
+02:09=No no no %1, you shoot at the ENEMY!
+02:09=%1 should only be destroying the enemy
+02:09=%1 moves one step closer to suicide
+02:09=%1 aids the enemy
+02:09=That was stupid %1
+02:09=%1 lives by the mantra of "no pain, no gain"
+02:09=%1 is confused
+02:09=%1 hurt itself in its confusion
+02:09=%1 has a knack for embarrassing himself
+02:09=%1 is a klutz!
+02:09=%1 is clumsy
+02:09=%1 shows the enemy what he's capable of
+02:09=%1 can't be expected to be perfect all the time
+02:09=Don't worry %1, pobody's nerfect
+02:09=%1 totally did that on purpose
+02:09=I won't tell anyone if you don't, %1
+02:09=How embarrassing!
+02:09=I'm sure nobody saw that %1
+02:09=%1 needs to review his field manual
+02:09=%1's weapon clearly malfunctioned
+
+; Hog shot an home run (using the bat and another hog)
+02:10=Home Run!
+02:10=A bird, a plane, ...
+02:10=That one is out!
+
+; Weapon Categories
+03:00=Timed Grenade
+03:01=Timed Grenade
+03:02=Ballistic Weapon
+03:03=Guided Weapon
+03:04=Gun (multiple shots)
+03:05=Digging Tool
+03:06=Action
+03:07=Transport Utility
+03:08=Proximity Bomb
+03:09=Gun (multiple shots)
+03:10=BOOM!
+03:11=Bonk!
+03:12=Martial Arts
+03:13=UNUSED
+03:14=Transport Utility
+03:15=Airborne Attack
+03:16=Airborne Attack
+03:17=Digging Tool
+03:18=Utility
+03:19=Transport Utility
+03:20=Action
+03:21=Ballistic Weapon
+03:22=Call me Indiana!
+03:23=(Really) Martial Arts
+03:24=The cake is NOT a lie!
+03:25=Costume Kit
+03:26=Juicy Grenade
+03:27=Fiery Grenade
+03:28=Ballistic Weapon
+03:29=Ballistic Weapon
+03:30=Airborne Attack
+03:31=Remote Controlled Bomb
+03:32=Temporary Effect
+03:33=Temporary Effect
+03:34=Temporary Effect
+03:35=Temporary Effect
+03:36=Temporary Effect
+03:37=Temporary Effect
+03:38=Gun (multiple shots)
+03:39=Transport Utility
+03:40=Incinerating Grenade
+03:41=Huge fan of Squawks
+
+; Weapon Descriptions (use | as line breaks)
+04:00=Attack your enemies using a simple grenade.|It will explode once its timer reaches zero.|1-5: Set grenade's timer|Attack: Hold to throw with more power
+04:01=Attack your enemies using a cluster bomb.|It will split into smaller bombs once its timer|reaches zero.|1-5: Set grenade's timer|Attack: Hold to throw with more power
+04:02=Attack your enemies using a ballistic projectile|that might be influenced by wind.|Attack: Hold to shoot with more power
+04:03=Launch an explosive bee that will lock on|the selected target. Don't shoot with full power|to improve its precision.|Cursor: Pick target|Attack: Hold to shoot with more power
+04:04=Attack your enemy using a shotgun with two shots.|Thanks to its spread you don't need direct hits|to harm your opponents.|Attack: Shoot (multiple times)
+04:05=Move underground! Use the pickhammer to drill|a hole into the ground and reach other areas.|Attack: Start or stop digging
+04:06=Bored? No way to attack? Save your ammo?|No problem! Just skip your turn, coward!|Attack: Skip your turn without fighting
+04:07=Bridge huge distances using timed shots with the|rope. Use your momentum to slide into other hogs|or drop grenades and other weapons on them.|Attack: Shoot or release the rope|Long Jump: Drop grenades or similar weapons
+04:08=Keep your enemies away by dropping a mine in|narrow passages or right below their feet. Be|sure to retreat before you trigger it yourself!|Attack: Drop mine next to your feet
+04:09=Not sure about your aiming? Use the Desert|Eagle to attack using up to four shots.|Attack: Shoot (multiple times)
+04:10=Brute force is always an option. Drop this classic|explosive next to your enemies and retreat.|Attack: Drop dynamite next to your feet
+04:11=Get rid of enemy hogs by batting them over|the map borders or into water. Or how about|knocking some mines to your friends?|Attack: Bat everything in front of you
+04:12=Get close and personal to unleash the power of|this almost deadly martial arts technique.|Attack: Perform the Fire Punch
+04:13=UNUSED
+04:14=Fear of heights? Better grab a parachute.|It will unfold once|you fall too far and|save your hog from taking fall damage.|Attack: Unfold the parachute|Long Jump: Drop grenades or similar weapons
+04:15=Call in an airplane to attack your enemies|using a bombing run.|Left/Right: Determine attack direction|Cursor: Select target region
+04:16=Call in an airplane to drop several mines|in the target area.|Left/Right: Determine attack direction|Cursor: Select target region
+04:17=Need shelter? Use the blow torch to dig|a tunnel into solid ground granting you|cover.|Attack: Start or stop digging
+04:18=Need additional protection or want to pass|unpassable ground? Place some girders as you|like.|Left/Right: Select girder to place|Cursor: Place girder in a valid position
+04:19=Used at the right moment teleportation can|be more powerful than almost all weapons as|it allows you to save hogs from dangerous|situations within seconds.|Cursor: Select target region
+04:20=Allows you to play the current turn with|a different hog.|Attack: Enable switching hogs
+04:21=Shoot a grenade-like projectile that will|release multiple bombs upon impact.|Attack: Shoot at full power
+04:22=Not just for Indiana Jones! The whip is a|useful weapon in many situations. Especially|when you'd like to shove someone off a cliff.|Attack: Strike everything in front of you
+04:23=If you have nothing to lose, this might be|quite handy. Sacrifice your hog by launching|him into a specific direction hurting everything|on his way and exploding at the end.|Attack: Launch the devastating and deadly attack
+04:24=Happy Birthday! Launch this cake, let it walk right|next to your enemies and let them have an explosive|party. The cake is able to pass almost all terrain|but he might detonate earlier this way.|Attack: Start the cake or let it stop and explode
+04:25=Use this disguise kit to get your enemies to jump|towards your hog (and into some gap or hole).|Attack: Use the kit and try to seduce another hog
+04:26=Throw this juicy watermelon at your enemies. Once|the timer expires, it will split into several|explosive pieces.|1-5: Set watermelon's timer|Attack: Hold to shoot with more power
+04:27=Let hellfire rain onto your opponents by using|this fiendish explosive. Don't get too close to|the explosion as smaller fires might last longer.|Attack: Hold to shoot with more power
+04:28=Short time after launching this rocket, it will|start drilling through solid ground and explode|once its fuse is triggered or it resurfaces again.|Attack: Hold to shoot with more power
+04:29=This is nothing for small kids! The ball gun fires|tons of small colored balls filled with explosives.|Attack: Shoot at full power|Up/Down: Continue aiming
+04:30=Call in an airplane to launch a powerful napalm|strike. With proper aiming this attack can eradicate|huge parts of landscape including unlucky hogs|sitting there.|Left/Right: Determine attack direction|Cursor: Select target region
+04:31=The RC plane is the ideal weapon to collect crates or|attack far away hogs. Either steer it into enemies or|drop some bombs first.|Attack: Launch the plane or drop bombs|Long Jump: Let the valkyries ride into battle|Up/Down: Steer the plane
+04:32=Low gravity is more effective than any diet! Jump|higher and over greater distances or let your enemies|fly even further.|Attack: Activate
+04:33=Sometimes you just need that little extra boost to|deal some more damage.|Attack: Activate
+04:34=Can't touch me!|Attack: Activate
+04:35=Sometimes time's running too fast. Grab some extra|seconds to finish your attack.|Attack: Activate
+04:36=Well, sometimes you're just too bad in aiming. Get|some assistance using modern day technology.|Attack: Activate
+04:37=Don't fear the daylight. It will just last one turn|but will enable you to absorb the damage you do to|other hogs.|Attack: Activate
+04:38=The sniper rifle can be the most devastating weapon|in your whole arsenal, however it's very ineffective|at close quarters. The damage dealt increases with|the distance to its target.|Attack: Shoot (twice)
+04:39=Fly to other parts of the map using the flying|saucer. This hard to master utility is able to|take you to almost any position on the battlefield.|Attack: Activate|Up/Left/Right: Apply force in one direction|Long Jump: Drop grenades or similar weapons
+04:40=Set some ground on fire using this bottle filled|with (soon to be) burning liquid.|Attack: Hold to shoot with more power
+04:41=The evidence nature might even top the flying|saucer. Birdy can carry your hog around and|drop eggs on your enemies!|Attack: Activate and drop eggs|Up/Left/Right: Flap in one direction
+
+; Game goal strings
+05:00=Game Modes
+05:01=The following rules apply
+05:02=Place the King: Pick a protected starting point for your King
+05:03=Low Gravity: Watch your step
+05:04=Invulnerability: Hogs are (almost) invulnerable
+05:05=Vampirism: Hogs will be healed for the damage dealt
+05:06=Karma: Hogs will be damaged for the damage dealt
+05:07=Protect the King: Don't let your king die!
+05:08=Place Hedgehogs: Place your hogs before the game starts
+05:09=Artillery: Hogs can't walk to change position
+05:10=Indestructible Terrain: Most weapons won't destroy terrain
+05:11=Shared Ammo: All teams of the same color share their ammunition
+05:12=Mine Timers: Mines will detonate after %1 second(s)
+05:13=Mine Timers: Mines will detonate instantly
+05:14=Mine Timers: Mines will detonate after 0 - 3 seconds
+05:15=Damage Modifier: All weapons will do %1% damage
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Locale/UNUSED_hedgewars_ar.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,4939 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="fr">
+<context>
+    <name>About</name>
+    <message>
+        <source>Unknown Compiler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgewars %1</source>
+        <extracomment>%1 contains Hedgewars&apos; version number</extracomment>
+        <translation type="unfinished">Hedgewars %1</translation>
+    </message>
+    <message>
+        <source>Revision %1 (%2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Visit our homepage: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This program is distributed under the %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>GNU GPL v2</source>
+        <extracomment>Short for “GNU General Public License version 2”</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Dependency versions:</source>
+        <extracomment>For the version numbers of Hedgewars&apos; software dependencies</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://gcc.gnu.org&quot;&gt;GCC&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2&lt;/a&gt;: %1.%2.%3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_mixer&lt;/a&gt;: %1.%2.%3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_net&lt;/a&gt;: %1.%2.%3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_image&lt;/a&gt;: %1.%2.%3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_ttf&lt;/a&gt;: %1.%2.%3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://www.qt.io/developers/&quot;&gt;Qt&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://libav.org&quot;&gt;libavcodec&lt;/a&gt;: %1.%2.%3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://libav.org&quot;&gt;libavformat&lt;/a&gt;: %1.%2.%3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://libav.org&quot;&gt;libavutil&lt;/a&gt;: %1.%2.%3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>AbstractPage</name>
+    <message>
+        <source>Go back</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>BanDialog</name>
+    <message>
+        <source>IP</source>
+        <translation type="unfinished">IP</translation>
+    </message>
+    <message>
+        <source>Nick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>IP/Nick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Reason</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Duration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ok</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cancel</source>
+        <translation type="unfinished">الغاء</translation>
+    </message>
+    <message>
+        <source>you know why</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Warning</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>permanent</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ban player</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please specify an IP address.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please specify a nickname.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>DataManager</name>
+    <message>
+        <source>Use Default</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>FeedbackDialog</name>
+    <message>
+        <source>View</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cancel</source>
+        <translation type="unfinished">الغاء</translation>
+    </message>
+    <message>
+        <source>Send Feedback</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>We are always happy about suggestions, ideas, or bug reports.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Send us feedback!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>If you found a bug, you can see if it&apos;s already been reported here: </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Your email address is optional, but necessary if you want us to get back at you.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Feedback</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This is optional, but this information might help us to resolve bugs and other technical problems.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>FreqSpinBox</name>
+    <message>
+        <source>Never</source>
+        <translation>ابدا</translation>
+    </message>
+    <message numerus="yes">
+        <source>Every %1 turn</source>
+        <translation type="unfinished">
+            <numerusform>كل %1 دور
+        </numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+</context>
+<context>
+    <name>GameCFGWidget</name>
+    <message>
+        <source>Edit weapons</source>
+        <translation>تغيير سلاح</translation>
+    </message>
+    <message>
+        <source>Edit schemes</source>
+        <translation>Edit schemes</translation>
+    </message>
+    <message>
+        <source>Game scheme will auto-select a weapon</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map</source>
+        <translation type="unfinished">خارطة</translation>
+    </message>
+    <message>
+        <source>Game options</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>GameSchemeModel</name>
+    <message>
+        <source>new</source>
+        <translation type="obsolete">جديد</translation>
+    </message>
+    <message>
+        <source>New</source>
+        <translation type="unfinished">جديد</translation>
+    </message>
+    <message>
+        <source>Copy of %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>New (%1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Copy of %1 (%2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>GameUIConfig</name>
+    <message>
+        <source>Guest</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>HWApplication</name>
+    <message numerus="yes">
+        <source>%1 minutes</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>%1 hour</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>%1 hours</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>%1 day</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>%1 days</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message>
+        <source>Scheme &apos;%1&apos; not supported</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cannot create directory %1</source>
+        <translation type="unfinished">Cannot create directory %1</translation>
+    </message>
+    <message>
+        <source>Failed to open data directory:
+%1
+
+Please check your installation!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Usage</source>
+        <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>OPTION</source>
+        <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CONNECTSTRING</source>
+        <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Options</source>
+        <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Display this help</source>
+        <comment>command-line</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Custom path for configuration data and user data</source>
+        <comment>command-line</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Custom path to the game data folder</source>
+        <comment>command-line</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgewars can use a %1 (e.g. &quot;%2&quot;) to connect on start.</source>
+        <comment>command-line</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Malformed option argument: %1</source>
+        <comment>command-line</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown option argument: %1</source>
+        <comment>command-line</comment>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>HWAskQuitDialog</name>
+    <message>
+        <source>Do you really want to quit?</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>HWChatWidget</name>
+    <message>
+        <source>%1 has been removed from your ignore list</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 has been added to your ignore list</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 has been removed from your friends list</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 has been added to your friends list</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Stylesheet imported from %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Enter %1 if you want to use the current StyleSheet in future, enter %2 to reset!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Couldn&apos;t read %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>StyleSheet discarded</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>StyleSheet saved to %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Failed to save StyleSheet to %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 has joined</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 has left</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 has left (%2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Chat log</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Enter chat messages here and send them with [Enter]</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>List of players</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>HWForm</name>
+    <message>
+        <source>Cannot save record to file %1</source>
+        <translation>لم اتمكن من حقظ الملف %1</translation>
+    </message>
+    <message>
+        <source>Hedgewars Demo File</source>
+        <comment>File Types</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgewars Save File</source>
+        <comment>File Types</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Demo name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Demo name:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game aborted</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nickname</source>
+        <translation type="unfinished">اسم اللاعب</translation>
+    </message>
+    <message>
+        <source>No nickname supplied.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Someone already uses your nickname %1 on the server.
+Please pick another nickname:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1&apos;s Team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgewars - Nick registered</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This nick is registered, and you haven&apos;t specified a password.
+
+If this nick isn&apos;t yours, please register your own nick at www.hedgewars.org
+
+Password:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Your nickname is not registered.
+To prevent someone else from using it,
+please register it at www.hedgewars.org</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>
+
+Your password wasn&apos;t saved either.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgewars - Empty nickname</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgewars - Wrong password</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>You entered a wrong password.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Try Again</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgewars - Connection error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>You reconnected too fast.
+Please wait a few seconds and try again.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Guest</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Room password</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The room is protected with password.
+Please, enter the password:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team %1</source>
+        <extracomment>Default team name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Computer %1</source>
+        <extracomment>Default computer team name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown network error (possibly missing SSL library).</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This feature requires an Internet connection, but you don&apos;t appear to be online (error code: %1).</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Internal error: Reply object is invalid.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>HWGame</name>
+    <message>
+        <source>en.txt</source>
+        <extracomment>IMPORTANT: This text has a special meaning, do not translate it directly. This is the file name of translation files for the game engine, found in Data/Locale/. Usually, you replace “en” with the ISO-639-1 language code of your language.</extracomment>
+        <translation type="unfinished">ar.txt</translation>
+    </message>
+    <message>
+        <source>Cannot open demofile %1</source>
+        <translation>لم اتمكن من حفظ ملف اللعب %1</translation>
+    </message>
+    <message>
+        <source>A fatal ERROR occured! The game engine had to stop.
+
+We are very sorry for the inconvenience. :-(
+
+If this keeps happening, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>HWHostPortDialog</name>
+    <message>
+        <source>Connect to server</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>HWMapContainer</name>
+    <message>
+        <source>All</source>
+        <translation>كل</translation>
+    </message>
+    <message>
+        <source>Small</source>
+        <translation>صغير</translation>
+    </message>
+    <message>
+        <source>Medium</source>
+        <translation>متوسط</translation>
+    </message>
+    <message>
+        <source>Large</source>
+        <translation>كبير</translation>
+    </message>
+    <message>
+        <source>Cavern</source>
+        <translation>كهف</translation>
+    </message>
+    <message>
+        <source>Wacky</source>
+        <translation>تعبان</translation>
+    </message>
+    <message>
+        <source>Small tunnels</source>
+        <translation type="unfinished">انقاق صغيرة</translation>
+    </message>
+    <message>
+        <source>Medium tunnels</source>
+        <translation type="unfinished">انفاق متوسطة</translation>
+    </message>
+    <message>
+        <source>Seed</source>
+        <extracomment>Refers to the &quot;random seed&quot;; the source of randomness in the game</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map type:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Image map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mission map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hand-drawn</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Randomly generated</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Random maze</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Random</source>
+        <translation type="unfinished">عشوائي</translation>
+    </message>
+    <message>
+        <source>Map preview:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load map drawing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Edit map drawing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Small islands</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Medium islands</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Large islands</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map size:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maze style:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mission:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Drawn Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>All files</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Large tunnels</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Theme: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Random perlin</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Style:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>View and edit the seed, the source of randomness in the game</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Randomize the theme</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Choose a theme</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Randomize the map, theme and seed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Randomize the theme and seed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Randomize the seed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Click to randomize the map, theme and seed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Click to randomize the theme and seed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Adjust the complexity of the generated map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Adjust the distance between forts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Click to edit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation type="unfinished">تحميل</translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>HWNetServersModel</name>
+    <message>
+        <source>Title</source>
+        <translation>عنوان</translation>
+    </message>
+    <message>
+        <source>IP</source>
+        <extracomment>short for &quot;IP address&quot; (Internet Protocol), part of server address</extracomment>
+        <translation>IP</translation>
+    </message>
+    <message>
+        <source>Port</source>
+        <extracomment>short for &quot;port number&quot;, part of server address</extracomment>
+        <translation>Port</translation>
+    </message>
+</context>
+<context>
+    <name>HWNewNet</name>
+    <message>
+        <source>The host was not found. Please check the host name and port settings.</source>
+        <translation type="unfinished">الحاسوب لم يوجد. تأكد من الاعدادات</translation>
+    </message>
+    <message>
+        <source>Connection refused</source>
+        <translation type="vanished">الاتصال رفض</translation>
+    </message>
+    <message>
+        <source>Room destroyed</source>
+        <translation>الغرفة اغلقت</translation>
+    </message>
+    <message>
+        <source>Quit reason: </source>
+        <translation type="obsolete">سبب الخروج</translation>
+    </message>
+    <message>
+        <source>You got kicked</source>
+        <translation>تم طردك</translation>
+    </message>
+    <message>
+        <source>%1 *** %2 has joined the room</source>
+        <translation>%1 *** %2 انضم للغرفة</translation>
+    </message>
+    <message>
+        <source>%1 *** %2 has joined</source>
+        <translation type="obsolete">%1 *** %2 انضم</translation>
+    </message>
+    <message>
+        <source>%1 *** %2 has left (%3)</source>
+        <translation>%1 *** %2 خرج (%3)</translation>
+    </message>
+    <message>
+        <source>%1 *** %2 has left</source>
+        <translation>%1 *** %2 خرج</translation>
+    </message>
+    <message>
+        <source>Remote host has closed connection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The server is too old. Disconnecting now.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Server authentication error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Reason:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The connection was refused by the official server or timed out. Something seems to be wrong with the official server at the moment. This might be a temporary problem. Please try again later.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The connection was refused by the host or timed out. This might have one of the following reasons:
+- The Hedgewars Server program does currently not run on the host
+- The specified port number is incorrect
+- There is a temporary network problem
+
+Please check the host name and port settings and/or try again later.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>HWPasswordDialog</name>
+    <message>
+        <source>Login</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>To connect to the server, please log in.
+
+If you don&apos;t have an account on www.hedgewars.org,
+just enter your nickname.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nickname:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Password:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>New Account</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>HatButton</name>
+    <message>
+        <source>Change hat (%1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>HatPrompt</name>
+    <message>
+        <source>Cancel</source>
+        <translation type="unfinished">الغاء</translation>
+    </message>
+    <message>
+        <source>Use selected hat</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Search for a hat:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Choose a hat</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>KB</name>
+    <message>
+        <source>SDL_ttf returned error while rendering text, most propably it is related to the bug in freetype2. It&apos;s recommended to update your freetype lib.</source>
+        <translation type="obsolete">SDL_ttf returned error while rendering text, most propably it is related to the bug in freetype2. It&apos;s recommended to update your freetype lib.</translation>
+    </message>
+</context>
+<context>
+    <name>KeyBinder</name>
+    <message>
+        <source>Category</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>LibavInteraction</name>
+    <message>
+        <source>Audio: </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>unknown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Duration: %1min %2s</source>
+        <extracomment>Duration in minutes and seconds (SI units)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video: %1x%2, %3 FPS, %4</source>
+        <extracomment>Video metadata. %1 = video width, %2 = video height, %3 = frames per second = %4 = decoder name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video: %1x%2, %3</source>
+        <extracomment>Video metadata. %1 = video width, %2 = video height, %3 = decoder name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Player: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Theme: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Record: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>MapModel</name>
+    <message>
+        <source>No description available.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>MinesTimeSpinBox</name>
+    <message>
+        <source>Random</source>
+        <translation type="unfinished">عشوائي</translation>
+    </message>
+    <message numerus="yes">
+        <source>%1 seconds</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+</context>
+<context>
+    <name>PageAdmin</name>
+    <message>
+        <source>Clear Accounts Cache</source>
+        <translation>Clear Accounts Cache</translation>
+    </message>
+    <message>
+        <source>Fetch data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Server message for latest version:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Server message for previous versions:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Latest version protocol number:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>MOTD preview:</source>
+        <extracomment>MOTD = Message Of The Day, the message which is shown to players joining the server</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Set data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation type="unfinished">عام</translation>
+    </message>
+    <message>
+        <source>Bans</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>IP/Nick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Expiration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Reason</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Refresh</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Add</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Remove</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>PageCampaign</name>
+    <message>
+        <source>Team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Campaign</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mission</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start fighting</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>PageConnecting</name>
+    <message>
+        <source>Connecting...</source>
+        <translation type="unfinished">جاري الاتصال</translation>
+    </message>
+</context>
+<context>
+    <name>PageDataDownload</name>
+    <message>
+        <source>Loading, please wait.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Open packages directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load the start page</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown network error (possibly missing SSL library).</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This feature requires an Internet connection, but you don&apos;t appear to be online (error code: %1).</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Internal error: Reply object is invalid.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>PageDrawMap</name>
+    <message>
+        <source>Undo</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Clear</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation type="unfinished">تحميل</translation>
+    </message>
+    <message>
+        <source>Save</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Save drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Drawn Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>All files</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Eraser</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Polyline</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Rectangle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ellipse</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Optimize</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brush size</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>PageEditTeam</name>
+    <message>
+        <source>General</source>
+        <translation>عام</translation>
+    </message>
+    <message>
+        <source>Select an action to choose a custom key bind for this team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Use my default</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Reset all binds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Custom Controls</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hat</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Name</source>
+        <translation type="unfinished">اسم</translation>
+    </message>
+    <message>
+        <source>This hedgehog&apos;s name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Randomize this hedgehog&apos;s name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Random Team</source>
+        <translation type="unfinished">فريق عشوائي</translation>
+    </message>
+    <message>
+        <source>Play a random example of this voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Random Hats</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Random Names</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Randomize the team name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Randomize the grave</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Randomize the flag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Randomize the voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Randomize the fort</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CPU %1</source>
+        <extracomment>Name of a flag for computer-controlled enemies. %1 is replaced with the computer level</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 (%2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>PageGameStats</name>
+    <message>
+        <source>Details</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Health graph</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ranking</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message numerus="yes">
+        <source>The best shot award was won by &lt;b&gt;%1&lt;/b&gt; with &lt;b&gt;%2&lt;/b&gt; pts.</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>The best killer is &lt;b&gt;%1&lt;/b&gt; with &lt;b&gt;%2&lt;/b&gt; kills in a turn.</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>A total of &lt;b&gt;%1&lt;/b&gt; hedgehog(s) were killed during this round.</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 kill)</source>
+        <extracomment>Number of kills in stats screen, written after the team name</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>&lt;b&gt;%1&lt;/b&gt; was scared and skipped turn &lt;b&gt;%2&lt;/b&gt; times.</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message>
+        <source>Play again</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Save</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 %2)</source>
+        <extracomment>For custom number of points in the stats screen, written after the team name. %1 is the number, %2 is the word. Example: “4 points”</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>&lt;b&gt;%1&lt;/b&gt; thought it&apos;s good to shoot their own hedgehogs for &lt;b&gt;%2&lt;/b&gt; pts.</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>&lt;b&gt;%1&lt;/b&gt; killed &lt;b&gt;%2&lt;/b&gt; of their own hedgehogs.</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message>
+        <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+</context>
+<context>
+    <name>PageInGame</name>
+    <message>
+        <source>In game...</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>PageInfo</name>
+    <message>
+        <source>Open the snapshot folder</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>PageMain</name>
+    <message>
+        <source>Downloadable Content</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Play a game on a single computer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Play a game across a network</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Read about who is behind the Hedgewars Project</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Leave a feedback here reporting issues, suggesting features or just saying how you like Hedgewars</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Access the user created content downloadable from our website</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Exit game</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Manage videos recorded from game</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Edit game preferences</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Play a game across a local area network</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Play a game on an official server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Feedback</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Play local network game</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Play official network game</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Open the Hedgewars online game manual in your web browser</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>PageMultiplayer</name>
+    <message>
+        <source>Start</source>
+        <translation>ابدا</translation>
+    </message>
+    <message>
+        <source>Edit game preferences</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start fighting (requires at least 2 teams)</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>PageNetGame</name>
+    <message>
+        <source>Control</source>
+        <translation type="obsolete">تحكم</translation>
+    </message>
+    <message>
+        <source>Edit game preferences</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start</source>
+        <translation type="unfinished">ابدا</translation>
+    </message>
+    <message>
+        <source>Update</source>
+        <translation type="unfinished">تحديث</translation>
+    </message>
+    <message>
+        <source>Room controls</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Room name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Update the room name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Turn on the lightbulb to show the other players when you&apos;re ready to fight</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start fighting (requires at least 2 teams)</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>PageNetServer</name>
+    <message>
+        <source>Click here for details</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Insert your address here</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>PageOptions</name>
+    <message>
+        <source>New team</source>
+        <translation>فريق جديد</translation>
+    </message>
+    <message>
+        <source>Edit team</source>
+        <translation>تغيير فريق</translation>
+    </message>
+    <message>
+        <source>Delete team</source>
+        <translation>حذف فريق</translation>
+    </message>
+    <message>
+        <source>You can&apos;t edit teams from team selection. Go back to main menu to add, edit or delete teams.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>New scheme</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Edit scheme</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Delete scheme</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>New weapon set</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Edit weapon set</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Delete weapon set</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Advanced</source>
+        <translation type="unfinished">متقدم</translation>
+    </message>
+    <message>
+        <source>Reset to default colors</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Proxy host</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Proxy port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Proxy login</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Proxy password</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>No proxy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Socks5 proxy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>HTTP proxy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>System proxy settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Select an action to change what key controls it</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Reset to default</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Reset all binds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Audio</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Controls</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video Recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teams</source>
+        <translation type="unfinished">فرق</translation>
+    </message>
+    <message>
+        <source>Schemes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation type="unfinished">اسلحة</translation>
+    </message>
+    <message>
+        <source>Frontend</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Custom colors</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game audio</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Frontend audio</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Account</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Proxy settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Miscellaneous</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Updates</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Check for updates</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video recording options</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>x</source>
+        <extracomment>Multiplication sign, to be used between two numbers. Note the “x” is only a dummy character, we recommend to use “×” if your language permits it</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>MISSING LANGUAGE NAME [%1]</source>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Check now</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Can&apos;t delete last team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>You can&apos;t delete the last team!</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>PagePlayDemo</name>
+    <message>
+        <source>Rename dialog</source>
+        <translation>تغيير الشباك</translation>
+    </message>
+    <message>
+        <source>Enter new file name:</source>
+        <translation type="unfinished">ادخل اسم الملف</translation>
+    </message>
+    <message>
+        <source>Play demo</source>
+        <translation type="unfinished">ابدا العرض</translation>
+    </message>
+    <message>
+        <source>Play the selected demo</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load the selected game</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>PageRoomsList</name>
+    <message>
+        <source>Create</source>
+        <translation type="obsolete">اصنع</translation>
+    </message>
+    <message>
+        <source>Join</source>
+        <translation type="obsolete">انضم</translation>
+    </message>
+    <message>
+        <source>Admin features</source>
+        <translation>الادارة</translation>
+    </message>
+    <message>
+        <source>Room Name:</source>
+        <translation type="obsolete">رقم الغرقة</translation>
+    </message>
+    <message numerus="yes">
+        <source>%1 players online</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message>
+        <source>Search for a room:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Create room</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Join room</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Room state</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Open server administration page</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>PageScheme</name>
+    <message>
+        <source>Defend your fort and destroy the opponents, two team colours max!</source>
+        <translation type="obsolete">دافع عن القلعة و دمر الاعداء. فريقان الحد الاقصى</translation>
+    </message>
+    <message>
+        <source>Teams will start on opposite sides of the terrain, two team colours max!</source>
+        <translation type="obsolete">الفرق تبدا في مكانين متقابلين. فريقان الحد الاقصى</translation>
+    </message>
+    <message>
+        <source>Land can not be destroyed!</source>
+        <translation type="obsolete">الارض لا يمكن ان تدمر</translation>
+    </message>
+    <message>
+        <source>Lower gravity</source>
+        <translation>جاذبية قليلة</translation>
+    </message>
+    <message>
+        <source>Assisted aiming with laser sight</source>
+        <translation>منظار ليزري</translation>
+    </message>
+    <message>
+        <source>All hogs have a personal forcefield</source>
+        <translation>كل اللاعبين لهم حقل قوى</translation>
+    </message>
+    <message>
+        <source>Gain 80% of the damage you do back in health</source>
+        <translation>احصل على 80% من التدمير في صحتك</translation>
+    </message>
+    <message>
+        <source>Share your opponents pain, share their damage</source>
+        <translation>شارك في صحة عدوك</translation>
+    </message>
+    <message>
+        <source>Your hogs are unable to move, put your artillery skills to the test</source>
+        <translation>الاعبين لا يمكنهم التحرك</translation>
+    </message>
+    <message>
+        <source>Random</source>
+        <translation type="obsolete">عشوائي</translation>
+    </message>
+    <message>
+        <source>Seconds</source>
+        <translation type="obsolete">ثواني</translation>
+    </message>
+    <message>
+        <source>New</source>
+        <translation>جديد</translation>
+    </message>
+    <message>
+        <source>Delete</source>
+        <translation>حذف</translation>
+    </message>
+    <message>
+        <source>Order of play is random instead of in room order.</source>
+        <translation type="unfinished">تسلسل اللعب عشواي</translation>
+    </message>
+    <message>
+        <source>Play with a King. If he dies, your side dies.</source>
+        <translation type="unfinished">اذا مات الملك، خسر الفريق</translation>
+    </message>
+    <message>
+        <source>Take turns placing your hedgehogs before the start of play.</source>
+        <translation type="unfinished">ضع لاعبين بالادوار قبل اللعب</translation>
+    </message>
+    <message>
+        <source>Ammo is shared between all teams that share a colour.</source>
+        <translation type="unfinished">العتاد مشترك</translation>
+    </message>
+    <message>
+        <source>Disable girders when generating random maps.</source>
+        <translation type="unfinished">ابطال البناء</translation>
+    </message>
+    <message>
+        <source>Disable land objects when generating random maps.</source>
+        <translation type="unfinished">ابطال الاجسام الساقطة</translation>
+    </message>
+    <message>
+        <source>All (living) hedgehogs are fully restored at the end of turn</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>AI respawns on death.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Attacking does not end your turn.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons are reset to starting values each turn.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Each hedgehog has its own ammo. It does not share with the team.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>You will not have to worry about wind anymore.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Wind will affect almost everything.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Copy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teams in each clan take successive turns sharing their turn time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Add an indestructible border around the terrain</source>
+        <translation>اضف اطار لا يمكن تدميره</translation>
+    </message>
+    <message>
+        <source>Add an indestructible border along the bottom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>None (Default)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Wrap (World wraps)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bounce (Edges reflect)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sea (Edges connect to sea)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Each clan starts in its own part of the terrain.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Turn time in seconds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Initial health of hedgehogs</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>How many rounds have to be played before Sudden Death begins</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>How much the water rises per turn while in Sudden Death. Set to 0 along with Sudden Death Health Decrease to disable Sudden Death.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>How much health hedgehogs lose per turn while in Sudden Death, down to 1 health. Set to 0 along with Sudden Death Water Rise to disable Sudden Death.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maximum rope length in percent</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Likelihood of a dropped crate being a health crate. All other crates will be weapon or utility crates.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Likelihood of a crate dropping before a turn</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Health bonus for collecting a health crate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Detonation timer of mines. The random timer lies between 0 and 5 seconds. The timer of air mines will be a quarter of the mines timer.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Average number of mines to be placed a medium-sized island map. This number will be scaled for other maps.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Likelihood of a mine being a dud. Does not affect mines placed by hedgehogs.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Average number of barrels to be placed a medium-sized island map. This number will be scaled for other maps.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Average number of air mines to be placed a medium-sized island map. This number will be scaled for other maps.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Affects the left and right boundaries of the map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Time you get after an attack</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Name of this scheme</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Select a hedgehog at the beginning of a turn</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Land can not be destroyed by most weapons.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 (%2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>PageSelectWeapon</name>
+    <message>
+        <source>Default</source>
+        <translation>التلقائي</translation>
+    </message>
+    <message>
+        <source>Delete</source>
+        <translation>حذف</translation>
+    </message>
+    <message>
+        <source>New</source>
+        <translation type="unfinished">جديد</translation>
+    </message>
+    <message>
+        <source>Copy</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>PageSinglePlayer</name>
+    <message>
+        <source>Play a quick game against the computer with random settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Play a hotseat game against your friends, or AI teams</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Campaign Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Watch recorded demos</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load a previously saved game</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>PageTraining</name>
+    <message>
+        <source>No description available</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Select a mission!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start fighting</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Pick the training to play</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Pick the challenge to play</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Pick the scenario to play</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Trainings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Challenges</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scenarios</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>PageVideos</name>
+    <message>
+        <source>Name</source>
+        <translation type="unfinished">اسم</translation>
+    </message>
+    <message>
+        <source>Size</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message numerus="yes">
+        <source>%1 bytes</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message>
+        <source>(in progress...)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>encoding</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Date: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Size: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1%</source>
+        <extracomment>Video encoding progress. %1 = number</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 (%2%) - %3</source>
+        <extracomment>Video encoding list entry. %1 = file name, %2 = percent complete, %3 = video operation type (e.g. “encoding”)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QAction</name>
+    <message>
+        <source>Kick</source>
+        <translation>ارفس</translation>
+    </message>
+    <message>
+        <source>Info</source>
+        <translation>معلومات</translation>
+    </message>
+    <message>
+        <source>Restrict Joins</source>
+        <translation>امنع الانضمام</translation>
+    </message>
+    <message>
+        <source>Restrict Team Additions</source>
+        <translation>امنع اضافات الفرق</translation>
+    </message>
+    <message>
+        <source>Ban</source>
+        <translation>امنع</translation>
+    </message>
+    <message>
+        <source>Follow</source>
+        <translation>اتبع</translation>
+    </message>
+    <message>
+        <source>Ignore</source>
+        <translation>اهمل</translation>
+    </message>
+    <message>
+        <source>Add friend</source>
+        <translation>اضف صديق</translation>
+    </message>
+    <message>
+        <source>Unignore</source>
+        <translation>حذف الاهمال</translation>
+    </message>
+    <message>
+        <source>Remove friend</source>
+        <translation>امحي صديق</translation>
+    </message>
+    <message>
+        <source>Update</source>
+        <translation type="obsolete">تحديث</translation>
+    </message>
+    <message>
+        <source>Restrict Unregistered Players Join</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Show games in lobby</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Show games in-progress</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Show password protected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Show join restricted</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Delegate room control</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QCheckBox</name>
+    <message>
+        <source>Check for updates at startup</source>
+        <translation>تحرى عن التحديثات</translation>
+    </message>
+    <message>
+        <source>Fullscreen</source>
+        <translation type="unfinished">ملء الشاشة</translation>
+    </message>
+    <message>
+        <source>Show FPS</source>
+        <translation>اضهر عدد الاطارات في الثانية</translation>
+    </message>
+    <message>
+        <source>Alternative damage show</source>
+        <translation>عرض الدمار</translation>
+    </message>
+    <message>
+        <source>Append date and time to record file name</source>
+        <translation>اضف التاريخ و اليوم الى الملف</translation>
+    </message>
+    <message>
+        <source>Show ammo menu tooltips</source>
+        <translation>اضهر قوائم للعتاد</translation>
+    </message>
+    <message>
+        <source>Save password</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Record audio</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Use game resolution</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Visual effects</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sound</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>In-game sound effects</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>In-game music</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Frontend sound effects</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Frontend music</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Enable team tags by default</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hog</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Enable hedgehog tags by default</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Health</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Enable health tags by default</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Translucent</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Enable translucent tags by default</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Enable visual effects such as animated menu transitions and falling stars</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>If enabled, Hedgewars adds the date and time in the form &quot;YYYY-MM-DD_hh-mm&quot; for automatically created demos.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Dampen when losing focus</source>
+        <extracomment>Checkbox text. If checked, the in-game audio volume is reduced (=dampened) when the game window loses its focus</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Reduce the game audio volume if the game window has lost its focus</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QComboBox</name>
+    <message>
+        <source>Human</source>
+        <translation>انسان</translation>
+    </message>
+    <message>
+        <source>Level</source>
+        <translation type="obsolete">مرحلة</translation>
+    </message>
+    <message>
+        <source>(System default)</source>
+        <translation>نمط النظام</translation>
+    </message>
+    <message>
+        <source>Community</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Disabled</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Red/Cyan</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cyan/Red</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Red/Blue</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Blue/Red</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Red/Green</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Green/Red</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Side-by-side</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Top-Bottom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Red/Cyan grayscale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cyan/Red grayscale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Red/Blue grayscale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Blue/Red grayscale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Red/Green grayscale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Green/Red grayscale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Computer (Level %1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Stereoscopy creates an illusion of depth when you wear 3D glasses.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>24 FPS</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>25 FPS</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>30 FPS</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>50 FPS</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>60 FPS</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QGroupBox</name>
+    <message>
+        <source>Team Members</source>
+        <translation>اعضاء الفريق</translation>
+    </message>
+    <message>
+        <source>Fort</source>
+        <translation>حصن</translation>
+    </message>
+    <message>
+        <source>Net game</source>
+        <translation>لعبة شبكية</translation>
+    </message>
+    <message>
+        <source>Playing teams</source>
+        <translation>فرق اللعب</translation>
+    </message>
+    <message>
+        <source>Game Modifiers</source>
+        <translation>مغيرات اللعبة</translation>
+    </message>
+    <message>
+        <source>Basic Settings</source>
+        <translation>اعدادات الاساسية</translation>
+    </message>
+    <message>
+        <source>Team Settings</source>
+        <translation>اعدادات الفريق</translation>
+    </message>
+    <message>
+        <source>Videos</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Description</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QLabel</name>
+    <message>
+        <source>Mines Time</source>
+        <translation>وقت اللغم</translation>
+    </message>
+    <message>
+        <source>Mines</source>
+        <translation>الغام</translation>
+    </message>
+    <message>
+        <source>Version</source>
+        <translation type="obsolete">نسخة</translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation>اسلحة</translation>
+    </message>
+    <message>
+        <source>Host:</source>
+        <translation>Host:</translation>
+    </message>
+    <message>
+        <source>Port:</source>
+        <translation>Port:</translation>
+    </message>
+    <message>
+        <source>Resolution</source>
+        <translation>الوضوح</translation>
+    </message>
+    <message>
+        <source>FPS limit</source>
+        <translation>حد الاقصى لعدد الاطر في الثانية</translation>
+    </message>
+    <message>
+        <source>Server name:</source>
+        <translation type="unfinished">اسم الخادم</translation>
+    </message>
+    <message>
+        <source>Server port:</source>
+        <translation>Server port:</translation>
+    </message>
+    <message>
+        <source>Initial sound volume</source>
+        <translation>ارتقاع الصوت</translation>
+    </message>
+    <message>
+        <source>Damage Modifier</source>
+        <translation>مغير الدمار</translation>
+    </message>
+    <message>
+        <source>Turn Time</source>
+        <translation>وقت الجولة</translation>
+    </message>
+    <message>
+        <source>Initial Health</source>
+        <translation>الصحة الاولية</translation>
+    </message>
+    <message>
+        <source>Sudden Death Timeout</source>
+        <translation>وقت الموت المفاجئ</translation>
+    </message>
+    <message>
+        <source>Scheme Name:</source>
+        <translation type="unfinished">اسم النمط:</translation>
+    </message>
+    <message>
+        <source>Crate Drops</source>
+        <translation>المساعدات</translation>
+    </message>
+    <message>
+        <source>% Dud Mines</source>
+        <translation>% الغام</translation>
+    </message>
+    <message>
+        <source>Name</source>
+        <translation>اسم</translation>
+    </message>
+    <message>
+        <source>Type</source>
+        <translation type="obsolete">نوع</translation>
+    </message>
+    <message>
+        <source>Grave</source>
+        <translation>تابوت</translation>
+    </message>
+    <message>
+        <source>Flag</source>
+        <translation>علم</translation>
+    </message>
+    <message>
+        <source>Voice</source>
+        <translation>صوت</translation>
+    </message>
+    <message>
+        <source>Locale</source>
+        <translation>محلي</translation>
+    </message>
+    <message>
+        <source>Explosives</source>
+        <translation type="obsolete">متفجرات</translation>
+    </message>
+    <message>
+        <source>Quality</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>% Health Crates</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Health in Crates</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sudden Death Water Rise</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sudden Death Health Decrease</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>% Rope Length</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Style</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scheme</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>There are videos that are currently being processed.
+Exiting now will abort them.
+Do you really want to quit?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Description</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nickname</source>
+        <translation type="unfinished">اسم اللاعب</translation>
+    </message>
+    <message>
+        <source>Format</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Audio codec</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video codec</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Framerate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This development build is &apos;work in progress&apos; and may not be compatible with other versions of the game, while some features might be broken or incomplete!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fullscreen</source>
+        <translation type="unfinished">ملء الشاشة</translation>
+    </message>
+    <message>
+        <source>Fullscreen Resolution</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Windowed Resolution</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Your Email</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Summary</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Send system information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Type the security code:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This setting will be effective at next restart.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Tip: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Displayed tags above hogs and translucent tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>World Edge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Script parameter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Air Mines</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Player</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Barrels</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>% Retreat Time</source>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Stereoscopy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bitrate (Kibit/s)</source>
+        <extracomment>“Kibit/s” is the symbol for 1024 bits per second</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Loading&lt;br&gt;CAPTCHA ...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QLineEdit</name>
+    <message>
+        <source>unnamed</source>
+        <translation>غير مسمى</translation>
+    </message>
+    <message>
+        <source>hedgehog %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>anonymous</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>unnamed (%1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgehog %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QMainWindow</name>
+    <message>
+        <source>Hedgewars %1</source>
+        <translation>Hedgewars %1</translation>
+    </message>
+</context>
+<context>
+    <name>QMessageBox</name>
+    <message>
+        <source>Connection to server is lost</source>
+        <translation type="vanished">ضاع الاتصال للخادم</translation>
+    </message>
+    <message>
+        <source>Error</source>
+        <translation>خطأ</translation>
+    </message>
+    <message>
+        <source>File association failed.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teams - Are you sure?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Do you really want to delete the team &apos;%1&apos;?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cannot delete default scheme &apos;%1&apos;!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please select a record from the list</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unable to start server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgewars - Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgewars - Success</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>All file associations have been set</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cannot create directory %1</source>
+        <translation type="obsolete">Cannot create directory %1</translation>
+    </message>
+    <message>
+        <source>Unable to start the server: %1.</source>
+        <translation type="obsolete">Unable to start the server: %1.</translation>
+    </message>
+    <message>
+        <source>Netgame - Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please select a server from the list</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please enter room name</source>
+        <translation type="unfinished">ادخل رقم الغرقة</translation>
+    </message>
+    <message>
+        <source>Please select record from the list</source>
+        <translation type="obsolete">اختر المقطع من القائمة</translation>
+    </message>
+    <message>
+        <source>Room Name - Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please select room from the list</source>
+        <translation type="unfinished">اختر الغرقة من القائمة</translation>
+    </message>
+    <message>
+        <source>Room Name - Are you sure?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The game you are trying to join has started.
+Do you still want to join the room?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Schemes - Warning</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Schemes - Are you sure?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Do you really want to delete the game scheme &apos;%1&apos;?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Videos - Are you sure?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Do you really want to delete the video &apos;%1&apos;?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message numerus="yes">
+        <source>Do you really want to remove %1 file(s)?</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message>
+        <source>File error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cannot open &apos;%1&apos; for writing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cannot open &apos;%1&apos; for reading</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons - Warning</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cannot delete default weapon set &apos;%1&apos;!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons - Are you sure?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Do you really want to delete the weapon set &apos;%1&apos;?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgewars - Nick not registered</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>System Information Preview</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Failed to generate captcha</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Failed to download captcha</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please fill out all fields. Email is optional.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgewars - Warning</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgewars - Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Not all players are ready</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Are you sure you want to start this game?
+Not all players are ready.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teams - Name already taken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The team name &apos;%1&apos; is already taken, so your team has been renamed to &apos;%2&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please select a file from the list.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cannot rename file to %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cannot delete file %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Welcome to Hedgewars</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Welcome to Hedgewars!
+
+You seem to be new around here. Would you like to play some training missions first to learn the basics of Hedgewars?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cannot use the weapon scheme &apos;%1&apos;!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The connection to the server is lost.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Schemes - Name already taken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A scheme with the name &apos;%1&apos; already exists. Your scheme has been renamed to &apos;%2&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QObject</name>
+    <message>
+        <source>No description available</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QPushButton</name>
+    <message>
+        <source>default</source>
+        <translation>التلقائي</translation>
+    </message>
+    <message>
+        <source>OK</source>
+        <translation>OK</translation>
+    </message>
+    <message>
+        <source>Cancel</source>
+        <translation>الغاء</translation>
+    </message>
+    <message>
+        <source>Start server</source>
+        <translation>تشغيل الخادم</translation>
+    </message>
+    <message>
+        <source>Connect</source>
+        <translation>اتصل</translation>
+    </message>
+    <message>
+        <source>Update</source>
+        <translation type="unfinished">تحديث</translation>
+    </message>
+    <message>
+        <source>Specify</source>
+        <translation type="vanished">تحديد</translation>
+    </message>
+    <message>
+        <source>Start</source>
+        <translation>ابدا</translation>
+    </message>
+    <message>
+        <source>Go!</source>
+        <translation type="obsolete">ابدا</translation>
+    </message>
+    <message>
+        <source>Play demo</source>
+        <translation>ابدا العرض</translation>
+    </message>
+    <message>
+        <source>Rename</source>
+        <translation>تغيير الاسم</translation>
+    </message>
+    <message>
+        <source>Delete</source>
+        <translation>حذف</translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation>تحميل</translation>
+    </message>
+    <message>
+        <source>Associate file extensions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>More info</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Set default options</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Open videos directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Play</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Restore default coding parameters</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Open the video directory in your system</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Play this video</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Delete this video</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Reset</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Set the default server port for Hedgewars</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Invite your friends to your server in just 1 click!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Click to copy your unique server URL to your clipboard. Send this link to your friends and they will be able to join you.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Specify address</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QSpinBox</name>
+    <message>
+        <source>Specify the bitrate of recorded videos as a multiple of 1024 bits per second</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>RoomNamePrompt</name>
+    <message>
+        <source>Enter a name for your room.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cancel</source>
+        <translation type="unfinished">الغاء</translation>
+    </message>
+    <message>
+        <source>Create room</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>set password</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>RoomsListModel</name>
+    <message>
+        <source>In progress</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Room Name</source>
+        <translation type="unfinished">اسم الغرقة</translation>
+    </message>
+    <message>
+        <source>C</source>
+        <extracomment>Caption of the column for the number of connected clients in the list of rooms</extracomment>
+        <translation type="unfinished">C</translation>
+    </message>
+    <message>
+        <source>T</source>
+        <extracomment>Caption of the column for the number of teams in the list of rooms</extracomment>
+        <translation type="unfinished">T</translation>
+    </message>
+    <message>
+        <source>Owner</source>
+        <translation type="unfinished">المالك</translation>
+    </message>
+    <message>
+        <source>Map</source>
+        <translation type="unfinished">خارطة</translation>
+    </message>
+    <message>
+        <source>Rules</source>
+        <translation type="unfinished">قوانين</translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation type="unfinished">اسلحة</translation>
+    </message>
+    <message>
+        <source>Random Map</source>
+        <translation type="unfinished">خارطة عشوائية</translation>
+    </message>
+    <message>
+        <source>Random Maze</source>
+        <translation type="unfinished">متاهة عشوائية</translation>
+    </message>
+    <message>
+        <source>Hand-drawn</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Script</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Random Perlin</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>SeedPrompt</name>
+    <message>
+        <source>The map seed is the basis for all random values generated by the game.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cancel</source>
+        <translation type="unfinished">الغاء</translation>
+    </message>
+    <message>
+        <source>Set seed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Close</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Seed</source>
+        <extracomment>Refers to the &quot;random seed&quot;; the source of randomness in the game</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>SelWeaponWidget</name>
+    <message>
+        <source>Weapon set</source>
+        <translation>نمط الاسلحة</translation>
+    </message>
+    <message>
+        <source>Probabilities</source>
+        <translation>احتماليات</translation>
+    </message>
+    <message>
+        <source>Ammo in boxes</source>
+        <translation>العتاد في الصناديق</translation>
+    </message>
+    <message>
+        <source>Delays</source>
+        <translation>التأخير</translation>
+    </message>
+    <message>
+        <source>new</source>
+        <translation type="obsolete">جديد</translation>
+    </message>
+    <message>
+        <source>New</source>
+        <translation type="unfinished">جديد</translation>
+    </message>
+    <message>
+        <source>New (%1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Copy of %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Copy of %1 (%2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>TCPBase</name>
+    <message>
+        <source>Unable to start server at %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unable to run engine at %1
+Error code: %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The game engine died unexpectedly!
+(exit code %1)
+
+We are very sorry for the inconvenience :(
+
+If this keeps happening, please click the &apos;%2&apos; button in the main menu!</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>TeamSelWidget</name>
+    <message>
+        <source>At least two teams are required to play!</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>ThemePrompt</name>
+    <message>
+        <source>Cancel</source>
+        <translation type="unfinished">الغاء</translation>
+    </message>
+    <message>
+        <source>Search for a theme:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Use selected theme</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Choose a theme</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>binds</name>
+    <message>
+        <source>up</source>
+        <translation>up</translation>
+    </message>
+    <message>
+        <source>left</source>
+        <translation>left</translation>
+    </message>
+    <message>
+        <source>right</source>
+        <translation>right</translation>
+    </message>
+    <message>
+        <source>down</source>
+        <translation>down</translation>
+    </message>
+    <message>
+        <source>attack</source>
+        <translation>attack</translation>
+    </message>
+    <message>
+        <source>precise aim</source>
+        <translation>precise aim</translation>
+    </message>
+    <message>
+        <source>put</source>
+        <translation>put</translation>
+    </message>
+    <message>
+        <source>switch</source>
+        <translation>switch</translation>
+    </message>
+    <message>
+        <source>find hedgehog</source>
+        <translation type="obsolete">find hedgehog</translation>
+    </message>
+    <message>
+        <source>ammo menu</source>
+        <translation>ammo menu</translation>
+    </message>
+    <message>
+        <source>slot 1</source>
+        <translation>slot 1</translation>
+    </message>
+    <message>
+        <source>slot 2</source>
+        <translation>slot 2</translation>
+    </message>
+    <message>
+        <source>slot 3</source>
+        <translation>slot 3</translation>
+    </message>
+    <message>
+        <source>slot 4</source>
+        <translation>slot 4</translation>
+    </message>
+    <message>
+        <source>slot 5</source>
+        <translation>slot 5</translation>
+    </message>
+    <message>
+        <source>slot 6</source>
+        <translation>slot 6</translation>
+    </message>
+    <message>
+        <source>slot 7</source>
+        <translation>slot 7</translation>
+    </message>
+    <message>
+        <source>slot 8</source>
+        <translation>slot 8</translation>
+    </message>
+    <message>
+        <source>slot 9</source>
+        <translation>slot 9</translation>
+    </message>
+    <message>
+        <source>timer 1 sec</source>
+        <translation>timer 1 sec</translation>
+    </message>
+    <message>
+        <source>timer 2 sec</source>
+        <translation>timer 2 sec</translation>
+    </message>
+    <message>
+        <source>timer 3 sec</source>
+        <translation>timer 3 sec</translation>
+    </message>
+    <message>
+        <source>timer 4 sec</source>
+        <translation>timer 4 sec</translation>
+    </message>
+    <message>
+        <source>timer 5 sec</source>
+        <translation>timer 5 sec</translation>
+    </message>
+    <message>
+        <source>chat</source>
+        <translation>chat</translation>
+    </message>
+    <message>
+        <source>chat history</source>
+        <translation>chat history</translation>
+    </message>
+    <message>
+        <source>pause</source>
+        <translation type="vanished">pause</translation>
+    </message>
+    <message>
+        <source>confirmation</source>
+        <translation>confirmation</translation>
+    </message>
+    <message>
+        <source>volume down</source>
+        <translation>volume down</translation>
+    </message>
+    <message>
+        <source>volume up</source>
+        <translation>volume up</translation>
+    </message>
+    <message>
+        <source>change mode</source>
+        <translation>change mode</translation>
+    </message>
+    <message>
+        <source>capture</source>
+        <translation>capture</translation>
+    </message>
+    <message>
+        <source>quit</source>
+        <translation>quit</translation>
+    </message>
+    <message>
+        <source>zoom in</source>
+        <translation>zoom in</translation>
+    </message>
+    <message>
+        <source>zoom out</source>
+        <translation>zoom out</translation>
+    </message>
+    <message>
+        <source>reset zoom</source>
+        <translation>reset zoom</translation>
+    </message>
+    <message>
+        <source>long jump</source>
+        <translation>long jump</translation>
+    </message>
+    <message>
+        <source>high jump</source>
+        <translation>high jump</translation>
+    </message>
+    <message>
+        <source>slot 10</source>
+        <translation type="unfinished">slot 10</translation>
+    </message>
+    <message>
+        <source>mute audio</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>record</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>autocam / find hedgehog</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>speed up replay</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle team bars</source>
+        <extracomment>This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>pause / auto skip</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>show mission information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>clan chat</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>binds (categories)</name>
+    <message>
+        <source>Movement</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation type="unfinished">اسلحة</translation>
+    </message>
+    <message>
+        <source>Camera</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Miscellaneous</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>binds (descriptions)</name>
+    <message>
+        <source>Traverse gaps and obstacles by jumping:</source>
+        <translation type="unfinished">قفز فوق الحواجز</translation>
+    </message>
+    <message>
+        <source>Fire your selected weapon or trigger an utility item:</source>
+        <translation type="unfinished">اطلاق السلاح</translation>
+    </message>
+    <message>
+        <source>Pick a weapon or a target location under the cursor:</source>
+        <translation type="unfinished">أخذ السلاح تحت المؤشر</translation>
+    </message>
+    <message>
+        <source>Switch your currently active hog (if possible):</source>
+        <translation type="unfinished">تغيير اختيار اللاعب الحالي</translation>
+    </message>
+    <message>
+        <source>Pick a weapon or utility item:</source>
+        <translation type="unfinished">اختر السلاح</translation>
+    </message>
+    <message>
+        <source>Set the timer on bombs and timed weapons:</source>
+        <translation type="unfinished">وقت الانفجار</translation>
+    </message>
+    <message>
+        <source>Move the camera to the active hog:</source>
+        <translation type="obsolete">الكامرة على اللاعب</translation>
+    </message>
+    <message>
+        <source>Move the cursor or camera without using the mouse:</source>
+        <translation type="unfinished">تحريك الكامرة او اللاعب بلا المؤشر</translation>
+    </message>
+    <message>
+        <source>Modify the camera&apos;s zoom level:</source>
+        <translation type="unfinished">تغيير مدى التقريب البصري</translation>
+    </message>
+    <message>
+        <source>Talk to your team or all participants:</source>
+        <translation type="obsolete">ارسال رسالة لاعضاء الفريق</translation>
+    </message>
+    <message>
+        <source>Pause, continue or leave your game:</source>
+        <translation type="unfinished">توقيف اللعبة، الاستمرار او الغائها</translation>
+    </message>
+    <message>
+        <source>Modify the game&apos;s volume while playing:</source>
+        <translation type="unfinished">تغيير ارتقاع الصوت اثناء اللعبة</translation>
+    </message>
+    <message>
+        <source>Toggle fullscreen mode:</source>
+        <translation type="unfinished">تبديل ملئ الشاشة</translation>
+    </message>
+    <message>
+        <source>Take a screenshot:</source>
+        <translation type="unfinished">خد صورة</translation>
+    </message>
+    <message>
+        <source>Toggle labels above hedgehogs:</source>
+        <translation type="obsolete">تغيير العناوبن فوق اللاعبين</translation>
+    </message>
+    <message>
+        <source>Record video:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgehog movement</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Toggle automatic camera / refocus on active hedgehog:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Demo replay:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Heads-up display:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Talk to your clan or all participants:</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>binds (keys)</name>
+    <message>
+        <source>Keyboard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Delete</source>
+        <translation>Delete</translation>
+    </message>
+    <message>
+        <source>Mouse: Left button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: Middle button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: Right button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: Wheel up</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: Wheel down</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Backspace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Tab</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Clear</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Return</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Pause</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Escape</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Space</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numpad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numpad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numpad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numpad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numpad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numpad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numpad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numpad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numpad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numpad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numpad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numpad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numpad *</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numpad -</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numpad +</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Enter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Equals</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Up</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Down</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Insert</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>End</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Page up</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Page down</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Num lock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Caps lock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scroll lock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right meta</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left meta</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>B button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>X button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Y button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>LB button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>RB button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Back button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left stick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right stick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left stick (Right)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left stick (Left)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left stick (Down)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left stick (Up)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left trigger</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right trigger</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right stick (Down)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right stick (Up)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right stick (Right)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right stick (Left)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>D-pad</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Axis %1 %2</source>
+        <extracomment>Game controller axis direction. %1 = axis number, %2 = direction</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Button %1</source>
+        <extracomment>Game controller button. %1 = button number</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>D-pad %1 %2</source>
+        <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation type="unfinished">اسلحة</translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation type="unfinished">عام</translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>server</name>
+    <message>
+        <source>Nickname is already in use</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>No checker rights</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Authentication failed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>60 seconds cooldown after kick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>kicked</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ping timeout</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>New voting started</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>kick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>pause</source>
+        <translation type="unfinished">pause</translation>
+    </message>
+    <message>
+        <source>Reconnected too fast</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Warning! Chat flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Excess flood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game messages flood detected - 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Warning! Joins flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>new seed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/maxteams: specify number from 2 to 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The game can&apos;t be started with less than two clans!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Empty config entry.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Access denied.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>You&apos;re not the room master!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Corrupted hedgehogs info!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Too many teams!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Too many hedgehogs!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>There&apos;s already a team with same name in the list.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Joining not possible: Round is in progress.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This room currently does not allow adding new teams.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Error: The team you tried to remove does not exist.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>You can&apos;t remove a team you don&apos;t own.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Illegal room name! The room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A room with the same name already exists.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/callvote kick: You need to specify a nickname.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/callvote kick: No such user!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/callvote map: No such map!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/callvote pause: No game in progress!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/callvote hedgehogs: Specify number from 1 to 8.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Illegal room name! A room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>No such room.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Room version incompatible to your Hedgewars version!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Access denied. This room currently doesn&apos;t allow joining.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Access denied. This room is for registered users only.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>You are banned from this room.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nickname already provided.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Illegal nickname! Nicknames must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Protocol already known.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bad number.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>There&apos;s no voting going on.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>You already have voted.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Your vote has been counted.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Voting closed.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Pause toggled.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Voting expired.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>hedgehogs per team: </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/info &lt;player&gt;: Show info about player</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/me &lt;message&gt;: Chat action, e.g. &apos;/me eats pizza&apos; becomes &apos;* Player eats pizza&apos;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/rnd: Flip a virtual coin and reply with &apos;heads&apos; or &apos;tails&apos;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/rnd [A] [B] [C] [...]: Reply with a random word from the given list</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/watch &lt;id&gt;: Watch a demo stored on the server with the given ID</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/help: Show chat command help</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/callvote [arguments]: Start a vote</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/vote &lt;yes/no&gt;: Vote &apos;yes&apos; or &apos;no&apos; for active vote</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/delegate &lt;player&gt;: Surrender room control to player</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/maxteams &lt;N&gt;: Limit maximum number of teams to N</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/global &lt;message&gt;: Send global chat message which can be seen by everyone on the server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/registered_only: Toggle &apos;registered only&apos; state. If enabled, only registered players can join server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/super_power: Activate your super power. With it you can enter any room and are protected from kicking. Expires when you leave server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/stats: Query server stats</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/force &lt;yes/no&gt;: Force vote result for active vote</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/fix: Force this room to stay open when it is empty</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/unfix: Undo the /fix command</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>List of lobby chat commands:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>List of room chat commands:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Commands for server admins only:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>room</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>lobby</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(playing)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(spectating)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Player is not online.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/force: Please use &apos;yes&apos; or &apos;no&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/vote: Please use &apos;yes&apos; or &apos;no&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Kicked</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server only allows registered users to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>heads</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>tails</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server does not support replays!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/greeting [message]: Set or clear greeting message to be shown to players who join the room</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/save &lt;config ID&gt; &lt;config name&gt;: Add current room configuration as votable choice for /callvote map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/delete &lt;config ID&gt;: Delete a votable room configuration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/saveroom &lt;file name&gt;: Save all votable room configurations (and the greeting) of this room into a file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/loadroom &lt;file name&gt;: Load votable room configurations (and greeting) from a file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Super power activated.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown command or invalid parameters. Say &apos;/help&apos; in chat for a list of commands.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>You can&apos;t kick yourself!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>You can&apos;t kick the only other player!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The player is not in your room.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This player is protected from being kicked.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>You&apos;re not the room master or a server admin!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>You&apos;re already the room master.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Greeting message cleared.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Greeting message set.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/callvote kick: This is only allowed in rooms without a room master.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/callvote map: No maps available.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>You&apos;re the new room master!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>/quit: Quit the server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This command is only available in the lobby.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This command is only available in rooms.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+</TS>
--- a/share/hedgewars/Data/Locale/ar.txt	Mon Jan 14 15:11:15 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,468 +0,0 @@
-; Arabic locale
-
-00:00=رمانة‫
-00:01=عنقودية‫
-00:02=صاروخ‫
-00:03=صاروخ موجه‫
-00:04=بندقية
-00:05=مطرقة
-00:06=ترك
-00:07=حبل
-00:08=لغم
-00:09=مسدس حربي
-00:10=ديناميت
-00:11=مضرب بيسبول
-00:12=Shoryuken
-00:13=ثانية
-00:14=برشوت
-00:15=هجوم جوي
-00:16=هجوم الغام
-00:17=شعلة
-00:18=بناء
-00:19=نقل
-00:20=تبديل
-00:21=هاون
-00:22=سوط
-00:23=انتحار
-00:24=كيك
-00:25=اغواء
-00:26=ركية
-00:27=قنبلة جحيم
-00:28=صاروخ حفر
-00:29=مسدس كرات
-00:30=حارق
-00:31=طيارة مسيطرة عن بعد
-00:32=جاذبية قليلة
-00:33=تاثير مضاعف
-00:34=غير قابل للاضرار
-00:35=وقت اضافي
-00:36=منظار ليزر
-00:37=مصاص دماء
-00:38=قناص
-00:39=صحن طائر
-00:40=زجاجة حارقة
-00:41=طير
-
-; 01:00=Loading …
-01:01=تعادل
-01:02=%1 يفوز
-01:03=جزء %1%
-01:04=توقف
-01:05=خروج (%1/%2)?
-01:06=موت مفاجئ
-01:07=%1 متبقي
-01:08=طاقة: %1%
-01:09=تحديث...
-01:10=استعمال هذه لن ينهي دورك
-01:11=This weapon or utility is not yet available!
-
-; Event messages
-; Hog (%1) died
-02:00=%1 has kicked the bucket!
-02:00=%1 has seen the light!
-02:00=%1 never saw that coming!
-02:00=%1 waves goodbye!
-02:00=%1 has gone to a better place!
-02:00=%1 meets his maker!
-02:00=%1 can hang on no longer!
-02:00=%1 has done his duty!
-02:00=%1 makes the ultimate sacrifice!
-02:00=%1 departs this mortal coil!
-02:00=%1 makes like a tree and leaves!
-02:00=%1 has timed out!
-02:00=%1 says peace out!
-02:00=%1 will be fondly remembered!
-02:00=%1 has an aneurysm!
-02:00=%1 leaves behind a wife and child
-02:00=%1 has launched his last bazooka
-02:00=%1 has tossed his last grenade
-02:00=%1 has baked his last cake
-02:00=%1 has swung on his last rope
-02:00=%1 has called his last airstrike
-02:00=%1 has pumped his last shotgun
-02:00=%1 has thrown his last melon
-02:00=%1 has drawn his last deagle
-02:00=%1 took one shot too many
-02:00=%1 could really have used a health crate
-02:00=%1 has gone to play a better game
-02:00=%1 has ragequit life
-02:00=%1 fails
-02:00=Poor poor %1...
-02:00=%1 prefers wormux
-02:00=%1 has been blocking shots with his face
-02:00=%1 is a hero amongst me...err..hogs
-02:00=%1 finds his place in Valhalla
-02:00=%1 has left the building
-02:00=%1 goes the way of the dinosaurs
-02:00=%1 brings hedgehogs one step closer to extinction
-02:00=%1 brings a tear to my eye
-02:00=%1 is an ex-hog
-02:00=%1 is pushing up the daisies
-02:00=%1 has ceased to be
-02:00=Say goodbye to %1
-02:00=No hope left for %1
-02:00=%1 faces the final curtain
-02:00=Smoke 'em if you got 'em, %1
-02:00=%1 suffers a Spontaneous Massive Existence Failure
-02:00=%1 has passed on
-02:00=%1 is stone dead
-02:00=%1 is no more
-02:00=%1 has expired
-02:00=Bereft of life, %1 rests in peace
-02:00=%1 joins the choir invisible
-02:00=Farewell %1, we hardly knew ye!
-02:00=%1 had a low tolerance for being shot
-02:00=%1 could have used an extra life
-02:00=Is there a doctor in the house?
-
-; Hog (%1) drowned
-02:01=%1 plays submarine!
-02:01=%1 mimics the Titanic!
-02:01=%1 swims like a stone!
-02:01=%1 floats like a brick!
-02:01=%1 checks out the deep end
-02:01=%1 goes glug glug glug
-02:01=%1 goes splash
-02:01=%1 forgot his armbands
-02:01=%1 really should have taken swimming lessons
-02:01=%1 left his surfboard at home
-02:01=%1 is washed up
-02:01=%1 is one soggy hog
-02:01=%1 forgot to bring his life jacket
-02:01=%1 goes splish splash splish
-02:01=%1 is sleeping with the fishes
-02:01=%1 thinks the water physics suck in this game
-02:01=%1 looks thirsty
-02:01=the sea claims %1
-02:01=%1 is lost at sea
-02:01=%1 should have brought his scuba gear
-02:01=%1 gets a burial at sea
-02:01=%1 has that sinking feeling
-02:01=%1 is practicing his backstroke
-02:01=%1 goes in search of the Titanic
-02:01=%1 is not Jesus
-02:01=%1 is finding Nemo
-02:01=%1 springs a leak
-02:01=You've gotta wonder how many hogs are down there
-02:01=%1 makes the ocean slightly higher
-02:01=%1 didn't enlist in the Navy
-02:01=%1 is doing his impersonation of a dead fish
-02:01=At least you didn't go down the toilet, %1
-02:01=Sonic couldn't swim and neither can %1
-02:01=%1 wants to play Ecco the dolphin
-02:01=%1 has gone to visit Aquaria
-02:01=%1 has found the lost city of Atlantis
-02:01=Your doggy paddle could use a little work, %1
-02:01=%1 should have brought a jet ski
-02:01=%1 doesn't like watersports
-02:01=%1 is forever blowing bubbles
-02:01=%1 is short of a raft
-02:01=%1 thinks salt water is good for the skin
-02:01=%1 gets salt water in his wounds
-02:01=%1 has walked the plank
-02:01=%1 has a bath
-02:01=%1 is wet wet wet
-02:01=%1 gets his quills wet
-02:01=It's Davy Jones' locker for %1
-
-; Round starts
-02:02=Let's fight!
-02:02=Armed and ready!
-02:02=Let's get ready to rumble!
-02:02=Let's get it on!
-02:02=Let's get this party started
-02:02=Last hog standing wins
-02:02=Let's go!
-02:02=Let's rock!
-02:02=Let's jam!
-02:02=It's beginning...
-02:02=This is the start of something big
-02:02=Welcome to Hedgewars
-02:02=Welcome to the front lines
-02:02=Crush your enemies!
-02:02=May the best hog win
-02:02=Victory or death
-02:02=To the victor goes the spoils
-02:02=Losing is not an option
-02:02=Cry havoc! Let loose the hogs of war!
-02:02=Hedgewars, brought to you by Hedgewars.org
-02:02=GL HF
-02:02=Just count yourself lucky you're not up against Tiyuri
-02:02=Just count yourself lucky you're not up against unC0Rr
-02:02=Just count yourself lucky you're not up against Nemo
-02:02=Just count yourself lucky you're not up against Smaxx
-02:02=Just count yourself lucky you're not up against Jessor
-02:02=Give it your all!
-02:02=The losers do the cleaning up!
-02:02=Let the fight of the millenium begin
-02:02=Let the fight of the century begin
-02:02=Let the fight of the decade begin
-02:02=Let the fight of the year begin
-02:02=Let the fight of the month begin
-02:02=Let the fight of the week begin
-02:02=Let the fight of the day begin
-02:02=Let the fight of the hour begin
-02:02=Do your best!
-02:02=Destroy the enemy!
-02:02=Good luck
-02:02=Have fun
-02:02=Fight the good fight
-02:02=Fight dirty
-02:02=Fight with honour
-02:02=Don't give up
-02:02=Never surrender
-02:02=Rock 'em and sock 'em!
-02:02=Let the fragfest begin!
-02:02=I hope you're ready for a tussle!
-02:02=Go Go Go!
-02:02=Hedgehogs advance!
-02:02=Bring it to them!
-02:02=Have no fear!
-02:02=Be brave and conquer
-
-; Round ends and team/clan (%1) wins
-02:03=%1 يفوز
-
-; Round ends in a draw
-02:04=تعادل
-
-; New health crate
-02:05=Incoming aid!
-02:05=Medic!
-02:05=First aid from the skies!
-02:05=A health pack for you
-02:05=Good health.. in box form!
-02:05=The doctor calls
-02:05=Fresh band-aids!
-02:05=This will make you feel better
-02:05=A Hi-Potion! Whoops wrong game
-02:05=A pick-me-up!
-02:05=Grab it
-02:05=A healthy snack
-02:05=A remedy to pain
-02:05=Correct Dosage: as many as you can find!
-02:05=Urgent delivery
-02:05=Supplies!
-
-; New ammo crate
-02:06=More weapons!
-02:06=Reinforcements!
-02:06=Lock and load!
-02:06=I wonder what weapon is in there?
-02:06=Supplies!
-02:06=What could be inside?
-02:06=Christmas comes early in Hedgewars
-02:06=A present!
-02:06=Special delivery!
-02:06=It was a nightmare getting this through customs
-02:06=Destructive toys from the heavens
-02:06=Warning! Contents Volatile
-02:06=Pick it up or blow it up, choice is yours
-02:06=Goodies!
-02:06=Mmmmm Ammo
-02:06=A box of destructive power
-02:06=Airmail!
-02:06=Whatever's in that box, it ain't pizza
-02:06=Get it!
-02:06=Weapon drop incoming
-02:06=Don't let the enemy grab that!
-02:06=Shiny new toys!
-02:06=A mysterious box!
-
-; New utility crate
-02:07=Tooltime!
-02:07=This could come in handy...
-02:07=Utilities!
-02:07=Utilise this box
-02:07=Watch out below
-02:07=More utilities!
-02:07=Tools for you!
-02:07=This should be good!
-02:07=Use this wisely
-02:07=Ooo this box is heavy
-02:07=You might need this
-
-; Hog (%1) skips his turn
-02:08=%1 is sooo boring...
-02:08=%1 couldn't be bothered
-02:08=%1 is one lazy hog
-02:08=%1 is thoughtless
-02:08=%1 gave up
-02:08=You snooze you lose, %1
-02:08=%1 shamelessly skips
-02:08=%1 is really lazy
-02:08=%1 needs a little more motivation
-02:08=%1 is a pacifist
-02:08=%1 has a breather
-02:08=%1 has a rest
-02:08=%1 chills out
-02:08=%1 has no faith in his own abilities
-02:08=%1 decides to do nothing at all
-02:08=%1 lets the enemy destroy itself
-02:08=%1 would be terrible at parties
-02:08=%1 hides out
-02:08=%1 has decided to pass on this opportunity
-02:08=%1 decides the best thing he can do is...nothing
-02:08=%1 is a big wuss
-02:08=Buck Buck Buck, %1 is a chicken
-02:08=%1 is looking a little yellow
-02:08=%1 is a coward!
-02:08=%1 is waiting for sudden death
-02:08=%1 is not the fighting type
-02:08=%1 is reconsidering his purpose in life
-02:08=%1 was never much of a good shot anyway
-02:08=%1 didn't want to join the army in the first place
-02:08=Stop wasting our time, %1
-02:08=I'm dissapointed in you, %1
-02:08=Come on, you can do better than that %1
-02:08=%1's will has broken
-02:08=%1 apparently has better things to do
-02:08=%1 is scared stiff
-02:08=%1 has fallen asleep
-
-; Hog (%1) hurts himself only
-02:09=%1 should practice aiming!
-02:09=%1 seems to hate himself
-02:09=%1 is standing on the wrong side!
-02:09=%1 makes like an emo
-02:09=%1 was holding his weapon the wrong way around
-02:09=%1 is a little sadistic
-02:09=%1 is a masochist
-02:09=%1 has no instinct of self-preservation
-02:09=%1 messed up
-02:09=%1 screwed up
-02:09=That was a poor shot, %1
-02:09=%1 is a little too careless with dangerous weapons
-02:09=%1 should consider a change of career
-02:09=Worst. Shot. Ever!
-02:09=No no no %1, you shoot at the ENEMY!
-02:09=%1 should only be destroying the enemy
-02:09=%1 moves one step closer to suicide
-02:09=%1 aids the enemy
-02:09=That was stupid %1
-02:09=%1 lives by the mantra of "no pain, no gain"
-02:09=%1 is confused
-02:09=%1 hurt itself in its confusion
-02:09=%1 has a knack for embarrassing himself
-02:09=%1 is a klutz!
-02:09=%1 is clumsy
-02:09=%1 shows the enemy what he's capable of
-02:09=%1 can't be expected to be perfect all the time
-02:09=Don't worry %1, pobody's nerfect
-02:09=%1 totally did that on purpose
-02:09=I won't tell anyone if you don't, %1
-02:09=How embarrassing!
-02:09=I'm sure nobody saw that %1
-02:09=%1 needs to review his field manual
-02:09=%1's weapon clearly malfunctioned
-
-; Hog shot an home run (using the bat and another hog)
-02:10=Home Run!
-02:10=A bird, a plane, ...
-02:10=That one is out!
-
-; Weapon Categories
-03:00=Timed Grenade
-03:01=Timed Grenade
-03:02=Ballistic Weapon
-03:03=Guided Weapon
-03:04=Gun (multiple shots)
-03:05=Digging Tool
-03:06=Action
-03:07=Transport Utility
-03:08=Proximity Bomb
-03:09=Gun (multiple shots)
-03:10=BOOM!
-03:11=Bonk!
-03:12=Martial Arts
-03:13=UNUSED
-03:14=Transport Utility
-03:15=Airborne Attack
-03:16=Airborne Attack
-03:17=Digging Tool
-03:18=Utility
-03:19=Transport Utility
-03:20=Action
-03:21=Ballistic Weapon
-03:22=Call me Indiana!
-03:23=(Really) Martial Arts
-03:24=The cake is NOT a lie!
-03:25=Costume Kit
-03:26=Juicy Grenade
-03:27=Fiery Grenade
-03:28=Ballistic Weapon
-03:29=Ballistic Weapon
-03:30=Airborne Attack
-03:31=Remote Controlled Bomb
-03:32=Temporary Effect
-03:33=Temporary Effect
-03:34=Temporary Effect
-03:35=Temporary Effect
-03:36=Temporary Effect
-03:37=Temporary Effect
-03:38=Gun (multiple shots)
-03:39=Transport Utility
-03:40=Incinerating Grenade
-03:41=Huge fan of Squawks
-
-; Weapon Descriptions (use | as line breaks)
-04:00=Attack your enemies using a simple grenade.|It will explode once its timer reaches zero.|1-5: Set grenade's timer|Attack: Hold to throw with more power
-04:01=Attack your enemies using a cluster bomb.|It will split into smaller bombs once its timer|reaches zero.|1-5: Set grenade's timer|Attack: Hold to throw with more power
-04:02=Attack your enemies using a ballistic projectile|that might be influenced by wind.|Attack: Hold to shoot with more power
-04:03=Launch an explosive bee that will lock on|the selected target. Don't shoot with full power|to improve its precision.|Cursor: Pick target|Attack: Hold to shoot with more power
-04:04=Attack your enemy using a shotgun with two shots.|Thanks to its spread you don't need direct hits|to harm your opponents.|Attack: Shoot (multiple times)
-04:05=Move underground! Use the pickhammer to drill|a hole into the ground and reach other areas.|Attack: Start or stop digging
-04:06=Bored? No way to attack? Save your ammo?|No problem! Just skip your turn, coward!|Attack: Skip your turn without fighting
-04:07=Bridge huge distances using timed shots with the|rope. Use your momentum to slide into other hogs|or drop grenades and other weapons on them.|Attack: Shoot or release the rope|Long Jump: Drop grenades or similar weapons
-04:08=Keep your enemies away by dropping a mine in|narrow passages or right below their feet. Be|sure to retreat before you trigger it yourself!|Attack: Drop mine next to your feet
-04:09=Not sure about your aiming? Use the Desert|Eagle to attack using up to four shots.|Attack: Shoot (multiple times)
-04:10=Brute force is always an option. Drop this classic|explosive next to your enemies and retreat.|Attack: Drop dynamite next to your feet
-04:11=Get rid of enemy hogs by batting them over|the map borders or into water. Or how about|knocking some mines to your friends?|Attack: Bat everything in front of you
-04:12=Get close and personal to unleash the power of|this almost deadly martial arts technique.|Attack: Perform the Fire Punch
-04:13=UNUSED
-04:14=Fear of heights? Better grab a parachute.|It will unfold once|you fall too far and|save your hog from taking fall damage.|Attack: Unfold the parachute|Long Jump: Drop grenades or similar weapons
-04:15=Call in an airplane to attack your enemies|using a bombing run.|Left/Right: Determine attack direction|Cursor: Select target region
-04:16=Call in an airplane to drop several mines|in the target area.|Left/Right: Determine attack direction|Cursor: Select target region
-04:17=Need shelter? Use the blow torch to dig|a tunnel into solid ground granting you|cover.|Attack: Start or stop digging
-04:18=Need additional protection or want to pass|unpassable ground? Place some girders as you|like.|Left/Right: Select girder to place|Cursor: Place girder in a valid position
-04:19=Used at the right moment teleportation can|be more powerful than almost all weapons as|it allows you to save hogs from dangerous|situations within seconds.|Cursor: Select target region
-04:20=Allows you to play the current turn with|a different hog.|Attack: Enable switching hogs
-04:21=Shoot a grenade-like projectile that will|release multiple bombs upon impact.|Attack: Shoot at full power
-04:22=Not just for Indiana Jones! The whip is a|useful weapon in many situations. Especially|when you'd like to shove someone off a cliff.|Attack: Strike everything in front of you
-04:23=If you have nothing to lose, this might be|quite handy. Sacrifice your hog by launching|him into a specific direction hurting everything|on his way and exploding at the end.|Attack: Launch the devastating and deadly attack
-04:24=Happy Birthday! Launch this cake, let it walk right|next to your enemies and let them have an explosive|party. The cake is able to pass almost all terrain|but he might detonate earlier this way.|Attack: Start the cake or let it stop and explode
-04:25=Use this disguise kit to get your enemies to jump|towards your hog (and into some gap or hole).|Attack: Use the kit and try to seduce another hog
-04:26=Throw this juicy watermelon at your enemies. Once|the timer expires, it will split into several|explosive pieces.|1-5: Set watermelon's timer|Attack: Hold to shoot with more power
-04:27=Let hellfire rain onto your opponents by using|this fiendish explosive. Don't get too close to|the explosion as smaller fires might last longer.|Attack: Hold to shoot with more power
-04:28=Short time after launching this rocket, it will|start drilling through solid ground and explode|once its fuse is triggered or it resurfaces again.|Attack: Hold to shoot with more power
-04:29=This is nothing for small kids! The ball gun fires|tons of small colored balls filled with explosives.|Attack: Shoot at full power|Up/Down: Continue aiming
-04:30=Call in an airplane to launch a powerful napalm|strike. With proper aiming this attack can eradicate|huge parts of landscape including unlucky hogs|sitting there.|Left/Right: Determine attack direction|Cursor: Select target region
-04:31=The RC plane is the ideal weapon to collect crates or|attack far away hogs. Either steer it into enemies or|drop some bombs first.|Attack: Launch the plane or drop bombs|Long Jump: Let the valkyries ride into battle|Up/Down: Steer the plane
-04:32=Low gravity is more effective than any diet! Jump|higher and over greater distances or let your enemies|fly even further.|Attack: Activate
-04:33=Sometimes you just need that little extra boost to|deal some more damage.|Attack: Activate
-04:34=Can't touch me!|Attack: Activate
-04:35=Sometimes time's running too fast. Grab some extra|seconds to finish your attack.|Attack: Activate
-04:36=Well, sometimes you're just too bad in aiming. Get|some assistance using modern day technology.|Attack: Activate
-04:37=Don't fear the daylight. It will just last one turn|but will enable you to absorb the damage you do to|other hogs.|Attack: Activate
-04:38=The sniper rifle can be the most devastating weapon|in your whole arsenal, however it's very ineffective|at close quarters. The damage dealt increases with|the distance to its target.|Attack: Shoot (twice)
-04:39=Fly to other parts of the map using the flying|saucer. This hard to master utility is able to|take you to almost any position on the battlefield.|Attack: Activate|Up/Left/Right: Apply force in one direction|Long Jump: Drop grenades or similar weapons
-04:40=Set some ground on fire using this bottle filled|with (soon to be) burning liquid.|Attack: Hold to shoot with more power
-04:41=The evidence nature might even top the flying|saucer. Birdy can carry your hog around and|drop eggs on your enemies!|Attack: Activate and drop eggs|Up/Left/Right: Flap in one direction
-
-; Game goal strings
-05:00=Game Modes
-05:01=The following rules apply
-05:02=Place the King: Pick a protected starting point for your King
-05:03=Low Gravity: Watch your step
-05:04=Invulnerability: Hogs are (almost) invulnerable
-05:05=Vampirism: Hogs will be healed for the damage dealt
-05:06=Karma: Hogs will be damaged for the damage dealt
-05:07=Protect the King: Don't let your king die!
-05:08=Place Hedgehogs: Place your hogs before the game starts
-05:09=Artillery: Hogs can't walk to change position
-05:10=Indestructible Terrain: Most weapons won't destroy terrain
-05:11=Shared Ammo: All teams of the same color share their ammunition
-05:12=Mine Timers: Mines will detonate after %1 second(s)
-05:13=Mine Timers: Mines will detonate instantly
-05:14=Mine Timers: Mines will detonate after 0 - 3 seconds
-05:15=Damage Modifier: All weapons will do %1% damage
--- a/share/hedgewars/Data/Locale/campaigns_de.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/campaigns_de.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -19,10 +19,10 @@
 A_Classic_Fairytale-dragon.desc="Unser Held muss auf die andere Seite des Sees kommen. Werd zum Seilprofi und vermeide es, von feindlichen Schüssen getroffen zu werden."
 
 A_Classic_Fairytale-family.name="7. Mission: Familientreffen"
-A_Classic_Fairytale-family.desc="Unser Held muss erneut die Eingeborenen retten. Eliminiere die feindlichen Igel und befreie deine Kameraden. Benutze deine Ressourcen vorsichtig, weil sie begrenzt sind. Bohr ein paar Löcher an den richtigen Stellen und nähere dich der Prinzessin."
+A_Classic_Fairytale-family.desc="Unser Held muss erneut den Stamm retten. Eliminiere die feindlichen Igel und befreie deine Kameraden. Benutze deine Ressourcen vorsichtig, weil sie begrenzt sind. Bohr ein paar Löcher an den richtigen Stellen und nähere dich der Prinzessin."
 
 A_Classic_Fairytale-queen.name="8. Mission: Lang lebe die Königin"
-A_Classic_Fairytale-queen.desc="Die Eingeborenen müssen noch einmal kämpfen. Um zu gewinnen, müssen sie den Verräter bekämpfen und alle verfügbaren Ressourcen benutzen. Besieg den Feind!"
+A_Classic_Fairytale-queen.desc="Der Stamm muss noch einmal kämpfen. Um zu gewinnen, müssen die Igel den Verräter bekämpfen und alle verfügbaren Ressourcen benutzen. Besieg den Feind!"
 
 A_Classic_Fairytale-enemy.name="9. Mission: Der Feind meines Feindes"
 A_Classic_Fairytale-enemy.desc="Was für eine umwerfende Wendung! Undichte Stelle muss mit den … »Kannibalen« gegen den gemeinsamen Feind – die bösen Cyborgs – kämpfen!"
@@ -33,43 +33,43 @@
 A_Space_Adventure.name="Ein Weltraumabenteuer"
 
 A_Space_Adventure-cosmos.name="Menü: Weltraumreise"
-A_Space_Adventure-cosmos.desc="Hogera, der Igelplanet, wird bald von einem riesigen Meteorit getroffen. In diesem Wettlauf ums Überleben musst du PAdIs besten Piloten, Igel Einsam, in einer Weltraumreise um die Nachbarplaneten führen, um alle 4 Teile des lang verschollenem Antigravitationsgeräts zu finden!"
+A_Space_Adventure-cosmos.desc="Hogera, der Igelplanet, wird bald von einem riesigen Meteorit getroffen. In diesem Wettlauf ums Überleben musst du einen mutigen Igel, der von der Planetaren Assoziation der Igel (PAdI) beauftragt wurde, in einer Weltraumreise um die Nachbarplaneten führen, um alle 4 Teile des lang verschollenem Antigravitationsgeräts zu finden."
 
 A_Space_Adventure-moon01.name="Hauptmission: Der erste Halt"
-A_Space_Adventure-moon01.desc="Igel Einsam ist auf dem Mond gelandet, um seine fliegende Untertasse aufzutanken, aber Prof. Bösigel war zuerst da und hat einen Hinterhalt aufgestellt! Rette die gefangenen PAdI-Forscher und verscheuche Prof. Bösigel!"
+A_Space_Adventure-moon01.desc="Unser Held ist auf dem Mond gelandet, um die fliegende Untertasse aufzutanken, aber Prof. Bösigel war zuerst da und hat einen Hinterhalt aufgestellt! Rette die gefangenen PAdI-Forscher und verscheuche Prof. Bösigel!"
 
 A_Space_Adventure-moon02.name="Nebenmission: Jag den blauen Igel"
-A_Space_Adventure-moon02.desc="Igel Einsam besucht einen Eremiten, einen alten PAdI-Veteran, der im Mond lebt, um Prof. Bösigel auszuspionieren. Allerdings muss er den Eremiten, Verrückter Renner, zuerst in einem Wettlauf besiegen!"
+A_Space_Adventure-moon02.desc="Unser Held besucht einen Eremiten, einen alten PAdI-Veteranen, der im Mond lebt, um Prof. Bösigel auszuspionieren. Allerdings musst du den Eremiten, Verrückter Renner, zuerst in einem Wettlauf besiegen!"
 
 A_Space_Adventure-ice01.name="Hauptmission: Ein frostiges Abenteuer"
-A_Space_Adventure-ice01.desc="Willkommen auf dem Planeten des Eises. Hier ist es so kalt, dass die meisten Waffen von Igel Einsam nicht funktionieren werden. Du musst dir das verlorene Teil von dem Banditenanführer Thanta ergattern, indem du die Waffen, die du hier findest, verwendest!"
+A_Space_Adventure-ice01.desc="Willkommen auf dem Planeten des Eises. Hier ist es so kalt, dass die meisten Waffen nicht funktionieren werden. Du musst dir das verlorene Teil von dem Banditenanführer Thanta ergattern, indem du die Waffen, die du hier findest, verwendest!"
 
 A_Space_Adventure-ice02.name="Nebenmission: Schwerer Flug"
-A_Space_Adventure-ice02.desc="Igel Einsam konnte nicht einfach nur den Eisplaneten besuchen, ohne das Olympiastadion des Untertassenfliegens zu besuchen! In dieser Mission kannst du deine Flugkünste unter Beweis stellen und deinen Platz unter den Besten einnehmen!"
+A_Space_Adventure-ice02.desc="Unser Held konnte nicht einfach nur den Eisplaneten besuchen, ohne das Olympiastadion des Untertassenfliegens zu besuchen! In dieser Mission kannst du deine Flugkünste unter Beweis stellen und deinen Platz unter den Besten einnehmen!"
 
 A_Space_Adventure-desert01.name="Hauptmission: Suche im Staub"
-A_Space_Adventure-desert01.desc="Du bist auf dem Planeten aus Sand gelandet! Igel Einsam muss das fehlende Teil in den Bergwerksstollen finden. Sei vorsichtig, weil bösartige Schmuggler nur darauf warten, dich anzugreifen und auszurauben!"
+A_Space_Adventure-desert01.desc="Du bist auf dem Planeten aus Sand gelandet! Unser Held muss das fehlende Teil in den Bergwerksstollen finden. Sei vorsichtig, weil bösartige Schmuggler nur darauf warten, dich anzugreifen und auszurauben!"
 
 A_Space_Adventure-desert02.name="Nebenmission: Lauf um dein Leben"
-A_Space_Adventure-desert02.desc="Igel Einsam suchte nach dem Teil in diesem Tunnel, als er unerwarteterweise anfing, geflutet zu werden! Komm so schnell wie möglich zur Oberfläche und pass auf, keine Mine auszulösen."
+A_Space_Adventure-desert02.desc="Unser Held suchte nach dem Teil in diesem Tunnel, als er unerwarteterweise anfing, geflutet zu werden! Komm so schnell wie möglich zur Oberfläche und pass auf, keine Mine auszulösen."
 
 A_Space_Adventure-desert03.name="Nebenmission: Präzisionsfliegen"
-A_Space_Adventure-desert03.desc="Igel Einsam hat etwas Zeit, um sein Funkflugzeug zu fliegen und etwas Spaß zu haben. Flieg das Funkflugzeug und triff alle Ziele!"
+A_Space_Adventure-desert03.desc="Unser Held hat etwas Zeit, um mit Funkflugzeugen zu spielen und etwas Spaß zu haben. Flieg das Funkflugzeug und triff alle Ziele!"
 
 A_Space_Adventure-fruit01.name="Hauptmission: Schlechtes Timing"
 A_Space_Adventure-fruit01.desc="Auf dem Obstplaneten laufen die Dinge nicht so gut. Igel sammeln kein Obst, sondern sie bereiten sich auf den Kampf vor. Du musst dich entscheiden, ob du kämpfen oder fliehen wirst."
 
 A_Space_Adventure-fruit02.name="Hauptmission: Zum Greifen nah"
-A_Space_Adventure-fruit02.desc="Igel Einsam nähert sich dem verlorenen Teil des Obstplaneten. Wird ihn Leutnant Limone dabei helfen, das Teil zu besorgen? Oder nicht?"
+A_Space_Adventure-fruit02.desc="Unser Held nähert sich dem verlorenen Teil des Obstplaneten. Wird ihn Leutnant Limone dabei helfen, das Teil zu besorgen? Oder nicht?"
 
 A_Space_Adventure-fruit03.name="Nebenmission: Präzisionsschießen"
-A_Space_Adventure-fruit03.desc="Igel Einsam hat sich verlaufen und ist in dem Hinterhalt der Roten Erdbeeren geraten. Hilf ihm, sie zu eliminieren, um etwas zusätzliche Munition für die Mission »Zum Greifen nah« zu gewinnen."
+A_Space_Adventure-fruit03.desc="Unser Held hat sich verlaufen und ist in dem Hinterhalt der Roten Erdbeeren geraten. Hilf ihm, sie zu eliminieren, um etwas zusätzliche Munition für die Mission »Zum Greifen nah« zu gewinnen."
 
 A_Space_Adventure-death01.name="Hauptmission: Das letzte Gefecht" 
-A_Space_Adventure-death01.desc="Auf dem Todesplaneten, dem sterilsten Planeten in der Gegend, ist Igel Einsam ganz kurz davor, das letzte Teil des Geräts zu holen! Allerdings erwartet ihn eine unangenehme Überraschung."
+A_Space_Adventure-death01.desc="Auf dem Todesplaneten, dem sterilsten Planeten in der Gegend, ist unser Held ganz kurz davor, das letzte Teil des Geräts zu holen! Allerdings erwartet ihn eine unangenehme Überraschung."
 
 A_Space_Adventure-death02.name="Nebenmission: Die Spezialisten töten"
-A_Space_Adventure-death02.desc="Igel Einsam ist wieder in eine schwierige Situation geraten. Hilf ihm, die »5 tödlichen Igel« in ihrem eigenem Spiel zu besiegen!"
+A_Space_Adventure-death02.desc="Unser Held ist wieder in eine schwierige Situation geraten. Besiege die »5 tödlichen Igel« in ihrem eigenem Spiel!"
 
 A_Space_Adventure-final.name="Hauptmission: Der große Knall"
-A_Space_Adventure-final.desc="Igel Einsam muss ein paar Sprengkörper, die auf dem Meteoriten platziert wurden, detonieren. Hilf ihm, diese Mission zu beenden, ohne verletzt zu werden!"
+A_Space_Adventure-final.desc="Unser Held muss ein paar Sprengkörper, die auf dem Meteoriten platziert wurden, detonieren. Beende diese Mission, ohne verletzt zu werden!"
--- a/share/hedgewars/Data/Locale/campaigns_en.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/campaigns_en.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -19,10 +19,10 @@
 A_Classic_Fairytale-dragon.desc="Our hero has to get to the other side of the lake. Become a rope master and avoid getting hit by the enemy shots."
 
 A_Classic_Fairytale-family.name="Mission 7: Family Reunion"
-A_Classic_Fairytale-family.desc="Our hero has to save the natives once more. Eliminate the enemy hogs and free your comrades. Use your resources carefully as they are limited. Drill some holes in the right spot and get close to the princess."
+A_Classic_Fairytale-family.desc="Our hero has to save the tribe once more. Eliminate the enemy hogs and free your comrades. Use your resources carefully as they are limited. Drill some holes in the right spot and get close to the princess."
 
 A_Classic_Fairytale-queen.name="Mission 8: Long Live The Queen"
-A_Classic_Fairytale-queen.desc="The natives have to fight once again. In order to win, they'll have to fight the traitor and use all the resources available. Defeat the enemy!"
+A_Classic_Fairytale-queen.desc="The tribe has to fight once again. In order to win, they'll have to fight the traitor and use all the resources available. Defeat the enemy!"
 
 A_Classic_Fairytale-enemy.name="Mission 9: The Enemy Of My Enemy"
 A_Classic_Fairytale-enemy.desc="What a great twist! Leaks a Lot has to fight side by side with the … “cannibals” against the common enemy: The evil cyborgs!"
@@ -32,30 +32,30 @@
 
 A_Space_Adventure.name="A Space Adventure"
 A_Space_Adventure-cosmos.name="Menu: Spacetrip"
-A_Space_Adventure-cosmos.desc="Hogera, the planet of hogs is about to be hit by a gigantic meteorite. In this race for survival you have to lead PAotH's best pilot, Hog Solo, in a space trip around the neighbor planets to collect all the 4 pieces of the long lost anti gravity device!"
+A_Space_Adventure-cosmos.desc="Hogera, the planet of hogs, is about to be hit by a gigantic meteorite. In this race for survival you have to lead a brave hedgehog, who was commissioned by the Planetary Association of the Hedgehogs (PAotH), on a space trip around the neighbor planets to collect all the 4 pieces of the long lost anti gravity device."
 A_Space_Adventure-moon01.name="Main Mission: The first stop"
-A_Space_Adventure-moon01.desc="Hog Solo has landed on the moon to refuel his saucer but professor Hogevil has gone there first and set an ambush! Rescue the captured PAotH researchers and drive Professor Hogevil away!"
+A_Space_Adventure-moon01.desc="Our hero has landed on the moon to refuel the flying saucer but Professor Hogevil has gone there first and set an ambush! Rescue the captured PAotH researchers and drive Professor Hogevil away!"
 A_Space_Adventure-moon02.name="Side Mission: Chasing the blue hog"
-A_Space_Adventure-moon02.desc="Hog Solo visits an hermit, old PAotH veteran, who lives on the moon in order to gather some intel about Prof. Hogevil. However, he has to beat the hermit, Soneek the Crazy Runner, in a chase game first!"
+A_Space_Adventure-moon02.desc="Our hero visits an hermit, old PAotH veteran, who lives on the moon in order to gather some intel about Prof. Hogevil. However, you have to beat the hermit, Crazy Runner, in a chase game first!"
 A_Space_Adventure-ice01.name="Main Mission: A frozen adventure"
-A_Space_Adventure-ice01.desc="Welcome to the planet of ice. Here, it's so cold that most of Hog Solo's weapons won't work. You have to get the lost part from the bandit leader Thanta using the weapons that you'll find there!"
+A_Space_Adventure-ice01.desc="Welcome to the planet of ice. Here, it's so cold that most weapons won't work. You have to get the lost part from the bandit leader Thanta using the weapons that you'll find there!"
 A_Space_Adventure-ice02.name="Side Mission: Hard flying"
-A_Space_Adventure-ice02.desc="Hog Solo couldn't just visit the Ice Planet without visiting the Olympic Stadium of Saucer Flying! In this mission you can prove your flying skills and claim your place among the best!"
+A_Space_Adventure-ice02.desc="Our hero couldn't just visit the Ice Planet without visiting the Olympic Stadium of Saucer Flying! In this mission you can prove your flying skills and claim your place among the best!"
 A_Space_Adventure-desert01.name="Main Mission: Searching in the dust"
-A_Space_Adventure-desert01.desc="You have landed to the planet of sand! Hog Solo has to find the missing part in the underground tunnels. Be careful as vicious smugglers await to attack and rob you!"
+A_Space_Adventure-desert01.desc="You have landed to the planet of sand! Our hero has to find the missing part in the underground tunnels. Be careful as vicious smugglers await to attack and rob you!"
 A_Space_Adventure-desert02.name="Side Mission: Running for survival"
-A_Space_Adventure-desert02.desc="Hog Solo was searching for the part in this tunnel when it unexpectedly start getting flooded! Get to the surface as soon as possible and be careful not to trigger a mine."
+A_Space_Adventure-desert02.desc="Our hero was searching for the part in this tunnel when it unexpectedly start getting flooded! Get to the surface as soon as possible and be careful not to trigger a mine."
 A_Space_Adventure-desert03.name="Side Mission: Precise flying"
-A_Space_Adventure-desert03.desc="Hog Solo has some time to fly his RC plane and have some fun. Fly the RC plane and hit all the targets!"
+A_Space_Adventure-desert03.desc="Our hero has some time to play with RC planes and have some fun. Fly the RC plane and hit all the targets!"
 A_Space_Adventure-fruit01.name="Main Mission: Bad timing"
-A_Space_Adventure-fruit01.desc="In the fruit planet things aren't going so well. Hogs aren't collecting fruits but they are preparing for battle. You'll have to choose if you'll fight or if you'll flee."
+A_Space_Adventure-fruit01.desc="On the fruit planet things aren't going so well. Hogs aren't collecting fruits but they are preparing for battle. You'll have to choose if you'll fight or if you'll flee."
 A_Space_Adventure-fruit02.name="Main Mission: Getting to the device"
-A_Space_Adventure-fruit02.desc="Hog Solo gets closer to the lost part on the Fruit Planet. Will Captain Lime help him acquire the part or not?"
+A_Space_Adventure-fruit02.desc="Our hero gets closer to the lost part on the Fruit Planet. Will Captain Lime help you acquire the part or not?"
 A_Space_Adventure-fruit03.name="Main Mission: Precise shooting"
-A_Space_Adventure-fruit03.desc="Hog Solo got lost and got ambushed by the Red Strawberries. Help him eliminate them and win some extra ammo for the mission “Getting to the device”."
+A_Space_Adventure-fruit03.desc="Our hero got lost and got ambushed by the Red Strawberries. Eliminate them and win some extra ammo for the mission “Getting to the device”."
 A_Space_Adventure-death01.name="Main Mission: The last encounter"
-A_Space_Adventure-death01.desc="On the Death Planet, the most infertile planet around, Hog Solo is very close to get the last part of the device! However, an unpleasant surprise awaits him ..."
+A_Space_Adventure-death01.desc="On the Death Planet, the most infertile planet around, our hero is very close to get the last part of the device! However, an unpleasant surprise awaits ..."
 A_Space_Adventure-death02.name="Side Mission: Killing the specialists"
-A_Space_Adventure-death02.desc="Again Hog Solo has got himself in a difficult situation. Help him defeat the “5 Deadly Hogs“ in their own game!"
+A_Space_Adventure-death02.desc="Again our hero has gotten in a difficult situation. Defeat the “5 Deadly Hogs“ in their own game!"
 A_Space_Adventure-final.name="Main Mission: The big bang"
-A_Space_Adventure-final.desc="Hog Solo has to detonate some explosives that have been placed on the meteorite. Help him complete his mission without getting hurt!"
+A_Space_Adventure-final.desc="Our hero has to detonate some explosives that have been placed on the meteorite. Complete this mission without getting hurt!"
--- a/share/hedgewars/Data/Locale/campaigns_gd.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/campaigns_gd.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -19,10 +19,10 @@
 A_Classic_Fairytale-dragon.desc="Feumaidh ar gaisgeach taobh thall an locha a ruigsinn. Rach ’nad mhaighstir air a’ ròpa agus seachnaich astasan an nàmhad."
 
 A_Classic_Fairytale-family.name="Misean 7: Tional an teaghlaich"
-A_Classic_Fairytale-family.desc="Feumaidh ar gaisgeach na tùsanaich a shàbhaladh a-rithist. Cuir às dha ghràineagan an nàmhad agus saor do chuideachd. Cleachd an stòras agad gu cùramach o nach eil pailteas dheth ann. Drilig tuill air san àite cheart gus teannadh dlùth air a’ bhana-phrionnsa."
+A_Classic_Fairytale-family.desc="Feumaidh ar gaisgeach na treubhan a shàbhaladh a-rithist. Cuir às dha ghràineagan an nàmhad agus saor do chuideachd. Cleachd an stòras agad gu cùramach o nach eil pailteas dheth ann. Drilig tuill air san àite cheart gus teannadh dlùth air a’ bhana-phrionnsa."
 
 A_Classic_Fairytale-queen.name="Misean 8: Guma fada beò a’ bhànrigh"
-A_Classic_Fairytale-queen.desc="Feumaidh na tùsanaich sabaid a-rithist. Feumaidh iad am brathadair a cheannsachadh agus a h-uile stòras a chaitheamh mus dèid an latha leotha. Cuiribh ruaig air an nàmhaid!"
+A_Classic_Fairytale-queen.desc="Feumaidh an treubh sabaid a-rithist. Feumaidh iad am brathadair a cheannsachadh agus a h-uile stòras a chaitheamh mus dèid an latha leotha. Cuiribh ruaig air an nàmhaid!"
 
 A_Classic_Fairytale-enemy.name="Misean 9: Nàmhaid mo nàmhad"
 A_Classic_Fairytale-enemy.desc="Abair car air an sgeulachd! Feumaidh Cuilean-Chulainn sabaid a dhèanamh air taobh nan… “canabailean” an aghaidh an nàmhad cumanta: Na cyborgaichean olca!"
@@ -32,30 +32,30 @@
 
 A_Space_Adventure.name="Dàna-thuras san fhànas"
 A_Space_Adventure-cosmos.name="Clàr-taice: Turas san fhànas"
-A_Space_Adventure-cosmos.desc="Tha meatoraid ana-mhòr gu bhith bualadh air an Ugh, planaid nan gràineag. Ach am mair sibh beò, feumaidh tu Spìceach, am paidhleat as fhearr aig Comann nan Gràineag a stiùireadh air triall an fhànais mu na planaidean am fagas gus na 4 pìosan aig uidheam an-iom-tharraing a chruinneachadh a chailleadh o chionn aimsir!"
+A_Space_Adventure-cosmos.desc="Tha meatoraid ana-mhòr gu bhith bualadh air an Ugh, planaid nan gràineag. Ach am mair sibh beò, feumaidh tu gaisgeach a chaidh fhastadh le Comann nan Gràineag (CnanG) a stiùireadh air triall an fhànais mu na planaidean am fagas gus na 4 pìosan aig uidheam an-iom-tharraing a chruinneachadh a chailleadh o chionn aimsir!"
 A_Space_Adventure-moon01.name="Prìomh-mhisean: A’ chiad stad"
-A_Space_Adventure-moon01.desc="Laigh Spìceach air a’ ghealach gus connadh fhaighinn dhan t-soitheach aige ach ràinig an t-Ollamh Olc an t-àite roimhe agus ri esan fàth-feitheamh! Sàbhail luchd-rannsachaidh CnanG agus cuir ruaig air an Ollamh Olc!"
+A_Space_Adventure-moon01.desc="Laigh ar gaisgeach air a’ ghealach gus connadh fhaighinn dhan t-soitheach aige ach ràinig an t-Ollamh Olc an t-àite roimhe agus ri esan fàth-feitheamh! Sàbhail luchd-rannsachaidh CnanG agus cuir ruaig air an Ollamh Olc!"
 A_Space_Adventure-moon02.name="Misean far-bhealaich: An toir air a’ ghràineag ghorm"
-A_Space_Adventure-moon02.desc="Tha Spìceach a’ tadhail air aonaran a tha ’na sheann-ghaisgeach CnanG ’s a’ fuireach air a’ ghealach gus fiosrachadh a chruinneachadh air dè tha an t-Ollamh Olc ris. Gidheadh, feumaidh e ruaig a chur air an aonaran, Dudar-Leum an ruithedair craicte, ann an rèis an toiseach!"
+A_Space_Adventure-moon02.desc="Tha ar gaisgeach a’ tadhal air aonaran a tha ’na sheann-ghaisgeach CnanG ’s a’ fuireach air a’ ghealach gus fiosrachadh a chruinneachadh air dè tha an t-Ollamh Olc ris. Gidheadh, feumaidh e ruaig a chur air an aonaran, an Ruithedair Craicte, ann an rèis an toiseach!"
 A_Space_Adventure-ice01.name="Prìomh-mhisean: Dàna-thuras reòite"
-A_Space_Adventure-ice01.desc="Fàilte gu planaid na deighe. Tha i cho fuar an-seo nach obraich a’ mhòrchuid a dh’airm aig Spìceach. Feumaidh tu a’ phàirt chaillte fhaighinn o Shanntach, ceannard nan slaightearan le taic nan arm a lorgas tu ann!"
+A_Space_Adventure-ice01.desc="Fàilte gu planaid na deighe. Tha i cho fuar an-seo nach obraich a’ mhòrchuid a dh’airm. Feumaidh tu a’ phàirt chaillte fhaighinn o Shanntach, ceannard nan slaightearan le taic nan arm a lorgas tu ann!"
 A_Space_Adventure-ice02.name="Misean far-bhealaich: Itealaich chruaidh"
-A_Space_Adventure-ice02.desc="Cha b’ fhiach gun tadhladh Spìceach air planaid na deighe gun tadhal air Stèideam Oilimpeach na h-Itealaich Soithich! Dearbh na sgilean sgiathaidh agad sa mhisean seo agus faigh d’ àite air clàr nan curaidh!"
+A_Space_Adventure-ice02.desc="Cha b’ fhiach gun tadhladh ar gaisgeach air planaid na deighe gun tadhal air Stèideam Oilimpeach na h-Itealaich Soithich! Dearbh na sgilean sgiathaidh agad sa mhisean seo agus faigh d’ àite air clàr nan curaidh!"
 A_Space_Adventure-desert01.name="Prìomh-mhisean: Lorg san duslach"
-A_Space_Adventure-desert01.desc="Laigh thu air planaid na gaineimh! Feumaidh Spìceach a’ phàirt a tha a dhìth a lorg sna tunailean fon talamh. Thoir an aire on a tha cùiltearan ri fàth-feitheamh ort!"
+A_Space_Adventure-desert01.desc="Laigh thu air planaid na gaineimh! Feumaidh ar gaisgeach a’ phàirt a tha a dhìth a lorg sna tunailean fon talamh. Thoir an aire on a tha cùiltearan ri fàth-feitheamh ort!"
 A_Space_Adventure-desert02.name="Misean far-bhealaich: Ruith gus mairsinn beò"
-A_Space_Adventure-desert02.desc="Bha Spìceach a’ sireadh a’ phàirt san tunail seo nuair a thàinig tuile air gu h-obann! Tarraing às dhan uachdar agus thoir an aire nach buail thu ri mèinn."
+A_Space_Adventure-desert02.desc="Bha ar gaisgeach a’ sireadh a’ phàirt san tunail seo nuair a thàinig tuile air gu h-obann! Tarraing às dhan uachdar agus thoir an aire nach buail thu ri mèinn."
 A_Space_Adventure-desert03.name="Misean far-bhealaich: Itealaich phongail"
-A_Space_Adventure-desert03.desc="Tha beagan ùine aig Spìceach airson beagan tlachd leis an itealan le smachd chèin aige. Stiùirich an t-itealan agus buail air na targaidean uile!"
+A_Space_Adventure-desert03.desc="Tha beagan ùine aig ar gaisgeach airson beagan tlachd le itealan le smachd chèin. Stiùirich an t-itealan agus buail air na targaidean uile!"
 A_Space_Adventure-fruit01.name="Prìomh-mhisean: Droch-àm"
 A_Space_Adventure-fruit01.desc="Chan eil cùisean mar bu chòir air planaid nam meas. Chan eil na gràineagan a’ buain nam measan ach ag ullachadh airson a’ bhlàir. Feumaich tu co-dhùnadh a dhèanamh an teich thu no an sabaid thu."
 A_Space_Adventure-fruit02.name="Prìomh-mhisean: A’ ruigsinn an uidheim"
-A_Space_Adventure-fruit02.desc="Tha Spìceach a’ teannadh air a’ phàirt chaillte air planaid nam meas. An cuidich Caiptean Liomaid e ach am faigh e i gus nach cuidich?"
+A_Space_Adventure-fruit02.desc="Tha ar gaisgeach a’ teannadh air a’ phàirt chaillte air planaid nam meas. An cuidich Caiptean Liomaid thu ach am faigh thu i gus nach cuidich?"
 A_Space_Adventure-fruit03.name="Prìomh-mhisean: Losgadh pongail"
-A_Space_Adventure-fruit03.desc="Chaidh Spìceach air seachran agus rinn na Sùbhan-làir Dearga fàth-feitheamh air. Cuidich e ach an cuir e às dhaibh gus am buannaich e connaidh airson an ath-mhisein “A’ ruigsinn an uidheim”."
+A_Space_Adventure-fruit03.desc="Chaidh ar gaisgeach air seachran agus rinn na Sùbhan-làir Dearga fàth-feitheamh air. Cuir às dhaibh agus buannaich connadh airson an ath-mhisein “A’ ruigsinn an uidheim”."
 A_Space_Adventure-death01.name="Prìomh-mhisean: An tachairt mu dheireadh"
-A_Space_Adventure-death01.desc="’S e a’ phlanaid as mì-thorraiche a th’ ann am planaid a’ chrìonadh agus tha Spìceach glè dhlùth air pàirt mu dheireadh an uidheam a lorg oirre! Gidheadh, tha forbhas mì-thaitneach roimhe…"
+A_Space_Adventure-death01.desc="’S e a’ phlanaid as mì-thorraiche a th’ ann am planaid a’ chrìonadh agus tha ar gaisgeach glè dhlùth air pàirt mu dheireadh an uidheam a lorg oirre! Gidheadh, tha forbhas mì-thaitneach roimhe…"
 A_Space_Adventure-death02.name="Misean far-bhealaich: A’ marbhadh nan eòlaichean"
-A_Space_Adventure-death02.desc="Tha Spìceach ann an droch-staing a-rithist. Feuch an dèan a e’ chùis air na “5 gràineagan marbhtach”!"
+A_Space_Adventure-death02.desc="Tha ar gaisgeach ann an droch-staing a-rithist. Cuir ruaig air na “5 gràineagan marbhtach”!"
 A_Space_Adventure-final.name="Prìomh-mhisean: Am brag mòr"
-A_Space_Adventure-final.desc="Feumaidh Spìceach stuthan-spreadhaidh a chaidh a chur air a’ mheatoraid a spreadhadh. Cuir taic dha ach an coilean e am misean aige gun leòn air!"
\ No newline at end of file
+A_Space_Adventure-final.desc="Feumaidh ar gaisgeach stuthan-spreadhaidh a chaidh a chur air a’ mheatoraid a spreadhadh. Coilean am misean seo gun leòn ort!"
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Locale/campaigns_zh_TW.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,61 @@
+A_Classic_Fairytale.name="經典故事"
+
+A_Classic_Fairytale-first_blood.name="任務 1: 第一滴血"
+A_Classic_Fairytale-first_blood.desc="幫助Leaks A Lot完成他的訓練,成為一位合格的刺猬戰士。你將接受繩索,降落傘,昇龍拳和沙漠之鷹的訓練。"
+
+A_Classic_Fairytale-shadow.name="任務 2: 黑暗降臨"
+A_Classic_Fairytale-shadow.desc="Leaks a Lot和Dense Cloud要去打獵。準備迎接等待在森林中的危險。請記住,明智地做出你的選擇。"
+
+A_Classic_Fairytale-journey.name="任務 3: 歸途"
+A_Classic_Fairytale-journey.desc="Leaks a Lot必須去島的另一邊。要快且小心。"
+
+A_Classic_Fairytale-united.name="任務 4: 團結則存"
+A_Classic_Fairytale-united.desc="經過長途跋涉Leaks a Lot最終回到了村莊。然而,沒有時間休息了。你必須在食人族的肆虐下保衛村莊。"
+
+A_Classic_Fairytale-backstab.name="任務 5: 暗算"
+A_Classic_Fairytale-backstab.desc="可怕的食人族正在尋找Leaks a Lot和他的朋友們。再次擊敗他們並保護你的盟友。使用你的資源來打敗進入的敵軍!"
+
+A_Classic_Fairytale-dragon.name="任務 6: 龍之巢"
+A_Classic_Fairytale-dragon.desc="我們的英雄必須到達湖的另一邊。成為繩索大師,並且避免被敵人擊中。"
+
+A_Classic_Fairytale-family.name="任務 7: 家人團聚"
+A_Classic_Fairytale-family.desc="我們的英雄必須再次拯救部落。消滅敵方的刺蝟並釋放你的戰友。由於資源有限,請謹慎使用。在正確的位置鑽一些洞並靠近公主。"
+
+A_Classic_Fairytale-queen.name="任務 8: 女王萬歲"
+A_Classic_Fairytale-queen.desc="部落必須再次戰鬥。為了獲勝,他們必須與叛徒戰鬥並使用所有可用資源擊敗敵人!"
+
+A_Classic_Fairytale-enemy.name="任務 9: 敵人的敵人"
+A_Classic_Fairytale-enemy.desc="真是太棒了!Leaks a Lot必須與“食人族”並肩作戰對抗共同的敵人:邪惡的改造人!"
+
+A_Classic_Fairytale-epil.name="任務 10: 尾聲"
+A_Classic_Fairytale-epil.desc="恭喜!Leaks a Lot終於可以平靜地離開,並得到他的新朋友和部落的讚揚。為你的成功感到自豪!你可以重玩以前的任務,並查看其他可能的結局。"
+
+A_Space_Adventure.name="太空探險"
+A_Space_Adventure-cosmos.name="選單: 太空旅行"
+A_Space_Adventure-cosmos.desc="刺蝟的星球,Hogera,即將被巨大的隕石撞擊。在這場生存的競賽中,你必須帶領被刺猬行星協會(PAotH)所委託的一隻勇敢刺猬,在鄰近的行星周圍進行太空旅行,以收集反重力裝置長期丟失的4個構件。"
+A_Space_Adventure-moon01.name="主任務: 第一站"
+A_Space_Adventure-moon01.desc="為了替飛碟加油,我們的英雄降落在月球上,但Hogevil教授已經先去了那裡埋伏!拯救被抓的PAotH研究人員並驅趕Hogevil教授!"
+A_Space_Adventure-moon02.name="旁枝任務: 追逐藍色刺蝟"
+A_Space_Adventure-moon02.desc="為了收集Hogevil教授的情報,我們的英雄拜訪了一位隱居在月球上PAotH的老退伍軍人,Crazy Runner。但是,要獲得情報,你必須先在追逐戰中擊敗他!"
+A_Space_Adventure-ice01.name="主任務: 一場冰凍冒險"
+A_Space_Adventure-ice01.desc="歡迎來到冰之行星。這裡太冷了,使得大多數武器都不能使用。你必須使用在那裡找到的武器從強盜首領Thanta手中得到丟失的構件!"
+A_Space_Adventure-ice02.name="旁枝任務: 艱難的飛行"
+A_Space_Adventure-ice02.desc="來到冰之行星,我們的英雄不能沒有來過飛碟的奧林匹克競賽場!在這個任務中,你可以證明你的飛行技術,並宣稱你是最棒的!"
+A_Space_Adventure-desert01.name="主任務: 在塵土中尋找"
+A_Space_Adventure-desert01.desc="你已經降落到沙之行星!我們的英雄必須在地下隧道中找到丟失的構件。請小心,惡毒的走私者正等待著你!"
+A_Space_Adventure-desert02.name="旁枝任務: 為生存而奔跑"
+A_Space_Adventure-desert02.desc="我們的英雄正在隧道中尋找時,意外地開始被淹水!盡快回到地表,要小心不要觸動地雷。"
+A_Space_Adventure-desert03.name="旁枝任務: 精確飛行"
+A_Space_Adventure-desert03.desc="我們的英雄有一些時間開心地的玩遙控飛機。操控遙控飛機,擊中所有目標!"
+A_Space_Adventure-fruit01.name="主任務: 糟糕的時機"
+A_Space_Adventure-fruit01.desc="在水果行星上,事情並不順利。刺蝟們不採集水果,而是正在為戰鬥做準備。你必須選擇要打架或者逃跑。"
+A_Space_Adventure-fruit02.name="主任務: 到達裝置"
+A_Space_Adventure-fruit02.desc="在水果行星上,我們的英雄靠近了丟失的構件。Lime船長會幫助你獲得這個構件嗎?"
+A_Space_Adventure-fruit03.name="主任務: 精確射擊"
+A_Space_Adventure-fruit03.desc="我們的英雄迷路了,並被紅色草莓伏擊了。消滅它們並為“到達裝置”任務贏得一些額外的彈藥。"
+A_Space_Adventure-death01.name="主任務: 最後的遭遇戰"
+A_Space_Adventure-death01.desc="死亡行星,周圍最貧瘠的行星,我們的英雄非常接近裝置的最後一構件!然而,不愉快的驚喜等待著..."
+A_Space_Adventure-death02.name="旁枝任務: 殺死專家"
+A_Space_Adventure-death02.desc="我們的英雄再次陷入困境。擊敗“5隻致命的刺蝟”!"
+A_Space_Adventure-final.name="主任務: 大爆炸"
+A_Space_Adventure-final.desc="我們的英雄必須引爆一些放在隕石上的爆炸物。不要受傷完成這項任務!"
--- a/share/hedgewars/Data/Locale/cs.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/cs.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -26,7 +26,6 @@
 --      ["Above-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Accuracy Bonus! +15 points"] = "", -- Space_Invasion
 --      ["Accuracy bonus: +%d points"] = "", -- Basic_Training_-_Sniper_Rifle
---      ["Ace"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge
 --      ["Achievement gotten: %s"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_That_Sinking_Feeling, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, Basic_Training_-_Rope, Tumbler
 --      ["A Classic Fairytale"] = "", -- A_Classic_Fairytale:first_blood
 --      ["A crate critical to this mission has been destroyed."] = "", -- SimpleMission
@@ -45,7 +44,6 @@
 --      ["After you left the moon, my other loyal minions came and resurrected me so I could complete my master plan."] = "", -- A_Space_Adventure:death01
 --      ["Again with the 'cannibals' thing!"] = "", -- A_Classic_Fairytale:enemy
 --      ["A Hedgewars minigame"] = "", -- Capture_the_Flag
-      ["a Hedgewars mini-game"] = "Hedgewars mini-hra", -- Space_Invasion, The_Specialists
 --      ["A Hedgewars mini-game"] = "", -- Racer, Space_Invasion, TechRacer, Tumbler
 --      ["A Hedgewars tag game"] = "", -- Mutant
 --      ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome
@@ -141,13 +139,14 @@
 --      ["As you've seen, the dropped grenade roughly fell into your flying direction."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Athlete"] = "", -- Battalion
 --      ["Attack: Activate"] = "", -- Racer
---      ["Attack Captain Lime before he attacks back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack Captain Lime before he attacks back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack From Rope: %s"] = "", -- WxW
 --      ["Attack From Rope: You may only attack from a rope."] = "", -- WxW
 --      ["Attack rule: %s"] = "", -- WxW
 --      ["Attack: Select this continent"] = "", -- Continental_supplies
 --      ["Attack: [Space]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
---      ["Attack the assassins before they attack back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack: Tap the [Bomb]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
+--      ["Attack the assassins before they attack back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack: Throw ball"] = "", -- Knockball
 --      ["At the end of the game your health was %d."] = "", -- A_Space_Adventure:ice01
 --      ["At the start of the game each enemy hog has only the weapon that he is named after."] = "", -- A_Space_Adventure:death02
@@ -155,16 +154,18 @@
 --      ["Available weapon specials:"] = "", -- Continental_supplies
 --      ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion
---      ["Avoid the mines!"] = "", -- Basic_Training_-_Rope
 --      ["Axes"] = "", -- Bazooka_Battlefield
 --      ["Aye! Fellow! Let me exit this chamber of doom!"] = "", -- A_Classic_Fairytale:epil
 --      ["Back Breaker"] = "", -- A_Classic_Fairytale:backstab
 --      ["Back in the village, after telling the villagers about the threat..."] = "", -- A_Classic_Fairytale:united
 --      ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil
 --      ["Back Jump: [Backspace] ×2"] = "", -- Basic_Training_-_Movement
+--      ["Back Jump: Double-tap the [Curvy Arrow]"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (1/2)"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (2/2)"] = "", -- Basic_Training_-_Movement
 --      ["Backstab"] = "", -- A_Classic_Fairytale:backstab
+--      ["Backwards jump: Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Backwards jump: Tap the [Curvy Arrow] twice"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Bacon"] = "", -- 
 --      ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Badmad"] = "", -- portal
@@ -197,7 +198,6 @@
 --      ["Bazooka Battlefield"] = "", -- Bazooka_Battlefield
 --      ["Bazooka Master"] = "", -- Basic_Training_-_Bazooka
 --      ["Bazookas are influenced by wind."] = "", -- Basic_Training_-_Bazooka
---      ["Bazooka Team"] = "", -- Basic_Training_-_Bazooka
       ["Bazooka Training"] = "Trénink s bazukou",
 --      ["Bearded Beast"] = "", -- 
 --      ["Be careful, the future of Hogera is in your hands!"] = "", -- A_Space_Adventure:cosmos
@@ -231,7 +231,6 @@
 --      ["Bloodpie"] = "", -- A_Classic_Fairytale:backstab
 --      ["Bloodrocutor"] = "", -- A_Classic_Fairytale:shadow
 --      ["Bloodsucker"] = "", -- A_Classic_Fairytale:shadow
-      ["Bloody Rookies"] = "Zatravení zelenáči", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 --      ["Blue"] = "", -- 
 --      ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Bob"] = "", -- A_Space_Adventure:cosmos
@@ -314,7 +313,9 @@
 --      ["Challenge objectives"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit03, A_Space_Adventure:moon02
 --      ["Challenge over!"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa, ClimbHome
+--      ["Change bounciness: Tap [B]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Content: [Left], [Right]"] = "", -- HedgeEditor
+--      ["Change detonation timer: Tap the [Clock]"] = "", -- Basic_Training_-_Grenade, A_Classic_Fairytale:shadow
 --      ["Change direction: [Left]/[Right]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Change Health: [Left], [Right]"] = "", -- HedgeEditor
@@ -334,6 +335,8 @@
 --      ["Chicken"] = "", -- 
 --      ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01
 --      ["Chikorita"] = "", -- 
+--      ["Choose location: Left click"] = "", -- A_Classic_Fairytale:shadow
+--      ["Choose location: Tap the [Target] button, then tap on the spot you want to choose"] = "", -- A_Classic_Fairytale:shadow
 --      ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Choose your continent wisely, as your decision will be permanent."] = "", -- Continental_supplies
 --      ["Choose your side! If you want to join the strange man, walk up to him.|Otherwise, walk away from him. If you decide to att...nevermind..."] = "", -- A_Classic_Fairytale:shadow
@@ -342,7 +345,6 @@
 --      ["Cleaver"] = "", -- Construction_Mode
 --      ["Cleaver Placement Mode"] = "", -- Construction_Mode
 --      ["CLEAVER PLACEMENT MODE"] = "", -- HedgeEditor
---      ["Climber"] = "", -- ClimbHome
 --      ["Climb Home"] = "", -- ClimbHome
 --      ["Closing in"] = "", -- A_Classic_Fairytale:queen
 --      ["Clown"] = "", -- HedgeEditor
@@ -352,11 +354,13 @@
 --      ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb
 --      ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey
 --      ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey
+--      ["- Collect all the blue crates"] = "", -- HedgeEditor
 --      ["Collect all the crates, but remember, our time in this life is limited!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect or destroy all the health crates."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Collect or destroy the final crate to finish the training."] = "", -- Basic_Training_-_Flying_Saucer
+--      ["- Collect the blue crate"] = "", -- HedgeEditor
 --      ["Collect the crate and attack!"] = "", -- WxW
---      ["Collect the crate on the right.|Hint: Select the rope, [Up] or [Down] to aim, [Space] to fire, directional keys to move.|Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Collect the crate on the right."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the crates within the time limit!|If you fail, you'll have to try again."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the first crate to begin!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Collect the freezer and get the device part from Thanta."] = "", -- A_Space_Adventure:ice01
@@ -424,7 +428,6 @@
 --      ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates per turn: %d"] = "", -- WxW
---      ["crate(s)"] = "", -- SpeedShoppa
 --      ["Crazy Gravity: Gravity randomly changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity
 --      ["Crazy Runner"] = "", -- A_Space_Adventure:moon02
 --      ["Cricket Time"] = "", -- Continental_supplies
@@ -457,11 +460,10 @@
 --      ["Deals 15 damage to all enemies in the circle."] = "", -- Continental_supplies
 --      ["Deer"] = "", -- 
 --      ["Defeat all enemies!"] = "", -- portal
+--      ["Defeat!"] = "", -- HedgeEditor
 --      ["Defeat Professor Hogevil!"] = "", -- A_Space_Adventure:death01
---      ["Defeat the cannibals"] = "", -- A_Classic_Fairytale:backstab
---      ["Defeat the cannibals!|"] = "", -- A_Classic_Fairytale:united
+--      ["Defeat the cannibals!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cannibals!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Defeat the cannibals!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cyborgs!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen
 --      ["Delete Waypoint"] = "", -- HedgeEditor
@@ -482,11 +484,11 @@
 --      ["Destroyer of planes"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Destroy him, Leaks A Lot! He is responsible for the deaths of many of us!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion
+--      ["- Destroy the enemy"] = "", -- HedgeEditor
+--      ["- Destroy the red target"] = "", -- HedgeEditor
+--      ["- Destroy the red targets"] = "", -- HedgeEditor
 --      ["Destroy the targets!"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
---      ["Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
---      ["Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"] = "", -- A_Classic_Fairytale:first_blood
 --      ["+%d flamer fuel!"] = "", -- Tumbler
---      ["%d Hapless Hogs left"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["+%d health"] = "", -- Mutant
 --      ["%d-Hit Combo! +%d points!"] = "", -- Space_Invasion
 --      ["Did anyone follow you?"] = "", -- A_Classic_Fairytale:united
@@ -507,7 +509,6 @@
 --      ["Disguise as a Rockhopper Penguin"] = "", -- Continental_supplies
 --      ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies
 --      ["Displacer"] = "", -- 
---      ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Diver"] = "", -- User_Mission_-_Diver
 --      ["%d ms"] = "", -- HedgeEditor
 --      ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen
@@ -594,10 +595,8 @@
 --      ["Elderbot"] = "", -- A_Classic_Fairytale:family
 --      ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape
       ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Znič všechny cíle, než ti vyprší čas.|Na tuto misi máš neomezeně munice.", --Bazooka, Shotgun, SniperRifle
---      ["Eliminate the Blue Team before the time runs out."] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Eliminate the enemy before the time runs out."] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 --      ["Eliminate the enemy hogs to win."] = "",
-      ["Eliminate the enemy specialists."] = "Zabij nepřátelské specialisty",
 --      ["Eliminate the enemy."] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh
 --      ["Eliminate Unit 3378."] = "", -- User_Mission_-_Teamwork
 --      ["Eliminate WatchBot 4000."] = "", -- User_Mission_-_Teamwork_2
@@ -622,13 +621,14 @@
 --      ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab
 --      ["Except me, of course! I just saved a whole planet!"] = "", -- A_Space_Adventure:final
 --      ["Experienced beginner"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Explore the tunnel with the other hedgehogs and search for the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Explore the tunnel with the other hedgehogs and search for the device."] = "", -- A_Space_Adventure:fruit02
 --      ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02
 --      ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey
 --      ["Fair Wind"] = "", -- 
 --      ["Fall Damage"] = "", -- Basic_Training_-_Movement
 --      ["Fallen Angel"] = "", -- Tentacle_Terror
 --      ["Family Reunion"] = "", -- A_Classic_Fairytale:family
+--      ["Fastest escape: %d turns"] = "", -- A_Space_Adventure:desert02
 --      ["Fastest lap: %.3fs by %s"] = "", -- TrophyRace
       ["Fastest lap: "] = "Nejrychlejší kolo: ",
       ["Feeble Resistance"] = "Slabý odpor",
@@ -648,11 +648,12 @@
 --      ["Final result"] = "", -- Mutant
 --      ["Final Targets"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
 --      ["Final team scores:"] = "", -- Space_Invasion
+--      ["Find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Find a way to detonate all the explosives and stay alive!"] = "", -- A_Space_Adventure:final
 --      ["Find your tribe!|Cross the lake!"] = "", -- A_Classic_Fairytale:dragon
 --      ["Finish this challenge as fast as possible to earn bonus points."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Finish waypoint placement"] = "", -- Racer
---      ["Finish your training|Hint: Animations can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Finish your training."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Finite Ropes"] = "", -- Basic_Training_-_Rope
 --      ["Fire a rocket with napalm."] = "", -- Continental_supplies
 --      ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler
@@ -680,6 +681,7 @@
 --      ["Flying Saucer Training"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Fly into space to fight off the invaders with barrels!"] = "", -- Space_Invasion
 --      ["Fly to the meteorite and detonate the explosives"] = "", -- A_Space_Adventure:cosmos
+--      ["Follow the path and destroy the next target."] = "", -- Basic_Training_-_Rope
 --      ["Forgetfulness: You will lose all your weapons each turn."] = "", -- Continental_supplies
 --      ["For the next crate, you have to do back jumps."] = "", -- Basic_Training_-_Movement
 --      ["Four Eyes"] = "", -- 
@@ -699,8 +701,6 @@
 --      ["“g=150”, where 150 is 150% of normal gravity."] = "", -- Gravity
 --      ["“g=50, g2=150, period=4000” for gravity changing|from 50 to 150 and back with period of 4000 ms."] = "", -- Gravity
 --      ["Galaxy Guardians"] = "", -- Big_Armory
-      ["Game Modifiers: "] = "Herní modifikátory: ",
-      ["GAME OVER!"] = "KONEC HRY!",
 --      ["Game over!"] = "", -- Space_Invasion
       ["Game Started!"] = "Hra začala!",
 --      ["Game? Was this a game to you?!"] = "", -- A_Classic_Fairytale:enemy
@@ -710,8 +710,6 @@
 --      ["Gasp! A smuggler!"] = "", -- A_Space_Adventure:desert01
 --      ["Gasp!"] = "", -- A_Space_Adventure:desert01
 --      ["Gathering fruits all day long."] = "", -- A_Classic_Fairytale:queen
---      ["Gear information hidden"] = "", -- HedgeEditor
---      ["Gear information shown"] = "", -- HedgeEditor
 --      ["Gear Placement Tool"] = "", -- HedgeEditor
 --      ["General information"] = "", -- Continental_supplies
 --      ["General information:"] = "", -- Continental_supplies
@@ -721,7 +719,7 @@
 --      ["Get Dense Cloud out of the pit!"] = "", -- A_Classic_Fairytale:journey
 --      ["Get him, Spike!"] = "", -- A_Space_Adventure:desert01
       ["Get on over there and take him out!"] = "Běž tamhle a dostaň ho!",
---      ["Get on the head of the mole"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Get on the head of the mole."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Get past the flower."] = "", -- A_Classic_Fairytale:journey
 --      ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01
 --      ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood
@@ -759,7 +757,6 @@
       ["GO! GO! GO!"] = "Běž! Běž! Běž!",
       ["Good birdy......"] = "Hodný ptáček......",
 --      ["Good bye!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Good Dude"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Good idea, they'll never find us there!"] = "", -- A_Classic_Fairytale:united
 --      ["Good job!"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Good job! Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -770,7 +767,7 @@
 --      ["Good so far!"] = "",
 --      ["Good to go!"] = "",
 --      ["Good! You now control Cappy."] = "", -- Basic_Training_-_Movement
---      ["Go on top of the flower"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Go on top of the flower."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Go, quick!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Gorkij"] = "", -- A_Classic_Fairytale:journey
 --      ["Go surf!"] = "", -- WxW
@@ -793,7 +790,6 @@
 --      ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow
 --      ["Green"] = "", -- 
 --      ["Green Bananas"] = "", -- A_Space_Adventure:fruit01
---      ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Green double rings also give you a new flying saucer."] = "", -- A_Space_Adventure:ice02
 --      ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01
 --      ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01
@@ -803,11 +799,8 @@
 --      ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Greetings from the Navy, %s (%s), for being a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["Greetings, %s!"] = "", -- A_Classic_Fairytale:dragon
---      ["Greg"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
---      ["Grenade Group"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard
 --      ["Grenades explode after 1 to 5 seconds (you decide)."] = "", -- Basic_Training_-_Grenade
 --      ["Grenades with high bounciness bounce a lot and behave chaotic."] = "", -- Basic_Training_-_Grenade
---      ["Grenade Team"] = "", -- Basic_Training_-_Grenade
 --      ["Grenade Training"] = "", -- Basic_Training_-_Grenade
 --      ["Grenadiers"] = "", -- Basic_Training_-_Grenade
 --      ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor
@@ -848,7 +841,6 @@
 --      ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion
 --      ["Health Modification Mode"] = "", -- HedgeEditor
 --      ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor
---      ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
 --      ["Heavenly Defense"] = "", -- Tentacle_Terror
 --      ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united
       ["Heavy"] = "Těžký",
@@ -861,6 +853,7 @@
 --      ["Hedgehog Projectile"] = "", -- Continental_supplies
 --      ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies
 --      ["Hedgehogs can not be deleted."] = "", -- HedgeEditor
+--      ["Hedgehogs left: %d"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Hedgehogs will be revived after their death."] = "", -- Mutant
 --      ["Hedgehogs will start in the first waypoint."] = "", -- Racer
 --      ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab
@@ -876,7 +869,6 @@
 --      ["Help Enabled"] = "", -- HedgeEditor
 --      ["Helpers: Each team starts with %d helper points"] = "", -- Battalion
 --      ["Helpers: Hogs will get 1 out of 2 helpers randomly each turn"] = "", -- Battalion
---      ["Help Hog Solo to find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Help me, Leaks!"] = "", -- A_Classic_Fairytale:journey
 --      ["Help me, please!!!"] = "", -- A_Classic_Fairytale:journey
 --      ["Help me, please!"] = "", -- A_Classic_Fairytale:journey
@@ -891,20 +883,20 @@
 --      ["Here you will find the current mission instructions."] = "", -- Basic_Training_-_Movement
 --      ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Heroic Wind"] = "", -- Continental_supplies
---      ["Hero Team"] = "", -- User_Mission_-_The_Great_Escape
 --      ["He's so brave..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["He was the lab assistant of Dr. Goodhogan, the inventor of the anti-gravity device."] = "", -- A_Space_Adventure:moon02
 --      ["He won't be selling us out anymore!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey, don't forget us! We still need to climb up!"] = "", -- A_Classic_Fairytale:family
 --      ["Hey, guys!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey guys!"] = "", -- A_Classic_Fairytale:united
---      ["Hey, Hog Solo! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey! I was supposed to collect it!"] = "", -- A_Space_Adventure:fruit02
+--      ["Hey, %s! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey, %s! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey
 --      ["Hidden"] = "", -- portal
 --      ["High Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["High Jump: [Backspace]"] = "", -- Basic_Training_-_Movement
+--      ["High Jump: Tap the [Curvy Arrow] shortly"] = "", -- Basic_Training_-_Movement
 --      ["--- Highland ---"] = "", -- Battalion
 --      ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander
 --      ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion
@@ -915,20 +907,24 @@
 --      ["Hill Guard"] = "", -- Bazooka_Battlefield
 --      ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01
 --      ["--- Hint ---"] = "", -- Battalion
---      ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
 --      ["Hint: Drilling holes should solve everything."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: Hold down [M] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: If this mission panel disappears, you can|see it again by hitting the Pause or Quit key."] = "", -- Basic_Training_-_Movement
 --      ["Hint: It might be a good idea to place a girder before starting to drill. Just saying."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: It might be easier if you vary the angle only slightly."] = "", -- Basic_Training_-_Bazooka
+--      ["Hint: Just select the parachute, it opens automatically when you fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion
 --      ["Hint: Launch the bazooka horizontally at full power."] = "", -- Basic_Training_-_Bazooka
---      ["Hint: Press [Esc] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Pause the game to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Select the blow torch, aim and press [Fire]. Press [Fire] again to stop."] = "", -- A_Classic_Fairytale:journey
 --      ["Hint: Select the low gravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey
+--      ["Hint: Select the rope, [Up] or [Down] to aim, [Attack] to fire, directional keys to move."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Select the Shoryuken and hit [Attack].|P.S.: You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: %s needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family
 --      ["Hint: The rope only bends around objects.|When it doesn't hit anything, it's always straight."] = "", -- Basic_Training_-_Rope
 --      ["Hint: To jump higher, wait a bit before you hit “High Jump” a second time."] = "", -- Basic_Training_-_Movement
+--      ["Hint: To place a girder, select it,|then use [Left] and [Right] to select angle and length,|then choose a location for the girder."] = "", -- A_Classic_Fairytale:shadow
 --      ["Hint: Use the quit key to see the team’s continent."] = "", -- Continental_supplies
 --      ["Hint: When you shorten the rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope
 --      ["Hint: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey
@@ -962,24 +958,11 @@
 --      ["Hogminator"] = "", -- A_Classic_Fairytale:family
 --      ["Hog nueve"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog octo"] = "", -- A_Space_Adventure:fruit03
---      ["Hogonauts"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Hog onze"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog Saturn"] = "", -- A_Space_Adventure:fruit03
 --      ["Hogs in sight!"] = "", -- Continental_supplies
 --      ["Hog Solo and GB"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hog Solo"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01, A_Space_Adventure:moon02
---      ["Hog Solo couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo escaped successfully!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo has to reach the last crates"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo has to refuel his saucer."] = "", -- A_Space_Adventure:moon01
---      ["Hog Solo lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
---      ["Hog Solo wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["- Hogs will be revived"] = "", -- Capture_the_Flag
 --      ["- Hogs will drop the flag when killed"] = "", -- Capture_the_Flag
 --      ["Hog two"] = "", -- A_Space_Adventure:fruit03
@@ -989,9 +972,7 @@
 --      ["Homing Bee"] = "", -- Construction_Mode
 --      ["Honda"] = "", -- 
 --      ["Honest Lee"] = "", -- A_Classic_Fairytale:enemy
---      ["Hook"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
 --      ["Hooks"] = "", -- 
-      ["Hooray!"] = "Hurá!",
 --      ["Hooray! I actually did it! Hogera is safe!"] = "", -- A_Space_Adventure:final
 --      ["Hooray! I've found it, now I have to get back to Captain Lime!"] = "", -- A_Space_Adventure:fruit02
 --      ["Hooray! You are a champion!"] = "", -- A_Space_Adventure:ice02
@@ -1007,7 +988,7 @@
 --      ["However, if you fail to do so, she dies a most violent death, just like your friend! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, if you fail to do so, she dies a most violent death! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, my mates don't agree with me on letting you go..."] = "", -- A_Classic_Fairytale:dragon
---      ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
+--      ["However, the army of %s is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
 --      ["How to Rope"] = "", -- Basic_Training_-_Rope
 --      ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen
 --      ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen
@@ -1027,7 +1008,6 @@
 --      ["I can't believe what I'm hearing!"] = "", -- A_Classic_Fairytale:backstab
 --      ["I can't let you go further because …"] = "", -- A_Classic_Fairytale:queen
 --      ["I can't wait any more, I have to save myself!"] = "", -- A_Classic_Fairytale:shadow
---      ["Ice"] = "", -- Basic_Training_-_Movement
 --      ["Ice Jake"] = "", -- A_Space_Adventure:ice01
 --      ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family
 --      ["Icy Girder: [3]"] = "", -- HedgeEditor
@@ -1085,7 +1065,6 @@
 --      ["I just found out that they have captured your princess!"] = "", -- A_Classic_Fairytale:family
 --      ["I just want the strange device you found!"] = "", -- A_Space_Adventure:ice01
 --      ["I just wonder where Ramon and Spiky disappeared..."] = "", -- A_Classic_Fairytale:journey
---      ["Ikeda"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["I know and I'm terribly sorry!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know, my hero!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know that your resources are low due to the battle but I'll send two of my best hogs to assist you."] = "", -- A_Space_Adventure:fruit02
@@ -1113,6 +1092,7 @@
 --      ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen
 --      ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united
 --      ["IMPORTANT: To see the mission panel again, hold the mission panel key."] = "", -- Basic_Training_-_Movement
+--      ["IMPORTANT: To see the mission panel again, pause the game."] = "", -- Basic_Training_-_Movement
 --      ["Impressive...you are still dry as the corpse of a hawk after a week in the desert..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["%i ms"] = "", -- Gravity
 --      ["I'm so glad this is finally over!"] = "", -- A_Space_Adventure:final
@@ -1271,7 +1251,6 @@
 --      ["Kill the traitor, %s, or spare his life!"] = "", -- A_Classic_Fairytale:backstab
 --      ["--- King ---"] = "", -- Battalion
 --      ["King"] = "", -- Battalion
---      ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing
 --      ["--- King Mode ---"] = "", -- Battalion
 --      ["Knight"] = "", -- Battalion
 --      ["Knives"] = "", -- 
@@ -1290,7 +1269,7 @@
 --      ["Launch some bazookas to destroy the targets!"] = "", -- Basic_Training_-_Bazooka
 --      ["Leader"] = "", -- A_Classic_Fairytale:enemy
 --      ["Leaderbot"] = "", -- A_Classic_Fairytale:queen
---      ["Lead the Green Bananas to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
+--      ["Lead your allies to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
 --      ["Leaks A Lot"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Leaks A Lot, depressed for killing his loved one, failed to save the village..."] = "", -- A_Classic_Fairytale:journey
 --      ["Leaks A Lot gave his life for his tribe! He should have survived!"] = "", -- A_Classic_Fairytale:first_blood
@@ -1305,7 +1284,6 @@
 --      ["Left/right: Choose crate contents"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode
---      ["Left Tong"] = "", -- Bazooka_Battlefield
 --      ["Legs"] = "", -- 
 --      ["Less tools, more fun"] = "", -- Battalion
 --      ["Lestat"] = "", -- portal
@@ -1334,18 +1312,19 @@
 --      ["Lively Lifeguard"] = "",
 --      ["Lonely Cries"] = "", -- Continental_supplies
 --      ["Lonely Cries: [Rise the water if no hog is in the circle and deal 6 damage to all enemy hogs.]"] = "", -- Continental_supplies
---      ["Lonely Hog"] = "", -- ClimbHome
 --      ["Long Jump: [Enter]"] = "", -- Basic_Training_-_Movement
+--      ["Long Jump: Tap the [Curvy Arrow] button for long"] = "", -- Basic_Training_-_Movement, A_Classic_Fairytale:first_blood
 --      ["Long Live The Queen"] = "", -- A_Classic_Fairytale:queen
 --      ["Look around: [Mouse movement]"] = "", -- Basic_Training_-_Movement
+--      ["Look around: [Tap or swipe on the screen]"] = "", -- Basic_Training_-_Movement
 --      ["Look, boss! There is the target!"] = "", -- A_Space_Adventure:moon01
 --      ["Look, I had no choice!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! There's more of them!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! We're surrounded by cannibals!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Looks like the whole world is falling apart!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Look to the left and do a backwards jump towards the mushroom."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Loon"] = "", -- The_Specialists
 --      ["Loopy"] = "", -- 
---      ["Lord Evil"] = "", -- Tentacle_Terror
 --      ["Losing Condition: Destroy"] = "", -- HedgeEditor
 --      ["Low Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander
@@ -1365,7 +1344,6 @@
 --      ["Mario"] = "", -- 
 --      ["Mark gears for win/lose conditions"] = "", -- HedgeEditor
 --      ["Mark/unmark gear: [Left Click]"] = "", -- HedgeEditor
---      ["Mark"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
 --      ["- Massive weapon bonus on first turn"] = "", -- Continental_supplies
 --      ["Max Citrus"] = "", -- A_Space_Adventure:fruit01
 --      ["Maybe you should try an easier map next time."] = "", -- Racer
@@ -1380,7 +1358,6 @@
 --      ["Mega kill!"] = "", -- Mutant
 --      ["Meiwes"] = "", -- A_Classic_Fairytale:backstab
 --      ["mikade"] = "", -- 
---      ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer
 --      ["Mindy"] = "", -- A_Classic_Fairytale:united
 --      ["Mine Deployer"] = "",
 --      ["Mine Placement Mode"] = "", -- Construction_Mode
@@ -1399,12 +1376,12 @@
 --      ["Minion"] = "", -- A_Space_Adventure:moon01
 --      ["Minions"] = "", -- A_Space_Adventure:moon01
 --      ["Mission failed!"] = "", -- Big_Armory
-      ["MISSION FAILED"] = "MISE NEÚSPĚŠNÁ", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Mission failure in %d s"] = "", -- Big_Armory
+--      ["Mission"] = "", -- HedgeEditor
 --      ["Mission lost!"] = "", -- Basic_Training_-_Grenade
 --      ["Mission Panel"] = "", -- Basic_Training_-_Movement
 --      ["Mission panel: [M]"] = "", -- Basic_Training_-_Movement
-      ["MISSION SUCCESSFUL"] = "MISE ÚSPĚŠNÁ", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+--      ["Mission succeeded!"] = "", -- portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, SimpleMission, HedgeEditor
 --      ["Mission won!"] = "", -- Basic_Training_-_Grenade
 --      ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02
 --      ["Mixed %d"] = "", -- WxW
@@ -1420,7 +1397,6 @@
 --      ["Monster kill!"] = "", -- Mutant
 --      ["Monsters"] = "", -- 
 --      ["Mooney"] = "", -- 
---      ["More Natives"] = "", -- A_Classic_Fairytale:epil
 --      ["Morris"] = "", -- 
 --      ["Most mines are not active."] = "", -- A_Space_Adventure:desert02
 --      ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01
@@ -1440,13 +1416,11 @@
 --      ["Nade Boy"] = "", -- Basic_Training_-_Grenade
 --      ["Nah, probably everyone was just stupid."] = "", -- A_Space_Adventure:final
 --      ["Name"] = "", -- A_Classic_Fairytale:queen
-      ["Nameless Heroes"] = "Bezejmenní hrdinové",
 --      ["Nancy Screw"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:queen
 --      ["Napalm"] = "", -- Construction_Mode
 --      ["Napalm Rocket"] = "", -- Continental_supplies
 --      ["Napalm rocket: [Fire a bomb with napalm!]"] = "", -- Continental_supplies
 --      ["Naranja Jed"] = "", -- A_Space_Adventure:fruit01
---      ["Natives"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Naughty Ninja"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Near a PAotH base on the moon ..."] = "", -- A_Space_Adventure:moon01
 --      ["Near Secret Base 17 of PAotH in the rural Hogland ..."] = "", -- A_Space_Adventure:cosmos
@@ -1541,11 +1515,8 @@
 --      ["Oh, my!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oh, my! I forgot something!"] = "", -- A_Classic_Fairytale:queen
 --      ["Oh, my! This is even more entertaining than I've expected!"] = "", -- A_Classic_Fairytale:backstab
-      ["Oh no! Just try again!"] = "Ale ne! Prostě to zkus znovu!", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Oh no, not %s!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
---      ["Oh no, the Green Bananas have betrayed Hog Solo and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
-      ["Oh no! Time's up! Just try again."] = "Ale ne! Čas vypršel! Zkus to znova!", --Bazooka, Shotgun, SniperRifle
---      ["Oh no! You failed! Just try again."] = "", -- Basic_Training_-_Cluster_Bomb
+--      ["Oh no, the companions have betrayed %s and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
 --      ["Oh no! You have died. Try again!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Oh! Please spare me. You can take all my treasures!"] = "", -- A_Space_Adventure:ice01
 --      ["Oh, silly me! I forgot that I'm the shaman."] = "", -- A_Classic_Fairytale:backstab
@@ -1567,9 +1538,9 @@
 --      ["One shall not judge one by one's appearance!"] = "", -- A_Classic_Fairytale:epil
 --      ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oneye"] = "", -- portal
---      ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant
 --      ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant
+--      ["Only %s can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard
 --      ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01
@@ -1581,6 +1552,7 @@
 --      ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01
 --      ["Oops! You have selected the wrong hedgehog! Just try again."] = "", -- Basic_Training_-_Movement
 --      ["Open ammo menu: [Right click]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
+--      ["Open ammo menu: Tap the [Suitcase]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
 --      ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood
       ["Opposing Team: "] = "Protivníkův tým: ",
 --      ["Orange"] = "", -- 
@@ -1600,15 +1572,14 @@
 --      ["PAotH has sent explosives but unfortunately the trigger mechanism seems to be faulty!"] = "", -- A_Space_Adventure:cosmos
 --      ["Parachute"] = "", -- Continental_supplies
 --      ["Patches"] = "", -- 
---      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02
 --      ["Pause: [P]"] = "", -- Basic_Training_-_Movement
+--      ["Pause: Tap the [Pause] button"] = "", -- Basic_Training_-_Movement
 --      ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW
 --      ["Penguin Roar"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hog’s health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Perfect! Now try to get the next crate without hurting yourself!"] = "", -- A_Classic_Fairytale:first_blood
-      ["Per-Hog Ammo"] = "Individuální munice",
 --      ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh
 --      ["Personal best: %.3f seconds"] = "", -- A_Space_Adventure:ice02
 --      ["Per team weapons"] = "", -- Continental_supplies
@@ -1617,7 +1588,6 @@
 --      ["Physicist"] = "", -- HedgeEditor
 --      ["Piano Strike"] = "", -- Construction_Mode
 --      ["Pikachu"] = "", -- 
---      ["Pincer Knights"] = "", -- Bazooka_Battlefield
 --      ["Pings left: %d"] = "", -- Space_Invasion
 --      ["Pink"] = "", -- 
 --      ["Pirates"] = "", -- 
@@ -1669,9 +1639,7 @@
 --      ["Please wait …"] = "", -- WxW
 --      ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion
 --      ["--- Points ---"] = "", -- Battalion
-      ["points"] = "body", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
 --      ["--- Points Mode ---"] = "", -- Battalion
---      ["point(s)"] = "", -- TargetPractice, Mutant
       ["Poison"] = "Otrava",
 --      ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02
 --      ["Poisonous, deals no damage."] = "", -- Continental_supplies
@@ -1691,37 +1659,37 @@
 --      ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to fight"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos
---      ["Prepare yourself"] = "",
+--      ["Prepare yourself, %s!"] = "", -- The_Specialists
 --      ["Press [Attack] (space bar by default) to start,|repeadedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] (space bar by default) to start,|repeatedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] to begin."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Attack] to confirm."] = "", -- Continental_supplies
 --      ["Press [Attack] to select this continent!"] = "", -- Continental_supplies
 --      ["Press [Left] and [Right] to change the difficulty."] = "", -- A_Classic_Fairytale:first_blood
---      ["Press [Left] or [Right] to move around, [Enter] to jump"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Press [Left] or [Right] to move around, [Long Jump] to jump forwards."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW
 --      ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW
+--      ["Press [M] to see the mission texts"] = "", -- Basic_Training_-_Movement
       ["Press [Precise] to skip intro"] = "Stiskni [přesnost] pro přeskočení",
 --      ["Press [Up] and [Down] to move between menu items.|Press [Attack], [Left], or [Right] to toggle."] = "", -- WxW
 --      ["Prestigious Pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Princess"] = "", -- A_Classic_Fairytale:family, A_Classic_Fairytale:journey
 --      ["Princess Peach"] = "", -- 
---      ["Private Nolak"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["Problems, dude? Chillax!"] = "", -- A_Classic_Fairytale:epil
 --      ["Professional pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professional stunt pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professor"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
 --      ["Professor Hogevil, then known as James Hogus, worked for PAotH back in my time."] = "", -- A_Space_Adventure:moon02
+--      ["Professor's Team"] = "", -- A_Space_Adventure:death01
 --      ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
---      ["Pro Killers"] = "", -- Big_Armory
 --      ["Protect the King: When the king dies, so does the team"] = "", -- Battalion
 --      ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Protect yourselves!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Purple"] = "", -- 
 --      ["Pyro"] = "", -- HedgeEditor, The_Specialists
 --      ["Pyromancer"] = "", -- Battalion
 --      ["Quit: [Esc]"] = "", -- Basic_Training_-_Movement
 --      ["Race complexity limit reached"] = "", -- Racer, TechRacer
+--      ["Race failed!"] = "", -- A_Space_Adventure:moon02
 --      ["Racer"] = "", -- Racer
 --      ["Racer tool"] = "", -- Racer
 --      ["Race"] = "", -- TrophyRace
@@ -1757,23 +1725,19 @@
 --      ["Replenishment: Weapons are restocked on turn start of a new hog"] = "", -- Highlander
 --      ["Repositioning Mode"] = "", -- HedgeEditor
 --      ["REPOSITIONING MODE"] = "", -- HedgeEditor
---      ["rescues"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Rescue the imprisoned PAotH team and get the fuel!"] = "", -- A_Space_Adventure:moon01
 --      ["Respawner"] = "", -- Construction_Mode
 --      ["Respawner: Resurrects dead hogs."] = "", -- Construction_Mode
 --      ["Resurrector"] = "", -- Construction_Mode
 --      ["Retract/Extend rope: [Up]/[Down]"] = "", -- Basic_Training_-_Rope
 --      ["- Return the enemy flag to your base to score"] = "", -- Capture_the_Flag
-      [" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = " - Dones nepřátelskou vlajku do své základny k získání bodů | - První tým se třemi ukořistěními vítězí | - Můžeš bodovat, pokud je tvá vlajka v základně | - Ježci pustí vlajku, pokud jsou zabiti, nebo utopeni | - Upuštěná vlajka může být navrácena, nebo opět zajmuta | - Ježci jsou po smrti oživeni",
 --      ["Return to Leaks A Lot!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Return to the mission menu by pressing the \"Go back\" button."] = "", -- A_Space_Adventure:cosmos
 --      ["Return to the Surface"] = "", -- A_Space_Adventure:fruit02
 --      ["Return to the training menu by pressing the “Go back” button."] = "", -- Basic_Training_-_Movement
---      ["Rhombus"] = "", -- Basic_Training_-_Movement
 --      ["Rider"] = "", -- portal
 --      ["Rifleman"] = "", -- Battalion
 --      ["Righteous Beard"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:queen, A_Classic_Fairytale:united
---      ["Right Tong"] = "", -- Bazooka_Battlefield
 --      ["Ripe"] = "", -- 
 --      ["Rise the water if nobody else is in the circle and deal 6 damage to all enemy hogs."] = "", -- Continental_supplies
 --      ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01
@@ -1782,8 +1746,8 @@
 --      ["Roof"] = "", -- WxW
 --      ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Rope Master"] = "", -- Basic_Training_-_Rope
---      ["Roper"] = "", -- SpeedShoppa
 --      ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
+--      ["Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Rope Team"] = "", -- Basic_Training_-_Rope
 --      ["Rope Training"] = "", -- Basic_Training_-_Rope
 --      ["Rope Weapons"] = "", -- Basic_Training_-_Rope
@@ -1797,7 +1761,6 @@
 --      ["Round limit:"] = "", -- TechRacer
 --      ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer
 --      ["Round's slowest lap: %.3fs by %s"] = "", -- TrophyRace
---      ["Rounds until Sudden Death: %d"] = "", -- Battalion
 --      ["RS1"] = "", -- A_Space_Adventure:fruit03
 --      ["RS2"] = "", -- A_Space_Adventure:fruit03
 --      ["Rubber"] = "", -- Construction_Mode, HedgeEditor
@@ -1823,10 +1786,17 @@
 --      ["Salvation was one step closer now..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Sam"] = "", -- A_Space_Adventure:cosmos
 --      ["Sandals?! I thought you left your ring!"] = "", -- A_Classic_Fairytale:queen
+--      ["%s and GB"] = "", -- A_Space_Adventure:fruit02
 --      ["%s and %s enter the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sandstorm"] = "", -- A_Space_Adventure:desert01
 --      ["Sandy"] = "", -- A_Space_Adventure:desert01
-      ["Save as many hapless hogs as possible!"] = "Zachraň tolik nešťastných ježků, kolik jen můžeš!",
+--      ["%s arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
+--      ["Save as many hogs as possible!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey
 --      ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow
 --      ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor
@@ -1838,9 +1808,9 @@
 --      ["Scallywag"] = "", -- 
 --      ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab
 --      ["Scenario"] = "", -- Big_Armory, portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape
---      ["Scenario failed!"] = "", -- SimpleMission
 --      ["Scientist"] = "", -- Battalion
 --      ["%s climbed home in %d seconds!"] = "", -- ClimbHome
+--      ["%s (contd.)"] = "", -- A_Classic_Fairytale:epil
 --      ["Score: %d"] = "", -- Space_Invasion
 --      ["Score goal: %d"] = "", -- Control
 --      ["Score graph"] = "", -- Mutant, Space_Invasion
@@ -1850,6 +1820,7 @@
 --      ["Scores"] = "", -- Mutant
 --      ["Scores:"] = "", -- Mutant
 --      ["Scoring: "] = "", -- Mutant
+--      ["%s couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
 --      ["Script parameter examples:"] = "", -- Gravity
 --      ["%s (+%d)"] = "", -- Battalion
 --      ["%s: %d"] = "", -- Capture_the_Flag, Control
@@ -1862,10 +1833,9 @@
 --      ["%s died … and lives again!"] = "", -- Construction_Mode
 --      ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome
 --      ["%s, %d sec"] = "", -- Continental_supplies
---      ["Search for the device with the help of the other hedgehogs "] = "", -- A_Space_Adventure:fruit02
+--      ["Search for the device with the help of the other hedgehogs."] = "", -- A_Space_Adventure:fruit02
 --      ["Searching in the dust"] = "", -- A_Space_Adventure:desert01
 --      ["Searching the stars!"] = "", -- A_Space_Adventure:cosmos
---      ["seconds"] = "", -- ClimbHome
 --      ["Seduction"] = "", -- Continental_supplies
 --      ["Seems like every time you take a \"walk\", the enemy finds us!"] = "", -- A_Classic_Fairytale:backstab
 --      ["See that crate farther on the right?"] = "", -- A_Classic_Fairytale:first_blood
@@ -1892,6 +1862,7 @@
 --      ["Select your continent with [Up]/[Down] or by selecting a representative weapon."] = "", -- Continental_supplies
 --      ["%s enters the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sergey"] = "", -- 
+--      ["%s escaped successfully!"] = "", -- A_Space_Adventure:fruit01
 --      ["Set bounciness: [Left Shift] + [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set detonation timer: [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set Health: [Left Click]"] = "", -- HedgeEditor
@@ -1915,10 +1886,12 @@
 --      ["%s has been killed before taking enough damage first."] = "", -- SimpleMission
 --      ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has been rescued from death"] = "", -- Construction_Mode
+--      ["%s has dropped the flag!"] = "", -- CTF_Blizzard
 --      ["%s has fallen victim to gravity."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has mutated! +2 points"] = "", -- Mutant
 --      ["%s has passed the best height of %s!"] = "", -- ClimbHome
 --      ["%s has scored!"] = "", -- Capture_the_Flag
+--      ["%s has to refuel the saucer."] = "", -- A_Space_Adventure:moon01
 --      ["%s hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil
 --      ["sheepluva"] = "", -- 
@@ -1935,8 +1908,6 @@
 --      ["Shinobi"] = "", -- 
 --      ["%s hit the ground."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Shoppa Love"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
---      ["Shoppa Union"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes, Challenge_-_Speed_Shoppa_-_ShoppaKing
---      ["Shoppers"] = "", -- SpeedShoppa
 --      ["Shotgun"] = "", -- Continental_supplies
 --      ["Sigh."] = "", -- A_Classic_Fairytale:epil
       ["Silly"] = "Hloupý",
@@ -1949,11 +1920,11 @@
 --      ["%s is now as poor as a church mouse"] = "", -- Construction_Mode
 --      ["%s is now a zombie hedgehog"] = "", -- Construction_Mode
 --      ["%s is suddenly low on ammo"] = "", -- Construction_Mode
---      ["Skip your turn to try again."] = "", -- Basic_Training_-_Rope
 --      ["Skulls"] = "", -- Bazooka_Battlefield
 --      ["Slimer"] = "", -- 
 --      ["Slippery"] = "", -- A_Classic_Fairytale:journey
 --      ["%s lost all the weapons"] = "", -- Construction_Mode
+--      ["%s lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
 --      ["Slot %d: %s"] = "", -- Frenzy
 --      ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy
 --      ["Slowpoke"] = "", -- 
@@ -1967,6 +1938,7 @@
 --      ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smugglers"] = "", -- A_Space_Adventure:desert01
+--      ["%s must collect the final crates."] = "", -- A_Space_Adventure:fruit02
 --      ["%s must skip this turn for rule violation."] = "", -- WxW
 --      ["Sneaks"] = "", -- Bazooka_Battlefield
 --      ["%s never got the ninja diploma."] = "", -- ClimbHome
@@ -1975,10 +1947,8 @@
 --      ["Sniper"] = "", -- HedgeEditor, The_Specialists
 --      ["Sniper Rifle"] = "", -- Continental_supplies
       ["Sniper Training"] = "Odstřelovací trénink",
-      ["Sniperz"] = "Snajpři",
 --      ["So, as promised I have brought you where I think that the device you are looking for is hidden."] = "", -- A_Space_Adventure:fruit02
 --      ["So far, you had infinite ropes, but in the|real world, ropes are usually limited."] = "", -- Basic_Training_-_Rope
---      ["So Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["So, I believe that it's a good place to start."] = "", -- A_Space_Adventure:desert01
 --      ["So, I kindly ask for your help."] = "", -- A_Space_Adventure:fruit01
@@ -1988,11 +1958,12 @@
 --      ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03
 --      ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen
 --      ["Some weapons can be dropped from the rope."] = "", -- Basic_Training_-_Rope
---      ["Somewhere else on the planet of fruits, Captain Lime helps Hog Solo"] = "", -- A_Space_Adventure:fruit02
---      ["Somewhere else on the planet of fruits Hog Solo gets closer to the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, Captain Lime helps %s"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, %s gets closer to the device"] = "", -- A_Space_Adventure:fruit02
 --      ["Somewhere on the Planet of Fruits a terrible war is about to begin ..."] = "", -- A_Space_Adventure:fruit01
 --      ["Somewhere on the uninhabitable Death Planet ..."] = "", -- A_Space_Adventure:death01
 --      ["So, now I got the last part and I have your friends captured."] = "", -- A_Space_Adventure:death01
+--      ["So, %s, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So the princess was never heard of again ..."] = "", -- A_Classic_Fairytale:family
 --      ["So, uhmm, how did you manage to teleport them so far?"] = "", -- A_Classic_Fairytale:epil
 --      ["Sour"] = "", -- 
@@ -2093,8 +2064,6 @@
 --      ["Structure Placement Mode"] = "", -- Construction_Mode
 --      ["Structure Placer"] = "", -- Construction_Mode
 --      ["Stupid, stupid Hogerians!"] = "", -- A_Space_Adventure:final
---      ["Subject 1"] = "", -- portal
---      ["Subjects"] = "", -- portal
 --      ["Subtract %d"] = "", -- HedgeEditor
 --      ["--- Sudden Death ---"] = "", -- Battalion
 --      ["Summer Squash"] = "", -- A_Space_Adventure:fruit01
@@ -2111,7 +2080,7 @@
 --      ["Surfer! +15 points!"] = "", -- Space_Invasion
 --      ["Surfer!"] = "", -- WxW
 --      ["Surprise supplies: Get 1-3 random weapons each turn."] = "", -- Continental_supplies
---      ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:shadow
+--      ["Survive!"] = "", -- A_Classic_Fairytale:shadow
 --      ["%s violated the “All But Last” rule and will be penalized."] = "", -- WxW
 --      ["%s violated the “Kill The Leader” rule and will be penalized."] = "", -- WxW
 --      ["Swap place with a random enemy in the circle."] = "", -- Continental_supplies
@@ -2130,6 +2099,7 @@
 --      ["%s! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
 --      ["Swing, Leaks A Lot, on the wings of the wind!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Swing: [Left]/[Right]"] = "", -- Basic_Training_-_Rope
+--      ["%s wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome
 --      ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer
 --      ["switch"] = "", -- Continental_supplies
@@ -2143,6 +2113,7 @@
 --      ["Switch Hog"] = "", -- Construction_Mode
 --      ["Switch: Select weapon special"] = "", -- Continental_supplies
 --      ["Switch: Toggle crate radar"] = "", -- WxW
+--      ["%s won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Swords"] = "", -- Bazooka_Battlefield
 --      ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon
 --      ["%s, you may choose the rules."] = "", -- WxW
@@ -2151,6 +2122,8 @@
 --      ["Tails"] = "", -- 
 --      ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Tall Potato"] = "", -- A_Space_Adventure:fruit01
+--      ["Tap [Pause] to see the mission texts"] = "", -- Basic_Training_-_Movement
+--      ["Tap the “rotating arrow” button on the left|until you have selected Cappy, the hedgehog with the cap!"] = "", -- Basic_Training_-_Movement
 --      ["Target"] = "", -- HedgeEditor
 --      ["Target Placement Mode"] = "", -- Construction_Mode
 --      ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor
@@ -2166,15 +2139,18 @@
 --      ["Tatters"] = "", -- 
 --      ["Team %d"] = "", -- SimpleMission
       ["Team %d: "] = "Tým %d: ",
+--      ["Team highscore: %d"] = "", -- Utils
 --      ["Team Identity Mode"] = "", -- HedgeEditor
 --      ["TEAM IDENTITY MODE"] = "", -- HedgeEditor
---      ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
+--      ["Team lowscore: %d"] = "", -- Utils
 --      ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion
+--      ["Team's best time: %.3fs"] = "", -- Utils
 --      ["Team Scores:"] = "", -- Control
 --      ["Team scores:"] = "", -- Space_Invasion
+--      ["Team's longest time: %.3fs"] = "", -- Utils
+--      ["Team's top accuracy: %d%"] = "", -- Utils
 --      ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2
 --      ["Teamwork"] = "", -- User_Mission_-_Teamwork
---      ["Team Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
 --      ["TechRacer"] = "", -- TechRacer
 --      ["Teleporation Node"] = "", -- Construction_Mode
 --      ["Teleportation Mode"] = "", -- Construction_Mode
@@ -2266,11 +2242,12 @@
 --      ["The forgotten continent"] = "", -- Continental_supplies
 --      ["The giant umbrella from the last crate should help break the fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Great Escape"] = "", -- User_Mission_-_The_Great_Escape
---      ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01
+--      ["- The green target must survive"] = "", -- HedgeEditor
+--      ["- The green targets must survive"] = "", -- HedgeEditor
 --      ["The guardian"] = "", -- A_Classic_Fairytale:shadow
 --      ["The hardships of the war turned %s (%s) into a killing machine: %d invaders destroyed in one round!"] = "", -- Space_Invasion
+--      ["The health of your current hedgehog|is shown at the top right corner."] = "", -- Basic_Training_-_Movement
 --      ["The hedgehog with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant
---      ["The Hogies"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["The Hospital"] = "", -- 
 --      ["The Individualist"] = "", -- A_Classic_Fairytale:shadow
 --      ["Their buildings were very primitive back then, even for an uncivilised island."] = "", -- A_Classic_Fairytale:united
@@ -2288,7 +2265,6 @@
 --      ["The Mutant has super-weapons and a lot of health."] = "", -- Mutant
 --      ["The Mutant loses health quickly, but gains health by killing."] = "", -- Mutant
 --      ["The Mutant loses health quickly if he doesn't keep scoring kills."] = "", -- Mutant
-      ["The Nameless One"] = "Bezejmenný",
 --      ["The Navy greets %s for managing to get in a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["The next 4 times you play the \"The last encounter\" mission you'll get 20 more hit points and a laser sight."] = "", -- A_Space_Adventure:death02
 --      ["The next crate is an utility crate."] = "", -- Basic_Training_-_Movement
@@ -2302,6 +2278,7 @@
 --      ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil
 --      ["The oppression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
 --      ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
+--      ["The other hog has died, he should have survived!"] = "", -- A_Space_Adventure:moon02
 --      ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Police"] = "", -- 
 --      ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -2326,7 +2303,7 @@
 --      ["The Showdown"] = "", -- A_Classic_Fairytale:shadow
 --      ["The Slaughter"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:first_blood
 --      ["The Society of Perfectionists greets %s (%s): No misses and %d hits in its best round."] = "", -- Space_Invasion
-      ["THE SPECIALISTS"] = "SPECIALISTÉ",
+--      ["The Specialists: Each hedgehog starts with its own weapon set"] = "", -- The_Specialists
 --      ["The spinning arrows above your hedgehog show|which hedgehog is selected right now."] = "", -- Basic_Training_-_Movement
 --      ["The spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
@@ -2374,7 +2351,6 @@
 --      ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["This also increases the effectiveness of Medicine."] = "", -- Continental_supplies
 --      ["This game wasn’t really exciting."] = "", -- Space_Invasion
---      ["This Hog Solo is so naive! When he returns I'll shoot him and keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This is a new personal best, congratulations!"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert02, A_Space_Adventure:fruit03
 --      ["This is a new personal best time, congratulations!"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["This is Cappy."] = "", -- Basic_Training_-_Movement
@@ -2392,6 +2368,7 @@
       ["This rain is really something..."] = "Tenhle déšť je opravdu něco...",
 --      ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome
 --      ["This seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01
+--      ["This %s is so naive! I'm going to shoot this fool so I can keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This was an awesome performance! But this challenge can be finished with even just one RC plane. Can you figure out how?"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["This will be fun!"] = "", -- A_Classic_Fairytale:enemy
 --      ["This will be useful when I need a new platform or if I want to rise."] = "", -- portal
@@ -2432,11 +2409,11 @@
 --      ["To begin with the training, hit the attack key!"] = "", -- Basic_Training_-_Movement
 --      ["To begin with the training, select the bazooka from the ammo menu!"] = "", -- Basic_Training_-_Bazooka
 --      ["To begin with the training, select the grenade from the ammo menu!"] = "", -- Basic_Training_-_Grenade
+--      ["To begin with the training, tap the attack button!"] = "", -- Basic_Training_-_Movement
 --      ["To finish hedgehog selection, just do anything|with him, like walking."] = "", -- Basic_Training_-_Movement
 --      ["To get over the next obstacles, keep some distance from the wall before you back jump."] = "", -- Basic_Training_-_Movement
 --      ["To get over the water, you have to do multiple|rope shots and swings."] = "", -- Basic_Training_-_Rope
 --      ["Toggle Editing Weapons and Tools: [Precise]+[2]"] = "", -- HedgeEditor
---      ["Toggle Gear Information: [Precise]+[3]"] = "", -- HedgeEditor
 --      ["Toggle Help: [Precise]+[1]"] = "", -- HedgeEditor
 --      ["Toggle Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Toggle Shield: [Long jump]"] = "", -- Space_Invasion
@@ -2446,14 +2423,14 @@
 --      ["Too bad! Then you should really leave!"] = "", -- A_Space_Adventure:fruit01
 --      ["Too slow! Try again ..."] = "", -- A_Space_Adventure:moon02
 --      ["Top-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"] = "", -- A_Classic_Fairytale:shadow
 --      ["To reach higher ground, walk to a ledge, look to the left, then do a back jump."] = "", -- Basic_Training_-_Movement
 --      ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey
 --      ["To the caves..."] = "", -- A_Classic_Fairytale:united
 --      ["Touch all waypoints as fast as you can!"] = "", -- Racer
---      ["To win the game, Hog Solo has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
+--      ["- Touch the sparkles near your base to teleport"] = "", -- CTF_Blizzard
+--      ["To win the game, %s has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
 --      ["To win the game you had to collect the 2 crates with no specific order."] = "", -- A_Space_Adventure:desert01
---      ["To win the game you have to eliminate all your enemies."] = "", -- A_Space_Adventure:death01
+--      ["To win the game you have to eliminate Professor Hogevil."] = "", -- A_Space_Adventure:death01
 --      ["To win the game you have to find the right crate."] = "", -- A_Space_Adventure:desert01
 --      ["To win the game you have to go next to Thanta."] = "", -- A_Space_Adventure:ice01
 --      ["To win the game you have to go to the surface."] = "", -- A_Space_Adventure:desert02
@@ -2461,13 +2438,10 @@
 --      ["To win the game you have to stand next to Thanta."] = "", -- A_Space_Adventure:ice01
       ["Toxic Team"] = "Jedovatý tým", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Track completed!"] = "", -- Racer, TechRacer
---      ["Trainee"] = "", -- TargetPractice
 --      ["Training"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Training complete!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Training Team"] = "", -- TargetPractice
 --      ["Traitors"] = "", -- A_Classic_Fairytale:epil
 --      ["Traitors don't get to shout around here!"] = "", -- A_Classic_Fairytale:epil
---      ["Trapped"] = "", -- Basic_Training_-_Movement
 --      ["Trapper"] = "", -- HedgeEditor
 --      ["Travel carefully as your fuel is limited"] = "", -- A_Space_Adventure:cosmos
 --      ["Travel to all the neighbor planets and collect all the pieces"] = "", -- A_Space_Adventure:cosmos
@@ -2484,7 +2458,6 @@
 --      ["Try to land softly, as you can still take fall damage!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Try to protect the chief! You won't lose if he dies, but it is advised that he survives."] = "", -- A_Classic_Fairytale:united
 --      ["Try to reach and destroy the next target quickly."] = "", -- Basic_Training_-_Rope
-      ["T_T"] = "T_T",
 --      ["Tumbler"] = "", -- Tumbler
 --      ["Turn around: [Left Shift] + [Left]/[Right]"] = "", -- Basic_Training_-_Movement
 --      ["Turning Around"] = "", -- Basic_Training_-_Movement
@@ -2503,7 +2476,6 @@
 --      ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy
 --      ["Ukemi"] = "", -- 
 --      ["Ultra kill!"] = "", -- Mutant
---      ["Ultrasoldier"] = "", -- Big_Armory
 --      ["unC0Rr"] = "", -- 
 --      ["Under Construction"] = "", -- A_Classic_Fairytale:shadow
 --      ["Under normal circumstances we could easily defeat them but we have kindly sent most of our men to the Kingdom of Sand to help with the annual dusting of the king's palace."] = "", -- A_Space_Adventure:fruit01
@@ -2528,7 +2500,6 @@
 --      ["United We Stand"] = "", -- A_Classic_Fairytale:united
 --      ["Unlike bazookas, grenades are not influenced by wind."] = "", -- Basic_Training_-_Grenade
 --      ["Unlimited Attacks: Attacks don't end your turn"] = "", -- User_Mission_-_Diver, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree
-      ["Unlimited Attacks"] = "Neomezeně útoků",
 --      ["Unlucky Sods"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Unstoppable!"] = "",
 --      ["Unsuspecting Louts"] = "", -- User_Mission_-_Rope_Knock_Challenge
@@ -2543,13 +2514,14 @@
 --      ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood
       ["User Challenge"] = "Výzva",
 --      ["!"] = "", -- User_Mission_-_Dangerous_Ducklings
+--      ["User Mission"] = "", -- HedgeEditor
 --      ["Use the attack key twice to change the flying saucer while being in air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the attack key twice to change the flying saucer while floating in mid-air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the bazooka and the flying saucer to get the freezer."] = "", -- A_Space_Adventure:ice01
 --      ["Use the flying saucer from the crate to fly to the moon."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly the other planets."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly to the other planets."] = "", -- A_Space_Adventure:cosmos
---      ["Use the parachute ([Space] while in air) to get the next crate"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Use the parachute to get the next crate."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Use the portal gun to get to the next crate, then use the new gun to get to the final destination!|"] = "", -- A_Classic_Fairytale:dragon
 --      ["Use the RC plane and destroy the all the targets."] = "", -- A_Space_Adventure:desert03
 --      ["Use the rope in order to catch the blue hedgehog"] = "", -- A_Space_Adventure:moon02
@@ -2583,7 +2555,6 @@
 --      ["Victory Condition: Collect"] = "", -- HedgeEditor
 --      ["Victory Condition: Destroy"] = "", -- HedgeEditor
 --      ["Victory for %s!"] = "", -- Capture_the_Flag
-      ["Victory for the "] = "Vítězství pro ", -- CTF_Blizzard, Capture_the_Flag
 --      ["Violence is not the answer to your problems!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos
 --      ["Vladimir"] = "", -- 
@@ -2602,9 +2573,6 @@
 --      ["Walls left: %d"] = "", -- WxW
 --      ["Wall to wall"] = "", -- WxW
 --      ["Waluigi"] = "", -- 
---      ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Wannabe Ropers"] = "", -- Basic_Training_-_Rope
---      ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Wario"] = "", -- 
 --      ["Warming Up"] = "", -- Basic_Training_-_Grenade
 --      ["Warning: Fire cake detected"] = "", -- ClimbHome
@@ -2634,7 +2602,6 @@
 --      ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion
 --      ["Weapon specials: Some weapons have special modes (see weapon description)."] = "", -- Continental_supplies
 --      ["Weapons reset: The weapons are reset after each turn."] = "", -- WxW
-      ["Weapons Reset"] = "Zbraně obnoveny",
 --      ["We are indeed."] = "", -- A_Classic_Fairytale:backstab
 --      ["We can't defeat them!"] = "", -- A_Classic_Fairytale:shadow
 --      ["We can't hold them up much longer!"] = "", -- A_Classic_Fairytale:united
@@ -2650,9 +2617,9 @@
 --      ["We have to hurry! Are you armed?"] = "", -- A_Space_Adventure:moon01
 --      ["We have to protect the village!"] = "", -- A_Classic_Fairytale:united
 --      ["We have to unite and defeat those cylergs!"] = "", -- A_Classic_Fairytale:enemy
---      ["Welcome Hog Solo, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome home! Please take a seat"] = "", -- ClimbHome
 --      ["Welcome, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey
+--      ["Welcome, %s, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome to the Death Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
@@ -2819,16 +2786,16 @@
 --      ["You can’t open a portal on the blue surface."] = "", -- portal
 --      ["You can use the other 2 hogs to assist you."] = "", -- A_Space_Adventure:fruit02
 --      ["You can use the rope to reach new places."] = "", -- Basic_Training_-_Rope
---      ["You choose well, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You choose well, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You completed the mission in %.3f seconds."] = "", -- A_Space_Adventure:ice02
 --      ["You completed the mission in %d rounds."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03
---      ["You couldn't have come to a worse time, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You couldn't have come to a worse time, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You couldn't possibly believe that after refusing my offer I'd just let you go!"] = "", -- A_Classic_Fairytale:journey
       ["You'd almost swear the water was rising!"] = "Přísahal bys, že voda stoupá!",
 --      ["You'd better watch your steps..."] = "", -- A_Classic_Fairytale:journey
 --      ["You defended yourself against Captain Lime."] = "", -- A_Space_Adventure:fruit02
---      ["You defended yourself against the Fruit Assassins."] = "", -- A_Space_Adventure:fruit02
---      ["You did great, Hog Solo! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
+--      ["You defended yourself against %s."] = "", -- A_Space_Adventure:fruit02
+--      ["You did great, %s! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
 --      ["You did not make it in time, try again!"] = "", -- Basic_Training_-_Rope
 --      ["You don't deserve my sacrifice!"] = "", -- A_Classic_Fairytale:queen
 --      ["You drove Professor Hogevil away."] = "", -- A_Space_Adventure:moon01
@@ -2844,12 +2811,12 @@
 --      ["You got me!"] = "", -- A_Space_Adventure:moon02
 --      ["You had %.1fs remaining on the clock (+%d points)."] = "", -- TargetPractice
 --      ["You had %.2fs remaining on the clock (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle
---      ["You had %d additional flying saucers left."] = "", -- A_Space_Adventure:ice02
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: you might want to use some mines..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: You might want to use some mines ..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01
 --      ["You have activated Switch Hedgehog!"] = "", -- Basic_Training_-_Movement
 --      ["You have beaten the challenge!"] = "", -- ClimbHome
+--      ["You have beaten the team record, congratulations!"] = "", -- Utils
 --      ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab
 --      ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united
 --      ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01
@@ -2868,7 +2835,6 @@
 --      ["You have eliminated all visible enemy hedgehogs!"] = "", -- A_Space_Adventure:fruit01
 --      ["You have eliminated Professor Hogevil."] = "", -- A_Space_Adventure:moon01
 --      ["You have eliminated the evil minions."] = "", -- A_Space_Adventure:moon01
---      ["You have eliminated the whole evil team. You're pretty tough!"] = "", -- A_Space_Adventure:moon01
 --      ["You have escaped successfully."] = "", -- A_Space_Adventure:desert02
 --      ["You have failed to complete your task, young one!"] = "", -- A_Classic_Fairytale:journey
 --      ["You have failed to save the tribe!"] = "", -- A_Classic_Fairytale:backstab
@@ -2922,6 +2888,7 @@
 --      ["You have to travel again"] = "", -- A_Space_Adventure:cosmos
 --      ["You have to try again!"] = "", -- A_Space_Adventure:cosmos
 --      ["You have triggered the secret Do-Not-Rope-to-the-Moon Defense System."] = "", -- A_Space_Adventure:cosmos
+--      ["You have unlocked the target radar!"] = "", -- TargetPractice
 --      ["You have used %d flying saucers."] = "", -- A_Space_Adventure:ice02
 --      ["You have used %d RC planes."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["You have used only 1 RC plane. Outstanding!"] = "", -- User_Mission_-_RCPlane_Challenge
@@ -2940,10 +2907,9 @@
 --      ["You'll have only 2 watermelon bombs during the game."] = "", -- A_Space_Adventure:fruit03
 --      ["You'll have only one RC plane at the start of the mission."] = "", -- A_Space_Adventure:desert03
 --      ["You'll have to eliminate Captain Lime at the end."] = "", -- A_Space_Adventure:fruit02
---      ["You'll have to eliminate the Fruit Assassins at the end."] = "", -- A_Space_Adventure:fruit02
+--      ["You'll have to eliminate %s at the end."] = "", -- A_Space_Adventure:fruit02
 --      ["You'll lose if you die or if your time is up."] = "", -- A_Space_Adventure:moon02
 --      ["You'll see what I mean!"] = "", -- A_Classic_Fairytale:enemy
---      ["You lose!"] = "", -- Basic_Training_-_Sniper_Rifle, Big_Armory, Basic_Training_-_Bazooka, TargetPractice, ClimbHome
 --      ["You lost your target, try again!"] = "", -- TargetPractice
 --      ["You may find it handy."] = "", -- A_Space_Adventure:cosmos
 --      ["You may only attack from a rope!"] = "", -- WxW
@@ -2965,8 +2931,7 @@
 --      ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice
 --      ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice
 --      ["Your ammo is limited this time."] = "", -- Basic_Training_-_Bazooka
---      ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy
---      ["Your deaths will be avenged, Natives!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Your deaths will be avenged, %s!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Your death will not be in vain, Dense Cloud!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You're a coward!"] = "", -- A_Classic_Fairytale:queen
 --      ["You're...alive!? But we saw you die!"] = "", -- A_Classic_Fairytale:backstab
@@ -2994,21 +2959,21 @@
 --      ["Your next task is to collect some crates by using the rope!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Your personal best time so far: %.3f seconds"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["Your rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["You saved %d of 8 Hapless Hogs."] = "", -- User_Mission_-_That_Sinking_Feeling
+--      ["Your rope is gone! Try again!"] = "", -- Basic_Training_-_Rope
+--      ["You saved %d of 8 hegehogs."] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen
 --      ["You see the wind strength at the bottom right corner."] = "", -- Basic_Training_-_Bazooka
+--      ["You see the wind strength at the top."] = "", -- Basic_Training_-_Bazooka
 --      ["You should have known that we don't rely on meatbags!"] = "", -- A_Classic_Fairytale:queen
 --      ["You should know this more than anyone, Leaks!"] = "", -- A_Classic_Fairytale:queen
 --      ["You speak great truth, Hannibal. Here, take a sip!"] = "", -- A_Classic_Fairytale:epil
 --      ["You've been assaulting us, we have been just defending ourselves!"] = "", -- A_Classic_Fairytale:enemy
-      ["You've failed. Try again."] = "Zklamal jsi. Zkus to znovu.",
       ["You've reached the goal!| |Time: "] = "Dosáhl jsi cíle!| |Čas: ",
 --      ["You will be avenged!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You will fail if you run out of ammo and there are still targets available."] = "", -- A_Space_Adventure:desert03
 --      ["You will gain some extra ammo from the crates the next time you play the \"Getting to the device\" mission."] = "", -- A_Space_Adventure:fruit03
 --      ["You will play every 3 turns."] = "", -- A_Space_Adventure:fruit01
 --      ["- You will recieve 2-4 weapons on each kill! (Even on own hogs)"] = "", -- Continental_supplies
---      ["You win!"] = "", -- Big_Armory
 --      ["You won't believe what happened to me!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Yuck! I bet they'll keep worshipping her even after I save the village!"] = "", -- A_Classic_Fairytale:family
 --      ["Yumme Gunpowder"] = "", -- 
@@ -3016,6 +2981,7 @@
 --      ["Zombie"] = "", -- 
 --      ["Zombi"] = "", -- portal
       ["'Zooka Team"] = "Bazukáři",
---      ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
+--      ["Zoom: [Pinch] with 2 fingers"] = "", -- Basic_Training_-_Movement
+--      ["Zoom: [Rotate mouse wheel]"] = "", -- Basic_Training_-_Movement
 --      ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen
 }
--- a/share/hedgewars/Data/Locale/da.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/da.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -26,7 +26,6 @@
 --      ["Above-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Accuracy Bonus! +15 points"] = "", -- Space_Invasion
 --      ["Accuracy bonus: +%d points"] = "", -- Basic_Training_-_Sniper_Rifle
---      ["Ace"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge
 --      ["Achievement gotten: %s"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_That_Sinking_Feeling, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, Basic_Training_-_Rope, Tumbler
 --      ["A Classic Fairytale"] = "", -- A_Classic_Fairytale:first_blood
 --      ["A crate critical to this mission has been destroyed."] = "", -- SimpleMission
@@ -45,7 +44,6 @@
 --      ["After you left the moon, my other loyal minions came and resurrected me so I could complete my master plan."] = "", -- A_Space_Adventure:death01
 --      ["Again with the 'cannibals' thing!"] = "", -- A_Classic_Fairytale:enemy
 --      ["A Hedgewars minigame"] = "", -- Capture_the_Flag
-        ["a Hedgewars mini-game"] = "et Hedgewars-minispil", -- Space_Invasion, The_Specialists
 --      ["A Hedgewars mini-game"] = "", -- Racer, Space_Invasion, TechRacer, Tumbler
 --      ["A Hedgewars tag game"] = "", -- Mutant
 --      ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome
@@ -141,13 +139,14 @@
 --      ["As you've seen, the dropped grenade roughly fell into your flying direction."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Athlete"] = "", -- Battalion
 --      ["Attack: Activate"] = "", -- Racer
---      ["Attack Captain Lime before he attacks back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack Captain Lime before he attacks back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack From Rope: %s"] = "", -- WxW
 --      ["Attack From Rope: You may only attack from a rope."] = "", -- WxW
 --      ["Attack rule: %s"] = "", -- WxW
 --      ["Attack: Select this continent"] = "", -- Continental_supplies
 --      ["Attack: [Space]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
---      ["Attack the assassins before they attack back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack: Tap the [Bomb]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
+--      ["Attack the assassins before they attack back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack: Throw ball"] = "", -- Knockball
 --      ["At the end of the game your health was %d."] = "", -- A_Space_Adventure:ice01
 --      ["At the start of the game each enemy hog has only the weapon that he is named after."] = "", -- A_Space_Adventure:death02
@@ -155,16 +154,18 @@
 --      ["Available weapon specials:"] = "", -- Continental_supplies
 --      ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion
---      ["Avoid the mines!"] = "", -- Basic_Training_-_Rope
 --      ["Axes"] = "", -- Bazooka_Battlefield
 --      ["Aye! Fellow! Let me exit this chamber of doom!"] = "", -- A_Classic_Fairytale:epil
 --      ["Back Breaker"] = "", -- A_Classic_Fairytale:backstab
 --      ["Back in the village, after telling the villagers about the threat..."] = "", -- A_Classic_Fairytale:united
 --      ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil
 --      ["Back Jump: [Backspace] ×2"] = "", -- Basic_Training_-_Movement
+--      ["Back Jump: Double-tap the [Curvy Arrow]"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (1/2)"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (2/2)"] = "", -- Basic_Training_-_Movement
 --      ["Backstab"] = "", -- A_Classic_Fairytale:backstab
+--      ["Backwards jump: Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Backwards jump: Tap the [Curvy Arrow] twice"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Bacon"] = "", -- 
 --      ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Badmad"] = "", -- portal
@@ -197,7 +198,6 @@
 --      ["Bazooka Battlefield"] = "", -- Bazooka_Battlefield
 --      ["Bazooka Master"] = "", -- Basic_Training_-_Bazooka
 --      ["Bazookas are influenced by wind."] = "", -- Basic_Training_-_Bazooka
---      ["Bazooka Team"] = "", -- Basic_Training_-_Bazooka
         ["Bazooka Training"] = "Træning med Bazooka",
 --      ["Bearded Beast"] = "", -- 
 --      ["Be careful, the future of Hogera is in your hands!"] = "", -- A_Space_Adventure:cosmos
@@ -231,7 +231,6 @@
 --      ["Bloodpie"] = "", -- A_Classic_Fairytale:backstab
 --      ["Bloodrocutor"] = "", -- A_Classic_Fairytale:shadow
 --      ["Bloodsucker"] = "", -- A_Classic_Fairytale:shadow
-        ["Bloody Rookies"] = "Forbandede Begyndere", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 --      ["Blue"] = "", -- 
 --      ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Bob"] = "", -- A_Space_Adventure:cosmos
@@ -314,7 +313,9 @@
 --      ["Challenge objectives"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit03, A_Space_Adventure:moon02
 --      ["Challenge over!"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa, ClimbHome
+--      ["Change bounciness: Tap [B]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Content: [Left], [Right]"] = "", -- HedgeEditor
+--      ["Change detonation timer: Tap the [Clock]"] = "", -- Basic_Training_-_Grenade, A_Classic_Fairytale:shadow
 --      ["Change direction: [Left]/[Right]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Change Health: [Left], [Right]"] = "", -- HedgeEditor
@@ -334,6 +335,8 @@
 --      ["Chicken"] = "", -- 
 --      ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01
 --      ["Chikorita"] = "", -- 
+--      ["Choose location: Left click"] = "", -- A_Classic_Fairytale:shadow
+--      ["Choose location: Tap the [Target] button, then tap on the spot you want to choose"] = "", -- A_Classic_Fairytale:shadow
 --      ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Choose your continent wisely, as your decision will be permanent."] = "", -- Continental_supplies
 --      ["Choose your side! If you want to join the strange man, walk up to him.|Otherwise, walk away from him. If you decide to att...nevermind..."] = "", -- A_Classic_Fairytale:shadow
@@ -342,7 +345,6 @@
 --      ["Cleaver"] = "", -- Construction_Mode
 --      ["Cleaver Placement Mode"] = "", -- Construction_Mode
 --      ["CLEAVER PLACEMENT MODE"] = "", -- HedgeEditor
---      ["Climber"] = "", -- ClimbHome
 --      ["Climb Home"] = "", -- ClimbHome
 --      ["Closing in"] = "", -- A_Classic_Fairytale:queen
 --      ["Clown"] = "", -- HedgeEditor
@@ -352,11 +354,13 @@
 --      ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb
 --      ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey
 --      ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey
+--      ["- Collect all the blue crates"] = "", -- HedgeEditor
 --      ["Collect all the crates, but remember, our time in this life is limited!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect or destroy all the health crates."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Collect or destroy the final crate to finish the training."] = "", -- Basic_Training_-_Flying_Saucer
+--      ["- Collect the blue crate"] = "", -- HedgeEditor
 --      ["Collect the crate and attack!"] = "", -- WxW
---      ["Collect the crate on the right.|Hint: Select the rope, [Up] or [Down] to aim, [Space] to fire, directional keys to move.|Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Collect the crate on the right."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the crates within the time limit!|If you fail, you'll have to try again."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the first crate to begin!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Collect the freezer and get the device part from Thanta."] = "", -- A_Space_Adventure:ice01
@@ -424,7 +428,6 @@
 --      ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates per turn: %d"] = "", -- WxW
---      ["crate(s)"] = "", -- SpeedShoppa
 --      ["Crazy Gravity: Gravity randomly changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity
 --      ["Crazy Runner"] = "", -- A_Space_Adventure:moon02
 --      ["Cricket Time"] = "", -- Continental_supplies
@@ -457,11 +460,10 @@
 --      ["Deals 15 damage to all enemies in the circle."] = "", -- Continental_supplies
 --      ["Deer"] = "", -- 
 --      ["Defeat all enemies!"] = "", -- portal
+--      ["Defeat!"] = "", -- HedgeEditor
 --      ["Defeat Professor Hogevil!"] = "", -- A_Space_Adventure:death01
---      ["Defeat the cannibals"] = "", -- A_Classic_Fairytale:backstab
---      ["Defeat the cannibals!|"] = "", -- A_Classic_Fairytale:united
+--      ["Defeat the cannibals!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cannibals!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Defeat the cannibals!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cyborgs!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen
 --      ["Delete Waypoint"] = "", -- HedgeEditor
@@ -482,11 +484,11 @@
 --      ["Destroyer of planes"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Destroy him, Leaks A Lot! He is responsible for the deaths of many of us!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion
+--      ["- Destroy the enemy"] = "", -- HedgeEditor
+--      ["- Destroy the red target"] = "", -- HedgeEditor
+--      ["- Destroy the red targets"] = "", -- HedgeEditor
 --      ["Destroy the targets!"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
---      ["Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
---      ["Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"] = "", -- A_Classic_Fairytale:first_blood
 --      ["+%d flamer fuel!"] = "", -- Tumbler
---      ["%d Hapless Hogs left"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["+%d health"] = "", -- Mutant
 --      ["%d-Hit Combo! +%d points!"] = "", -- Space_Invasion
 --      ["Did anyone follow you?"] = "", -- A_Classic_Fairytale:united
@@ -507,7 +509,6 @@
 --      ["Disguise as a Rockhopper Penguin"] = "", -- Continental_supplies
 --      ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies
 --      ["Displacer"] = "", -- 
---      ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Diver"] = "", -- User_Mission_-_Diver
 --      ["%d ms"] = "", -- HedgeEditor
 --      ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen
@@ -594,10 +595,8 @@
 --      ["Elderbot"] = "", -- A_Classic_Fairytale:family
 --      ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape
         ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Eliminer all mål før tiden løber ud.|Du har uendelig ammunition under denne mission.", --Bazooka, Shotgun, SniperRifle
---      ["Eliminate the Blue Team before the time runs out."] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Eliminate the enemy before the time runs out."] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree
         ["Eliminate the enemy hogs to win."] = "Eliminer fjendens pindsvin for at vinde.",
-        ["Eliminate the enemy specialists."] = "Eliminer fjendens specialister.",
 --      ["Eliminate the enemy."] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh
 --      ["Eliminate Unit 3378."] = "", -- User_Mission_-_Teamwork
 --      ["Eliminate WatchBot 4000."] = "", -- User_Mission_-_Teamwork_2
@@ -622,13 +621,14 @@
 --      ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab
 --      ["Except me, of course! I just saved a whole planet!"] = "", -- A_Space_Adventure:final
 --      ["Experienced beginner"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Explore the tunnel with the other hedgehogs and search for the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Explore the tunnel with the other hedgehogs and search for the device."] = "", -- A_Space_Adventure:fruit02
 --      ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02
 --      ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey
 --      ["Fair Wind"] = "", -- 
 --      ["Fall Damage"] = "", -- Basic_Training_-_Movement
 --      ["Fallen Angel"] = "", -- Tentacle_Terror
 --      ["Family Reunion"] = "", -- A_Classic_Fairytale:family
+--      ["Fastest escape: %d turns"] = "", -- A_Space_Adventure:desert02
 --      ["Fastest lap: %.3fs by %s"] = "", -- TrophyRace
         ["Fastest lap: "] = "Hurtigste omgang: ",
         ["Feeble Resistance"] = "Sølle Modstand",
@@ -648,11 +648,12 @@
 --      ["Final result"] = "", -- Mutant
 --      ["Final Targets"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
 --      ["Final team scores:"] = "", -- Space_Invasion
+--      ["Find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Find a way to detonate all the explosives and stay alive!"] = "", -- A_Space_Adventure:final
 --      ["Find your tribe!|Cross the lake!"] = "", -- A_Classic_Fairytale:dragon
 --      ["Finish this challenge as fast as possible to earn bonus points."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Finish waypoint placement"] = "", -- Racer
---      ["Finish your training|Hint: Animations can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Finish your training."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Finite Ropes"] = "", -- Basic_Training_-_Rope
 --      ["Fire a rocket with napalm."] = "", -- Continental_supplies
 --      ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler
@@ -680,6 +681,7 @@
 --      ["Flying Saucer Training"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Fly into space to fight off the invaders with barrels!"] = "", -- Space_Invasion
 --      ["Fly to the meteorite and detonate the explosives"] = "", -- A_Space_Adventure:cosmos
+--      ["Follow the path and destroy the next target."] = "", -- Basic_Training_-_Rope
 --      ["Forgetfulness: You will lose all your weapons each turn."] = "", -- Continental_supplies
 --      ["For the next crate, you have to do back jumps."] = "", -- Basic_Training_-_Movement
 --      ["Four Eyes"] = "", -- 
@@ -699,9 +701,7 @@
 --      ["“g=150”, where 150 is 150% of normal gravity."] = "", -- Gravity
 --      ["“g=50, g2=150, period=4000” for gravity changing|from 50 to 150 and back with period of 4000 ms."] = "", -- Gravity
 --      ["Galaxy Guardians"] = "", -- Big_Armory
-        ["Game Modifiers: "] = "Spilmodifikatorere",
 --      ["Game over!"] = "", -- Space_Invasion
-        ["GAME OVER!"] = "SPILLET ER FÆRDIGT!",
         ["Game Started!"] = "Spillet er Startet!",
 --      ["Game? Was this a game to you?!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Gangsters"] = "", -- 
@@ -710,8 +710,6 @@
 --      ["Gasp! A smuggler!"] = "", -- A_Space_Adventure:desert01
 --      ["Gasp!"] = "", -- A_Space_Adventure:desert01
 --      ["Gathering fruits all day long."] = "", -- A_Classic_Fairytale:queen
---      ["Gear information hidden"] = "", -- HedgeEditor
---      ["Gear information shown"] = "", -- HedgeEditor
 --      ["Gear Placement Tool"] = "", -- HedgeEditor
 --      ["General information"] = "", -- Continental_supplies
 --      ["General information:"] = "", -- Continental_supplies
@@ -721,7 +719,7 @@
 --      ["Get Dense Cloud out of the pit!"] = "", -- A_Classic_Fairytale:journey
 --      ["Get him, Spike!"] = "", -- A_Space_Adventure:desert01
         ["Get on over there and take him out!"] = "Kom derover og tag ham ud!",
---      ["Get on the head of the mole"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Get on the head of the mole."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Get past the flower."] = "", -- A_Classic_Fairytale:journey
 --      ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01
 --      ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood
@@ -759,7 +757,6 @@
         ["GO! GO! GO!"] = "GO! GO! GO!",
         ["Good birdy......"] = "God pipfugl......",
 --      ["Good bye!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Good Dude"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Good idea, they'll never find us there!"] = "", -- A_Classic_Fairytale:united
 --      ["Good job!"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Good job! Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -770,7 +767,7 @@
         ["Good so far!"] = "Godt indtil videre!",
         ["Good to go!"] = "Klar!",
 --      ["Good! You now control Cappy."] = "", -- Basic_Training_-_Movement
---      ["Go on top of the flower"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Go on top of the flower."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Go, quick!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Gorkij"] = "", -- A_Classic_Fairytale:journey
 --      ["Go surf!"] = "", -- WxW
@@ -793,7 +790,6 @@
 --      ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow
 --      ["Green"] = "", -- 
 --      ["Green Bananas"] = "", -- A_Space_Adventure:fruit01
---      ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Green double rings also give you a new flying saucer."] = "", -- A_Space_Adventure:ice02
 --      ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01
 --      ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01
@@ -803,11 +799,8 @@
 --      ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Greetings from the Navy, %s (%s), for being a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["Greetings, %s!"] = "", -- A_Classic_Fairytale:dragon
---      ["Greg"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
---      ["Grenade Group"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard
 --      ["Grenades explode after 1 to 5 seconds (you decide)."] = "", -- Basic_Training_-_Grenade
 --      ["Grenades with high bounciness bounce a lot and behave chaotic."] = "", -- Basic_Training_-_Grenade
---      ["Grenade Team"] = "", -- Basic_Training_-_Grenade
 --      ["Grenade Training"] = "", -- Basic_Training_-_Grenade
 --      ["Grenadiers"] = "", -- Basic_Training_-_Grenade
 --      ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor
@@ -848,7 +841,6 @@
 --      ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion
 --      ["Health Modification Mode"] = "", -- HedgeEditor
 --      ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor
---      ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
 --      ["Heavenly Defense"] = "", -- Tentacle_Terror
 --      ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united
         ["Heavy"] = "Tung",
@@ -861,6 +853,7 @@
 --      ["Hedgehog Projectile"] = "", -- Continental_supplies
 --      ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies
 --      ["Hedgehogs can not be deleted."] = "", -- HedgeEditor
+--      ["Hedgehogs left: %d"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Hedgehogs will be revived after their death."] = "", -- Mutant
 --      ["Hedgehogs will start in the first waypoint."] = "", -- Racer
 --      ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab
@@ -876,7 +869,6 @@
 --      ["Help Enabled"] = "", -- HedgeEditor
 --      ["Helpers: Each team starts with %d helper points"] = "", -- Battalion
 --      ["Helpers: Hogs will get 1 out of 2 helpers randomly each turn"] = "", -- Battalion
---      ["Help Hog Solo to find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Help me, Leaks!"] = "", -- A_Classic_Fairytale:journey
 --      ["Help me, please!!!"] = "", -- A_Classic_Fairytale:journey
 --      ["Help me, please!"] = "", -- A_Classic_Fairytale:journey
@@ -891,20 +883,20 @@
 --      ["Here you will find the current mission instructions."] = "", -- Basic_Training_-_Movement
 --      ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Heroic Wind"] = "", -- Continental_supplies
---      ["Hero Team"] = "", -- User_Mission_-_The_Great_Escape
 --      ["He's so brave..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["He was the lab assistant of Dr. Goodhogan, the inventor of the anti-gravity device."] = "", -- A_Space_Adventure:moon02
 --      ["He won't be selling us out anymore!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey, don't forget us! We still need to climb up!"] = "", -- A_Classic_Fairytale:family
 --      ["Hey, guys!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey guys!"] = "", -- A_Classic_Fairytale:united
---      ["Hey, Hog Solo! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey! I was supposed to collect it!"] = "", -- A_Space_Adventure:fruit02
+--      ["Hey, %s! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey, %s! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey
 --      ["Hidden"] = "", -- portal
 --      ["High Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["High Jump: [Backspace]"] = "", -- Basic_Training_-_Movement
+--      ["High Jump: Tap the [Curvy Arrow] shortly"] = "", -- Basic_Training_-_Movement
 --      ["--- Highland ---"] = "", -- Battalion
 --      ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander
 --      ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion
@@ -915,20 +907,24 @@
 --      ["Hill Guard"] = "", -- Bazooka_Battlefield
 --      ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01
 --      ["--- Hint ---"] = "", -- Battalion
---      ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
 --      ["Hint: Drilling holes should solve everything."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: Hold down [M] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: If this mission panel disappears, you can|see it again by hitting the Pause or Quit key."] = "", -- Basic_Training_-_Movement
 --      ["Hint: It might be a good idea to place a girder before starting to drill. Just saying."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: It might be easier if you vary the angle only slightly."] = "", -- Basic_Training_-_Bazooka
+--      ["Hint: Just select the parachute, it opens automatically when you fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion
 --      ["Hint: Launch the bazooka horizontally at full power."] = "", -- Basic_Training_-_Bazooka
---      ["Hint: Press [Esc] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Pause the game to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Select the blow torch, aim and press [Fire]. Press [Fire] again to stop."] = "", -- A_Classic_Fairytale:journey
 --      ["Hint: Select the low gravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey
+--      ["Hint: Select the rope, [Up] or [Down] to aim, [Attack] to fire, directional keys to move."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Select the Shoryuken and hit [Attack].|P.S.: You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: %s needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family
 --      ["Hint: The rope only bends around objects.|When it doesn't hit anything, it's always straight."] = "", -- Basic_Training_-_Rope
 --      ["Hint: To jump higher, wait a bit before you hit “High Jump” a second time."] = "", -- Basic_Training_-_Movement
+--      ["Hint: To place a girder, select it,|then use [Left] and [Right] to select angle and length,|then choose a location for the girder."] = "", -- A_Classic_Fairytale:shadow
 --      ["Hint: Use the quit key to see the team’s continent."] = "", -- Continental_supplies
 --      ["Hint: When you shorten the rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope
 --      ["Hint: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey
@@ -962,24 +958,11 @@
 --      ["Hogminator"] = "", -- A_Classic_Fairytale:family
 --      ["Hog nueve"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog octo"] = "", -- A_Space_Adventure:fruit03
---      ["Hogonauts"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Hog onze"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog Saturn"] = "", -- A_Space_Adventure:fruit03
 --      ["Hogs in sight!"] = "", -- Continental_supplies
 --      ["Hog Solo and GB"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hog Solo"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01, A_Space_Adventure:moon02
---      ["Hog Solo couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo escaped successfully!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo has to reach the last crates"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo has to refuel his saucer."] = "", -- A_Space_Adventure:moon01
---      ["Hog Solo lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
---      ["Hog Solo wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["- Hogs will be revived"] = "", -- Capture_the_Flag
 --      ["- Hogs will drop the flag when killed"] = "", -- Capture_the_Flag
 --      ["Hog two"] = "", -- A_Space_Adventure:fruit03
@@ -989,9 +972,7 @@
 --      ["Homing Bee"] = "", -- Construction_Mode
 --      ["Honda"] = "", -- 
 --      ["Honest Lee"] = "", -- A_Classic_Fairytale:enemy
---      ["Hook"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
 --      ["Hooks"] = "", -- 
-        ["Hooray!"] = "Hurra!",
 --      ["Hooray! I actually did it! Hogera is safe!"] = "", -- A_Space_Adventure:final
 --      ["Hooray! I've found it, now I have to get back to Captain Lime!"] = "", -- A_Space_Adventure:fruit02
 --      ["Hooray! You are a champion!"] = "", -- A_Space_Adventure:ice02
@@ -1007,7 +988,7 @@
 --      ["However, if you fail to do so, she dies a most violent death, just like your friend! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, if you fail to do so, she dies a most violent death! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, my mates don't agree with me on letting you go..."] = "", -- A_Classic_Fairytale:dragon
---      ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
+--      ["However, the army of %s is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
 --      ["How to Rope"] = "", -- Basic_Training_-_Rope
 --      ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen
 --      ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen
@@ -1027,7 +1008,6 @@
 --      ["I can't believe what I'm hearing!"] = "", -- A_Classic_Fairytale:backstab
 --      ["I can't let you go further because …"] = "", -- A_Classic_Fairytale:queen
 --      ["I can't wait any more, I have to save myself!"] = "", -- A_Classic_Fairytale:shadow
---      ["Ice"] = "", -- Basic_Training_-_Movement
 --      ["Ice Jake"] = "", -- A_Space_Adventure:ice01
 --      ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family
 --      ["Icy Girder: [3]"] = "", -- HedgeEditor
@@ -1085,7 +1065,6 @@
 --      ["I just found out that they have captured your princess!"] = "", -- A_Classic_Fairytale:family
 --      ["I just want the strange device you found!"] = "", -- A_Space_Adventure:ice01
 --      ["I just wonder where Ramon and Spiky disappeared..."] = "", -- A_Classic_Fairytale:journey
---      ["Ikeda"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["I know and I'm terribly sorry!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know, my hero!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know that your resources are low due to the battle but I'll send two of my best hogs to assist you."] = "", -- A_Space_Adventure:fruit02
@@ -1113,6 +1092,7 @@
 --      ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen
 --      ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united
 --      ["IMPORTANT: To see the mission panel again, hold the mission panel key."] = "", -- Basic_Training_-_Movement
+--      ["IMPORTANT: To see the mission panel again, pause the game."] = "", -- Basic_Training_-_Movement
 --      ["Impressive...you are still dry as the corpse of a hawk after a week in the desert..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["%i ms"] = "", -- Gravity
 --      ["I'm so glad this is finally over!"] = "", -- A_Space_Adventure:final
@@ -1271,7 +1251,6 @@
 --      ["Kill the traitor, %s, or spare his life!"] = "", -- A_Classic_Fairytale:backstab
 --      ["--- King ---"] = "", -- Battalion
 --      ["King"] = "", -- Battalion
---      ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing
 --      ["--- King Mode ---"] = "", -- Battalion
 --      ["Knight"] = "", -- Battalion
 --      ["Knives"] = "", -- 
@@ -1290,7 +1269,7 @@
 --      ["Launch some bazookas to destroy the targets!"] = "", -- Basic_Training_-_Bazooka
 --      ["Leader"] = "", -- A_Classic_Fairytale:enemy
 --      ["Leaderbot"] = "", -- A_Classic_Fairytale:queen
---      ["Lead the Green Bananas to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
+--      ["Lead your allies to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
 --      ["Leaks A Lot"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Leaks A Lot, depressed for killing his loved one, failed to save the village..."] = "", -- A_Classic_Fairytale:journey
 --      ["Leaks A Lot gave his life for his tribe! He should have survived!"] = "", -- A_Classic_Fairytale:first_blood
@@ -1305,7 +1284,6 @@
 --      ["Left/right: Choose crate contents"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode
---      ["Left Tong"] = "", -- Bazooka_Battlefield
 --      ["Legs"] = "", -- 
 --      ["Less tools, more fun"] = "", -- Battalion
 --      ["Lestat"] = "", -- portal
@@ -1334,18 +1312,19 @@
         ["Lively Lifeguard"] = "Livlig Livredder",
 --      ["Lonely Cries"] = "", -- Continental_supplies
 --      ["Lonely Cries: [Rise the water if no hog is in the circle and deal 6 damage to all enemy hogs.]"] = "", -- Continental_supplies
---      ["Lonely Hog"] = "", -- ClimbHome
 --      ["Long Jump: [Enter]"] = "", -- Basic_Training_-_Movement
+--      ["Long Jump: Tap the [Curvy Arrow] button for long"] = "", -- Basic_Training_-_Movement, A_Classic_Fairytale:first_blood
 --      ["Long Live The Queen"] = "", -- A_Classic_Fairytale:queen
 --      ["Look around: [Mouse movement]"] = "", -- Basic_Training_-_Movement
+--      ["Look around: [Tap or swipe on the screen]"] = "", -- Basic_Training_-_Movement
 --      ["Look, boss! There is the target!"] = "", -- A_Space_Adventure:moon01
 --      ["Look, I had no choice!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! There's more of them!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! We're surrounded by cannibals!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Looks like the whole world is falling apart!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Look to the left and do a backwards jump towards the mushroom."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Loon"] = "", -- The_Specialists
 --      ["Loopy"] = "", -- 
---      ["Lord Evil"] = "", -- Tentacle_Terror
 --      ["Losing Condition: Destroy"] = "", -- HedgeEditor
 --      ["Low Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander
@@ -1365,7 +1344,6 @@
 --      ["Mario"] = "", -- 
 --      ["Mark gears for win/lose conditions"] = "", -- HedgeEditor
 --      ["Mark/unmark gear: [Left Click]"] = "", -- HedgeEditor
---      ["Mark"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
 --      ["- Massive weapon bonus on first turn"] = "", -- Continental_supplies
 --      ["Max Citrus"] = "", -- A_Space_Adventure:fruit01
 --      ["Maybe you should try an easier map next time."] = "", -- Racer
@@ -1380,7 +1358,6 @@
 --      ["Mega kill!"] = "", -- Mutant
 --      ["Meiwes"] = "", -- A_Classic_Fairytale:backstab
 --      ["mikade"] = "", -- 
---      ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer
 --      ["Mindy"] = "", -- A_Classic_Fairytale:united
         ["Mine Deployer"] = "Mineudsætter",
 --      ["Mine Placement Mode"] = "", -- Construction_Mode
@@ -1399,12 +1376,12 @@
 --      ["Minion"] = "", -- A_Space_Adventure:moon01
 --      ["Minions"] = "", -- A_Space_Adventure:moon01
 --      ["Mission failed!"] = "", -- Big_Armory
-        ["MISSION FAILED"] = "MISSION MISLYKKEDES", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Mission failure in %d s"] = "", -- Big_Armory
+--      ["Mission"] = "", -- HedgeEditor
 --      ["Mission lost!"] = "", -- Basic_Training_-_Grenade
 --      ["Mission Panel"] = "", -- Basic_Training_-_Movement
 --      ["Mission panel: [M]"] = "", -- Basic_Training_-_Movement
-        ["MISSION SUCCESSFUL"] = "MISSION VAR SUCCESFULD", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+--      ["Mission succeeded!"] = "", -- portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, SimpleMission, HedgeEditor
 --      ["Mission won!"] = "", -- Basic_Training_-_Grenade
 --      ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02
 --      ["Mixed %d"] = "", -- WxW
@@ -1420,7 +1397,6 @@
 --      ["Monster kill!"] = "", -- Mutant
 --      ["Monsters"] = "", -- 
 --      ["Mooney"] = "", -- 
---      ["More Natives"] = "", -- A_Classic_Fairytale:epil
 --      ["Morris"] = "", -- 
 --      ["Most mines are not active."] = "", -- A_Space_Adventure:desert02
 --      ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01
@@ -1440,13 +1416,11 @@
 --      ["Nade Boy"] = "", -- Basic_Training_-_Grenade
 --      ["Nah, probably everyone was just stupid."] = "", -- A_Space_Adventure:final
 --      ["Name"] = "", -- A_Classic_Fairytale:queen
-        ["Nameless Heroes"] = "Navnløse Helte",
 --      ["Nancy Screw"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:queen
 --      ["Napalm"] = "", -- Construction_Mode
 --      ["Napalm Rocket"] = "", -- Continental_supplies
 --      ["Napalm rocket: [Fire a bomb with napalm!]"] = "", -- Continental_supplies
 --      ["Naranja Jed"] = "", -- A_Space_Adventure:fruit01
---      ["Natives"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Naughty Ninja"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Near a PAotH base on the moon ..."] = "", -- A_Space_Adventure:moon01
 --      ["Near Secret Base 17 of PAotH in the rural Hogland ..."] = "", -- A_Space_Adventure:cosmos
@@ -1541,11 +1515,8 @@
 --      ["Oh, my!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oh, my! I forgot something!"] = "", -- A_Classic_Fairytale:queen
 --      ["Oh, my! This is even more entertaining than I've expected!"] = "", -- A_Classic_Fairytale:backstab
-        ["Oh no! Just try again!"] = "Åh nej! Bare prøv igen!", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Oh no, not %s!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
---      ["Oh no, the Green Bananas have betrayed Hog Solo and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
-        ["Oh no! Time's up! Just try again."] = "Åh nej! Tiden er løbet ud! Bare prøv igen.", --Bazooka, Shotgun, SniperRifle
---      ["Oh no! You failed! Just try again."] = "", -- Basic_Training_-_Cluster_Bomb
+--      ["Oh no, the companions have betrayed %s and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
 --      ["Oh no! You have died. Try again!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Oh! Please spare me. You can take all my treasures!"] = "", -- A_Space_Adventure:ice01
 --      ["Oh, silly me! I forgot that I'm the shaman."] = "", -- A_Classic_Fairytale:backstab
@@ -1567,9 +1538,9 @@
 --      ["One shall not judge one by one's appearance!"] = "", -- A_Classic_Fairytale:epil
 --      ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oneye"] = "", -- portal
---      ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant
 --      ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant
+--      ["Only %s can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard
 --      ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01
@@ -1581,6 +1552,7 @@
 --      ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01
 --      ["Oops! You have selected the wrong hedgehog! Just try again."] = "", -- Basic_Training_-_Movement
 --      ["Open ammo menu: [Right click]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
+--      ["Open ammo menu: Tap the [Suitcase]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
 --      ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood
         ["Opposing Team: "] = "Modstander: ",
 --      ["Orange"] = "", -- 
@@ -1600,15 +1572,14 @@
 --      ["PAotH has sent explosives but unfortunately the trigger mechanism seems to be faulty!"] = "", -- A_Space_Adventure:cosmos
 --      ["Parachute"] = "", -- Continental_supplies
 --      ["Patches"] = "", -- 
-        ["Pathetic Resistance"] = "Patetisk Modstand", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02
 --      ["Pause: [P]"] = "", -- Basic_Training_-_Movement
+--      ["Pause: Tap the [Pause] button"] = "", -- Basic_Training_-_Movement
 --      ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW
 --      ["Penguin Roar"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hog’s health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Perfect! Now try to get the next crate without hurting yourself!"] = "", -- A_Classic_Fairytale:first_blood
-        ["Per-Hog Ammo"] = "Ammunition Per Pindsvin",
 --      ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh
 --      ["Personal best: %.3f seconds"] = "", -- A_Space_Adventure:ice02
 --      ["Per team weapons"] = "", -- Continental_supplies
@@ -1617,7 +1588,6 @@
 --      ["Physicist"] = "", -- HedgeEditor
 --      ["Piano Strike"] = "", -- Construction_Mode
 --      ["Pikachu"] = "", -- 
---      ["Pincer Knights"] = "", -- Bazooka_Battlefield
 --      ["Pings left: %d"] = "", -- Space_Invasion
 --      ["Pink"] = "", -- 
 --      ["Pirates"] = "", -- 
@@ -1670,8 +1640,6 @@
 --      ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion
 --      ["--- Points ---"] = "", -- Battalion
 --      ["--- Points Mode ---"] = "", -- Battalion
-        ["points"] = "point", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
---      ["point(s)"] = "", -- TargetPractice, Mutant
         ["Poison"] = "Gift",
 --      ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02
 --      ["Poisonous, deals no damage."] = "", -- Continental_supplies
@@ -1691,37 +1659,37 @@
 --      ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to fight"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos
-        ["Prepare yourself"] = "Gør dig klar",
+--      ["Prepare yourself, %s!"] = "", -- The_Specialists
 --      ["Press [Attack] (space bar by default) to start,|repeadedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] (space bar by default) to start,|repeatedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] to begin."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Attack] to confirm."] = "", -- Continental_supplies
 --      ["Press [Attack] to select this continent!"] = "", -- Continental_supplies
 --      ["Press [Left] and [Right] to change the difficulty."] = "", -- A_Classic_Fairytale:first_blood
---      ["Press [Left] or [Right] to move around, [Enter] to jump"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Press [Left] or [Right] to move around, [Long Jump] to jump forwards."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW
 --      ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW
+--      ["Press [M] to see the mission texts"] = "", -- Basic_Training_-_Movement
         ["Press [Precise] to skip intro"] = "Tryk på [Præcis] for at springe introen over",
 --      ["Press [Up] and [Down] to move between menu items.|Press [Attack], [Left], or [Right] to toggle."] = "", -- WxW
 --      ["Prestigious Pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Princess"] = "", -- A_Classic_Fairytale:family, A_Classic_Fairytale:journey
 --      ["Princess Peach"] = "", -- 
---      ["Private Nolak"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["Problems, dude? Chillax!"] = "", -- A_Classic_Fairytale:epil
 --      ["Professional pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professional stunt pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professor"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
 --      ["Professor Hogevil, then known as James Hogus, worked for PAotH back in my time."] = "", -- A_Space_Adventure:moon02
+--      ["Professor's Team"] = "", -- A_Space_Adventure:death01
 --      ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
---      ["Pro Killers"] = "", -- Big_Armory
 --      ["Protect the King: When the king dies, so does the team"] = "", -- Battalion
 --      ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Protect yourselves!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Purple"] = "", -- 
 --      ["Pyro"] = "", -- HedgeEditor, The_Specialists
 --      ["Pyromancer"] = "", -- Battalion
 --      ["Quit: [Esc]"] = "", -- Basic_Training_-_Movement
 --      ["Race complexity limit reached"] = "", -- Racer, TechRacer
+--      ["Race failed!"] = "", -- A_Space_Adventure:moon02
 --      ["Racer"] = "", -- Racer
 --      ["Racer tool"] = "", -- Racer
 --      ["Race"] = "", -- TrophyRace
@@ -1757,23 +1725,19 @@
 --      ["Replenishment: Weapons are restocked on turn start of a new hog"] = "", -- Highlander
 --      ["Repositioning Mode"] = "", -- HedgeEditor
 --      ["REPOSITIONING MODE"] = "", -- HedgeEditor
---      ["rescues"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Rescue the imprisoned PAotH team and get the fuel!"] = "", -- A_Space_Adventure:moon01
 --      ["Respawner"] = "", -- Construction_Mode
 --      ["Respawner: Resurrects dead hogs."] = "", -- Construction_Mode
 --      ["Resurrector"] = "", -- Construction_Mode
 --      ["Retract/Extend rope: [Up]/[Down]"] = "", -- Basic_Training_-_Rope
 --      ["- Return the enemy flag to your base to score"] = "", -- Capture_the_Flag
-        [" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = " - Returner fjendens flag til din base for at score | - Første hold til at erobre 3 flag vinder | - Du kan kun score når dit flag er ved din base | Pindsvin taber flaget hvis de dør eller drukner | - Tabte flag kan returneres eller generobres | - Pindsvin genopliver når de bliver dræbt",
 --      ["Return to Leaks A Lot!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Return to the mission menu by pressing the \"Go back\" button."] = "", -- A_Space_Adventure:cosmos
 --      ["Return to the Surface"] = "", -- A_Space_Adventure:fruit02
 --      ["Return to the training menu by pressing the “Go back” button."] = "", -- Basic_Training_-_Movement
---      ["Rhombus"] = "", -- Basic_Training_-_Movement
 --      ["Rider"] = "", -- portal
 --      ["Rifleman"] = "", -- Battalion
 --      ["Righteous Beard"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:queen, A_Classic_Fairytale:united
---      ["Right Tong"] = "", -- Bazooka_Battlefield
 --      ["Ripe"] = "", -- 
 --      ["Rise the water if nobody else is in the circle and deal 6 damage to all enemy hogs."] = "", -- Continental_supplies
 --      ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01
@@ -1782,8 +1746,8 @@
 --      ["Roof"] = "", -- WxW
 --      ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Rope Master"] = "", -- Basic_Training_-_Rope
---      ["Roper"] = "", -- SpeedShoppa
 --      ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
+--      ["Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Rope Team"] = "", -- Basic_Training_-_Rope
 --      ["Rope Training"] = "", -- Basic_Training_-_Rope
 --      ["Rope Weapons"] = "", -- Basic_Training_-_Rope
@@ -1797,7 +1761,6 @@
 --      ["Round limit:"] = "", -- TechRacer
 --      ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer
 --      ["Round's slowest lap: %.3fs by %s"] = "", -- TrophyRace
---      ["Rounds until Sudden Death: %d"] = "", -- Battalion
 --      ["RS1"] = "", -- A_Space_Adventure:fruit03
 --      ["RS2"] = "", -- A_Space_Adventure:fruit03
 --      ["Rubber"] = "", -- Construction_Mode, HedgeEditor
@@ -1823,10 +1786,17 @@
 --      ["Salvation was one step closer now..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Sam"] = "", -- A_Space_Adventure:cosmos
 --      ["Sandals?! I thought you left your ring!"] = "", -- A_Classic_Fairytale:queen
+--      ["%s and GB"] = "", -- A_Space_Adventure:fruit02
 --      ["%s and %s enter the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sandstorm"] = "", -- A_Space_Adventure:desert01
 --      ["Sandy"] = "", -- A_Space_Adventure:desert01
-        ["Save as many hapless hogs as possible!"] = "Red så mange uheldige pindsvin som muligt!",
+--      ["%s arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
+--      ["Save as many hogs as possible!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey
 --      ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow
 --      ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor
@@ -1838,9 +1808,9 @@
 --      ["Scallywag"] = "", -- 
 --      ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab
 --      ["Scenario"] = "", -- Big_Armory, portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape
---      ["Scenario failed!"] = "", -- SimpleMission
 --      ["Scientist"] = "", -- Battalion
 --      ["%s climbed home in %d seconds!"] = "", -- ClimbHome
+--      ["%s (contd.)"] = "", -- A_Classic_Fairytale:epil
 --      ["Score: %d"] = "", -- Space_Invasion
 --      ["Score goal: %d"] = "", -- Control
 --      ["Score graph"] = "", -- Mutant, Space_Invasion
@@ -1850,6 +1820,7 @@
 --      ["Scores"] = "", -- Mutant
 --      ["Scores:"] = "", -- Mutant
 --      ["Scoring: "] = "", -- Mutant
+--      ["%s couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
 --      ["Script parameter examples:"] = "", -- Gravity
 --      ["%s (+%d)"] = "", -- Battalion
 --      ["%s: %d"] = "", -- Capture_the_Flag, Control
@@ -1862,10 +1833,9 @@
 --      ["%s died … and lives again!"] = "", -- Construction_Mode
 --      ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome
 --      ["%s, %d sec"] = "", -- Continental_supplies
---      ["Search for the device with the help of the other hedgehogs "] = "", -- A_Space_Adventure:fruit02
+--      ["Search for the device with the help of the other hedgehogs."] = "", -- A_Space_Adventure:fruit02
 --      ["Searching in the dust"] = "", -- A_Space_Adventure:desert01
 --      ["Searching the stars!"] = "", -- A_Space_Adventure:cosmos
---      ["seconds"] = "", -- ClimbHome
 --      ["Seduction"] = "", -- Continental_supplies
 --      ["Seems like every time you take a \"walk\", the enemy finds us!"] = "", -- A_Classic_Fairytale:backstab
 --      ["See that crate farther on the right?"] = "", -- A_Classic_Fairytale:first_blood
@@ -1892,6 +1862,7 @@
 --      ["Select your continent with [Up]/[Down] or by selecting a representative weapon."] = "", -- Continental_supplies
 --      ["%s enters the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sergey"] = "", -- 
+--      ["%s escaped successfully!"] = "", -- A_Space_Adventure:fruit01
 --      ["Set bounciness: [Left Shift] + [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set detonation timer: [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set Health: [Left Click]"] = "", -- HedgeEditor
@@ -1915,10 +1886,12 @@
 --      ["%s has been killed before taking enough damage first."] = "", -- SimpleMission
 --      ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has been rescued from death"] = "", -- Construction_Mode
+--      ["%s has dropped the flag!"] = "", -- CTF_Blizzard
 --      ["%s has fallen victim to gravity."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has mutated! +2 points"] = "", -- Mutant
 --      ["%s has passed the best height of %s!"] = "", -- ClimbHome
 --      ["%s has scored!"] = "", -- Capture_the_Flag
+--      ["%s has to refuel the saucer."] = "", -- A_Space_Adventure:moon01
 --      ["%s hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil
 --      ["sheepluva"] = "", -- 
@@ -1935,8 +1908,6 @@
 --      ["Shinobi"] = "", -- 
 --      ["%s hit the ground."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Shoppa Love"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
---      ["Shoppa Union"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes, Challenge_-_Speed_Shoppa_-_ShoppaKing
---      ["Shoppers"] = "", -- SpeedShoppa
 --      ["Shotgun"] = "", -- Continental_supplies
 --      ["Sigh."] = "", -- A_Classic_Fairytale:epil
         ["Silly"] = "Fjollet",
@@ -1949,11 +1920,11 @@
 --      ["%s is now as poor as a church mouse"] = "", -- Construction_Mode
 --      ["%s is now a zombie hedgehog"] = "", -- Construction_Mode
 --      ["%s is suddenly low on ammo"] = "", -- Construction_Mode
---      ["Skip your turn to try again."] = "", -- Basic_Training_-_Rope
 --      ["Skulls"] = "", -- Bazooka_Battlefield
 --      ["Slimer"] = "", -- 
 --      ["Slippery"] = "", -- A_Classic_Fairytale:journey
 --      ["%s lost all the weapons"] = "", -- Construction_Mode
+--      ["%s lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
 --      ["Slot %d: %s"] = "", -- Frenzy
 --      ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy
 --      ["Slowpoke"] = "", -- 
@@ -1967,6 +1938,7 @@
 --      ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smugglers"] = "", -- A_Space_Adventure:desert01
+--      ["%s must collect the final crates."] = "", -- A_Space_Adventure:fruit02
 --      ["%s must skip this turn for rule violation."] = "", -- WxW
 --      ["Sneaks"] = "", -- Bazooka_Battlefield
 --      ["%s never got the ninja diploma."] = "", -- ClimbHome
@@ -1975,10 +1947,8 @@
 --      ["Sniper"] = "", -- HedgeEditor, The_Specialists
 --      ["Sniper Rifle"] = "", -- Continental_supplies
         ["Sniper Training"] = "Træning med Sniperriffel",
-        ["Sniperz"] = "Sniperz",
 --      ["So, as promised I have brought you where I think that the device you are looking for is hidden."] = "", -- A_Space_Adventure:fruit02
 --      ["So far, you had infinite ropes, but in the|real world, ropes are usually limited."] = "", -- Basic_Training_-_Rope
---      ["So Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["So, I believe that it's a good place to start."] = "", -- A_Space_Adventure:desert01
 --      ["So, I kindly ask for your help."] = "", -- A_Space_Adventure:fruit01
@@ -1988,11 +1958,12 @@
 --      ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03
 --      ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen
 --      ["Some weapons can be dropped from the rope."] = "", -- Basic_Training_-_Rope
---      ["Somewhere else on the planet of fruits, Captain Lime helps Hog Solo"] = "", -- A_Space_Adventure:fruit02
---      ["Somewhere else on the planet of fruits Hog Solo gets closer to the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, Captain Lime helps %s"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, %s gets closer to the device"] = "", -- A_Space_Adventure:fruit02
 --      ["Somewhere on the Planet of Fruits a terrible war is about to begin ..."] = "", -- A_Space_Adventure:fruit01
 --      ["Somewhere on the uninhabitable Death Planet ..."] = "", -- A_Space_Adventure:death01
 --      ["So, now I got the last part and I have your friends captured."] = "", -- A_Space_Adventure:death01
+--      ["So, %s, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So the princess was never heard of again ..."] = "", -- A_Classic_Fairytale:family
 --      ["So, uhmm, how did you manage to teleport them so far?"] = "", -- A_Classic_Fairytale:epil
 --      ["Sour"] = "", -- 
@@ -2093,8 +2064,6 @@
 --      ["Structure Placement Mode"] = "", -- Construction_Mode
 --      ["Structure Placer"] = "", -- Construction_Mode
 --      ["Stupid, stupid Hogerians!"] = "", -- A_Space_Adventure:final
---      ["Subject 1"] = "", -- portal
---      ["Subjects"] = "", -- portal
 --      ["Subtract %d"] = "", -- HedgeEditor
 --      ["--- Sudden Death ---"] = "", -- Battalion
 --      ["Summer Squash"] = "", -- A_Space_Adventure:fruit01
@@ -2111,7 +2080,7 @@
 --      ["Surfer! +15 points!"] = "", -- Space_Invasion
 --      ["Surfer!"] = "", -- WxW
 --      ["Surprise supplies: Get 1-3 random weapons each turn."] = "", -- Continental_supplies
---      ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:shadow
+--      ["Survive!"] = "", -- A_Classic_Fairytale:shadow
 --      ["%s violated the “All But Last” rule and will be penalized."] = "", -- WxW
 --      ["%s violated the “Kill The Leader” rule and will be penalized."] = "", -- WxW
 --      ["Swap place with a random enemy in the circle."] = "", -- Continental_supplies
@@ -2130,6 +2099,7 @@
 --      ["%s! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
 --      ["Swing, Leaks A Lot, on the wings of the wind!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Swing: [Left]/[Right]"] = "", -- Basic_Training_-_Rope
+--      ["%s wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome
 --      ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer
 --      ["switch"] = "", -- Continental_supplies
@@ -2143,6 +2113,7 @@
 --      ["Switch Hog"] = "", -- Construction_Mode
 --      ["Switch: Select weapon special"] = "", -- Continental_supplies
 --      ["Switch: Toggle crate radar"] = "", -- WxW
+--      ["%s won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Swords"] = "", -- Bazooka_Battlefield
 --      ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon
 --      ["%s, you may choose the rules."] = "", -- WxW
@@ -2151,6 +2122,8 @@
 --      ["Tails"] = "", -- 
 --      ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Tall Potato"] = "", -- A_Space_Adventure:fruit01
+--      ["Tap [Pause] to see the mission texts"] = "", -- Basic_Training_-_Movement
+--      ["Tap the “rotating arrow” button on the left|until you have selected Cappy, the hedgehog with the cap!"] = "", -- Basic_Training_-_Movement
 --      ["Target"] = "", -- HedgeEditor
 --      ["Target Placement Mode"] = "", -- Construction_Mode
 --      ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor
@@ -2166,15 +2139,18 @@
 --      ["Tatters"] = "", -- 
         ["Team %d: "] = "Hold %d: ",
 --      ["Team %d"] = "", -- SimpleMission
+--      ["Team highscore: %d"] = "", -- Utils
 --      ["Team Identity Mode"] = "", -- HedgeEditor
 --      ["TEAM IDENTITY MODE"] = "", -- HedgeEditor
---      ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
+--      ["Team lowscore: %d"] = "", -- Utils
 --      ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion
+--      ["Team's best time: %.3fs"] = "", -- Utils
 --      ["Team Scores:"] = "", -- Control
 --      ["Team scores:"] = "", -- Space_Invasion
+--      ["Team's longest time: %.3fs"] = "", -- Utils
+--      ["Team's top accuracy: %d%"] = "", -- Utils
 --      ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2
 --      ["Teamwork"] = "", -- User_Mission_-_Teamwork
---      ["Team Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
 --      ["TechRacer"] = "", -- TechRacer
 --      ["Teleporation Node"] = "", -- Construction_Mode
 --      ["Teleportation Mode"] = "", -- Construction_Mode
@@ -2266,11 +2242,12 @@
 --      ["The forgotten continent"] = "", -- Continental_supplies
 --      ["The giant umbrella from the last crate should help break the fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Great Escape"] = "", -- User_Mission_-_The_Great_Escape
---      ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01
+--      ["- The green target must survive"] = "", -- HedgeEditor
+--      ["- The green targets must survive"] = "", -- HedgeEditor
 --      ["The guardian"] = "", -- A_Classic_Fairytale:shadow
 --      ["The hardships of the war turned %s (%s) into a killing machine: %d invaders destroyed in one round!"] = "", -- Space_Invasion
+--      ["The health of your current hedgehog|is shown at the top right corner."] = "", -- Basic_Training_-_Movement
 --      ["The hedgehog with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant
---      ["The Hogies"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["The Hospital"] = "", -- 
 --      ["The Individualist"] = "", -- A_Classic_Fairytale:shadow
 --      ["Their buildings were very primitive back then, even for an uncivilised island."] = "", -- A_Classic_Fairytale:united
@@ -2288,7 +2265,6 @@
 --      ["The Mutant has super-weapons and a lot of health."] = "", -- Mutant
 --      ["The Mutant loses health quickly, but gains health by killing."] = "", -- Mutant
 --      ["The Mutant loses health quickly if he doesn't keep scoring kills."] = "", -- Mutant
-        ["The Nameless One"] = "Den Navnløse Ene",
 --      ["The Navy greets %s for managing to get in a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["The next 4 times you play the \"The last encounter\" mission you'll get 20 more hit points and a laser sight."] = "", -- A_Space_Adventure:death02
 --      ["The next crate is an utility crate."] = "", -- Basic_Training_-_Movement
@@ -2302,6 +2278,7 @@
 --      ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil
 --      ["The oppression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
 --      ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
+--      ["The other hog has died, he should have survived!"] = "", -- A_Space_Adventure:moon02
 --      ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Police"] = "", -- 
 --      ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -2326,7 +2303,7 @@
 --      ["The Showdown"] = "", -- A_Classic_Fairytale:shadow
 --      ["The Slaughter"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:first_blood
 --      ["The Society of Perfectionists greets %s (%s): No misses and %d hits in its best round."] = "", -- Space_Invasion
-        ["THE SPECIALISTS"] = "SPECIALISTERNE",
+--      ["The Specialists: Each hedgehog starts with its own weapon set"] = "", -- The_Specialists
 --      ["The spinning arrows above your hedgehog show|which hedgehog is selected right now."] = "", -- Basic_Training_-_Movement
 --      ["The spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
@@ -2374,7 +2351,6 @@
 --      ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["This also increases the effectiveness of Medicine."] = "", -- Continental_supplies
 --      ["This game wasn’t really exciting."] = "", -- Space_Invasion
---      ["This Hog Solo is so naive! When he returns I'll shoot him and keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This is a new personal best, congratulations!"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert02, A_Space_Adventure:fruit03
 --      ["This is a new personal best time, congratulations!"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["This is Cappy."] = "", -- Basic_Training_-_Movement
@@ -2392,6 +2368,7 @@
         ["This rain is really something..."] = "Det her regnvejr er virkelig noget...",
 --      ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome
 --      ["This seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01
+--      ["This %s is so naive! I'm going to shoot this fool so I can keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This was an awesome performance! But this challenge can be finished with even just one RC plane. Can you figure out how?"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["This will be fun!"] = "", -- A_Classic_Fairytale:enemy
 --      ["This will be useful when I need a new platform or if I want to rise."] = "", -- portal
@@ -2432,11 +2409,11 @@
 --      ["To begin with the training, hit the attack key!"] = "", -- Basic_Training_-_Movement
 --      ["To begin with the training, select the bazooka from the ammo menu!"] = "", -- Basic_Training_-_Bazooka
 --      ["To begin with the training, select the grenade from the ammo menu!"] = "", -- Basic_Training_-_Grenade
+--      ["To begin with the training, tap the attack button!"] = "", -- Basic_Training_-_Movement
 --      ["To finish hedgehog selection, just do anything|with him, like walking."] = "", -- Basic_Training_-_Movement
 --      ["To get over the next obstacles, keep some distance from the wall before you back jump."] = "", -- Basic_Training_-_Movement
 --      ["To get over the water, you have to do multiple|rope shots and swings."] = "", -- Basic_Training_-_Rope
 --      ["Toggle Editing Weapons and Tools: [Precise]+[2]"] = "", -- HedgeEditor
---      ["Toggle Gear Information: [Precise]+[3]"] = "", -- HedgeEditor
 --      ["Toggle Help: [Precise]+[1]"] = "", -- HedgeEditor
 --      ["Toggle Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Toggle Shield: [Long jump]"] = "", -- Space_Invasion
@@ -2446,14 +2423,14 @@
 --      ["Too bad! Then you should really leave!"] = "", -- A_Space_Adventure:fruit01
 --      ["Too slow! Try again ..."] = "", -- A_Space_Adventure:moon02
 --      ["Top-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"] = "", -- A_Classic_Fairytale:shadow
 --      ["To reach higher ground, walk to a ledge, look to the left, then do a back jump."] = "", -- Basic_Training_-_Movement
 --      ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey
 --      ["To the caves..."] = "", -- A_Classic_Fairytale:united
 --      ["Touch all waypoints as fast as you can!"] = "", -- Racer
---      ["To win the game, Hog Solo has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
+--      ["- Touch the sparkles near your base to teleport"] = "", -- CTF_Blizzard
+--      ["To win the game, %s has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
 --      ["To win the game you had to collect the 2 crates with no specific order."] = "", -- A_Space_Adventure:desert01
---      ["To win the game you have to eliminate all your enemies."] = "", -- A_Space_Adventure:death01
+--      ["To win the game you have to eliminate Professor Hogevil."] = "", -- A_Space_Adventure:death01
 --      ["To win the game you have to find the right crate."] = "", -- A_Space_Adventure:desert01
 --      ["To win the game you have to go next to Thanta."] = "", -- A_Space_Adventure:ice01
 --      ["To win the game you have to go to the surface."] = "", -- A_Space_Adventure:desert02
@@ -2461,13 +2438,10 @@
 --      ["To win the game you have to stand next to Thanta."] = "", -- A_Space_Adventure:ice01
         ["Toxic Team"] = "Giftigt Hold", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Track completed!"] = "", -- Racer, TechRacer
---      ["Trainee"] = "", -- TargetPractice
 --      ["Training"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Training complete!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Training Team"] = "", -- TargetPractice
 --      ["Traitors"] = "", -- A_Classic_Fairytale:epil
 --      ["Traitors don't get to shout around here!"] = "", -- A_Classic_Fairytale:epil
---      ["Trapped"] = "", -- Basic_Training_-_Movement
 --      ["Trapper"] = "", -- HedgeEditor
 --      ["Travel carefully as your fuel is limited"] = "", -- A_Space_Adventure:cosmos
 --      ["Travel to all the neighbor planets and collect all the pieces"] = "", -- A_Space_Adventure:cosmos
@@ -2484,7 +2458,6 @@
 --      ["Try to land softly, as you can still take fall damage!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Try to protect the chief! You won't lose if he dies, but it is advised that he survives."] = "", -- A_Classic_Fairytale:united
 --      ["Try to reach and destroy the next target quickly."] = "", -- Basic_Training_-_Rope
-        ["T_T"] = "T_T",
 --      ["Tumbler"] = "", -- Tumbler
 --      ["Turn around: [Left Shift] + [Left]/[Right]"] = "", -- Basic_Training_-_Movement
 --      ["Turning Around"] = "", -- Basic_Training_-_Movement
@@ -2503,7 +2476,6 @@
 --      ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy
 --      ["Ukemi"] = "", -- 
 --      ["Ultra kill!"] = "", -- Mutant
---      ["Ultrasoldier"] = "", -- Big_Armory
 --      ["unC0Rr"] = "", -- 
 --      ["Under Construction"] = "", -- A_Classic_Fairytale:shadow
 --      ["Under normal circumstances we could easily defeat them but we have kindly sent most of our men to the Kingdom of Sand to help with the annual dusting of the king's palace."] = "", -- A_Space_Adventure:fruit01
@@ -2528,7 +2500,6 @@
         ["Unit"] = "Enhed",
 --      ["Unlike bazookas, grenades are not influenced by wind."] = "", -- Basic_Training_-_Grenade
 --      ["Unlimited Attacks: Attacks don't end your turn"] = "", -- User_Mission_-_Diver, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree
-        ["Unlimited Attacks"] = "Uendelige Angreb",
 --      ["Unlucky Sods"] = "", -- User_Mission_-_Rope_Knock_Challenge
         ["Unstoppable!"] = "Ustoppelig!",
 --      ["Unsuspecting Louts"] = "", -- User_Mission_-_Rope_Knock_Challenge
@@ -2543,13 +2514,14 @@
 --      ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood
         ["User Challenge"] = "Brugerudfordring",
 --      ["!"] = "", -- User_Mission_-_Dangerous_Ducklings
+--      ["User Mission"] = "", -- HedgeEditor
 --      ["Use the attack key twice to change the flying saucer while being in air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the attack key twice to change the flying saucer while floating in mid-air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the bazooka and the flying saucer to get the freezer."] = "", -- A_Space_Adventure:ice01
 --      ["Use the flying saucer from the crate to fly to the moon."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly the other planets."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly to the other planets."] = "", -- A_Space_Adventure:cosmos
---      ["Use the parachute ([Space] while in air) to get the next crate"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Use the parachute to get the next crate."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Use the portal gun to get to the next crate, then use the new gun to get to the final destination!|"] = "", -- A_Classic_Fairytale:dragon
 --      ["Use the RC plane and destroy the all the targets."] = "", -- A_Space_Adventure:desert03
 --      ["Use the rope in order to catch the blue hedgehog"] = "", -- A_Space_Adventure:moon02
@@ -2583,7 +2555,6 @@
 --      ["Victory Condition: Collect"] = "", -- HedgeEditor
 --      ["Victory Condition: Destroy"] = "", -- HedgeEditor
 --      ["Victory for %s!"] = "", -- Capture_the_Flag
-        ["Victory for the "] = "Sejr for ", -- CTF_Blizzard, Capture_the_Flag
 --      ["Violence is not the answer to your problems!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos
 --      ["Vladimir"] = "", -- 
@@ -2602,9 +2573,6 @@
 --      ["Walls left: %d"] = "", -- WxW
 --      ["Wall to wall"] = "", -- WxW
 --      ["Waluigi"] = "", -- 
---      ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Wannabe Ropers"] = "", -- Basic_Training_-_Rope
---      ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Wario"] = "", -- 
 --      ["Warming Up"] = "", -- Basic_Training_-_Grenade
 --      ["Warning: Fire cake detected"] = "", -- ClimbHome
@@ -2634,7 +2602,6 @@
 --      ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion
 --      ["Weapon specials: Some weapons have special modes (see weapon description)."] = "", -- Continental_supplies
 --      ["Weapons reset: The weapons are reset after each turn."] = "", -- WxW
-        ["Weapons Reset"] = "Våben Nulstillede",
 --      ["We are indeed."] = "", -- A_Classic_Fairytale:backstab
 --      ["We can't defeat them!"] = "", -- A_Classic_Fairytale:shadow
 --      ["We can't hold them up much longer!"] = "", -- A_Classic_Fairytale:united
@@ -2650,9 +2617,9 @@
 --      ["We have to hurry! Are you armed?"] = "", -- A_Space_Adventure:moon01
 --      ["We have to protect the village!"] = "", -- A_Classic_Fairytale:united
 --      ["We have to unite and defeat those cylergs!"] = "", -- A_Classic_Fairytale:enemy
---      ["Welcome Hog Solo, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome home! Please take a seat"] = "", -- ClimbHome
 --      ["Welcome, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey
+--      ["Welcome, %s, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome to the Death Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
@@ -2819,16 +2786,16 @@
 --      ["You can’t open a portal on the blue surface."] = "", -- portal
 --      ["You can use the other 2 hogs to assist you."] = "", -- A_Space_Adventure:fruit02
 --      ["You can use the rope to reach new places."] = "", -- Basic_Training_-_Rope
---      ["You choose well, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You choose well, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You completed the mission in %.3f seconds."] = "", -- A_Space_Adventure:ice02
 --      ["You completed the mission in %d rounds."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03
---      ["You couldn't have come to a worse time, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You couldn't have come to a worse time, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You couldn't possibly believe that after refusing my offer I'd just let you go!"] = "", -- A_Classic_Fairytale:journey
         ["You'd almost swear the water was rising!"] = "Man kunne næsten sværge på at vandet steg!",
 --      ["You'd better watch your steps..."] = "", -- A_Classic_Fairytale:journey
 --      ["You defended yourself against Captain Lime."] = "", -- A_Space_Adventure:fruit02
---      ["You defended yourself against the Fruit Assassins."] = "", -- A_Space_Adventure:fruit02
---      ["You did great, Hog Solo! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
+--      ["You defended yourself against %s."] = "", -- A_Space_Adventure:fruit02
+--      ["You did great, %s! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
 --      ["You did not make it in time, try again!"] = "", -- Basic_Training_-_Rope
 --      ["You don't deserve my sacrifice!"] = "", -- A_Classic_Fairytale:queen
 --      ["You drove Professor Hogevil away."] = "", -- A_Space_Adventure:moon01
@@ -2844,12 +2811,12 @@
 --      ["You got me!"] = "", -- A_Space_Adventure:moon02
 --      ["You had %.1fs remaining on the clock (+%d points)."] = "", -- TargetPractice
 --      ["You had %.2fs remaining on the clock (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle
---      ["You had %d additional flying saucers left."] = "", -- A_Space_Adventure:ice02
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: you might want to use some mines..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: You might want to use some mines ..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01
 --      ["You have activated Switch Hedgehog!"] = "", -- Basic_Training_-_Movement
 --      ["You have beaten the challenge!"] = "", -- ClimbHome
+--      ["You have beaten the team record, congratulations!"] = "", -- Utils
 --      ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab
 --      ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united
 --      ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01
@@ -2868,7 +2835,6 @@
 --      ["You have eliminated all visible enemy hedgehogs!"] = "", -- A_Space_Adventure:fruit01
 --      ["You have eliminated Professor Hogevil."] = "", -- A_Space_Adventure:moon01
 --      ["You have eliminated the evil minions."] = "", -- A_Space_Adventure:moon01
---      ["You have eliminated the whole evil team. You're pretty tough!"] = "", -- A_Space_Adventure:moon01
 --      ["You have escaped successfully."] = "", -- A_Space_Adventure:desert02
 --      ["You have failed to complete your task, young one!"] = "", -- A_Classic_Fairytale:journey
 --      ["You have failed to save the tribe!"] = "", -- A_Classic_Fairytale:backstab
@@ -2922,6 +2888,7 @@
 --      ["You have to travel again"] = "", -- A_Space_Adventure:cosmos
 --      ["You have to try again!"] = "", -- A_Space_Adventure:cosmos
 --      ["You have triggered the secret Do-Not-Rope-to-the-Moon Defense System."] = "", -- A_Space_Adventure:cosmos
+--      ["You have unlocked the target radar!"] = "", -- TargetPractice
 --      ["You have used %d flying saucers."] = "", -- A_Space_Adventure:ice02
 --      ["You have used %d RC planes."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["You have used only 1 RC plane. Outstanding!"] = "", -- User_Mission_-_RCPlane_Challenge
@@ -2940,10 +2907,9 @@
 --      ["You'll have only 2 watermelon bombs during the game."] = "", -- A_Space_Adventure:fruit03
 --      ["You'll have only one RC plane at the start of the mission."] = "", -- A_Space_Adventure:desert03
 --      ["You'll have to eliminate Captain Lime at the end."] = "", -- A_Space_Adventure:fruit02
---      ["You'll have to eliminate the Fruit Assassins at the end."] = "", -- A_Space_Adventure:fruit02
+--      ["You'll have to eliminate %s at the end."] = "", -- A_Space_Adventure:fruit02
 --      ["You'll lose if you die or if your time is up."] = "", -- A_Space_Adventure:moon02
 --      ["You'll see what I mean!"] = "", -- A_Classic_Fairytale:enemy
---      ["You lose!"] = "", -- Basic_Training_-_Sniper_Rifle, Big_Armory, Basic_Training_-_Bazooka, TargetPractice, ClimbHome
 --      ["You lost your target, try again!"] = "", -- TargetPractice
 --      ["You may find it handy."] = "", -- A_Space_Adventure:cosmos
 --      ["You may only attack from a rope!"] = "", -- WxW
@@ -2965,8 +2931,7 @@
 --      ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice
 --      ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice
 --      ["Your ammo is limited this time."] = "", -- Basic_Training_-_Bazooka
---      ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy
---      ["Your deaths will be avenged, Natives!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Your deaths will be avenged, %s!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Your death will not be in vain, Dense Cloud!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You're a coward!"] = "", -- A_Classic_Fairytale:queen
 --      ["You're...alive!? But we saw you die!"] = "", -- A_Classic_Fairytale:backstab
@@ -2994,21 +2959,21 @@
 --      ["Your next task is to collect some crates by using the rope!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Your personal best time so far: %.3f seconds"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["Your rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["You saved %d of 8 Hapless Hogs."] = "", -- User_Mission_-_That_Sinking_Feeling
+--      ["Your rope is gone! Try again!"] = "", -- Basic_Training_-_Rope
+--      ["You saved %d of 8 hegehogs."] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen
 --      ["You see the wind strength at the bottom right corner."] = "", -- Basic_Training_-_Bazooka
+--      ["You see the wind strength at the top."] = "", -- Basic_Training_-_Bazooka
 --      ["You should have known that we don't rely on meatbags!"] = "", -- A_Classic_Fairytale:queen
 --      ["You should know this more than anyone, Leaks!"] = "", -- A_Classic_Fairytale:queen
 --      ["You speak great truth, Hannibal. Here, take a sip!"] = "", -- A_Classic_Fairytale:epil
 --      ["You've been assaulting us, we have been just defending ourselves!"] = "", -- A_Classic_Fairytale:enemy
-        ["You've failed. Try again."] = "Det lykkedes dig ikke. Prøv igen.",
         ["You've reached the goal!| |Time: "] = "Du har nået målet!| |Tid: ",
 --      ["You will be avenged!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You will fail if you run out of ammo and there are still targets available."] = "", -- A_Space_Adventure:desert03
 --      ["You will gain some extra ammo from the crates the next time you play the \"Getting to the device\" mission."] = "", -- A_Space_Adventure:fruit03
 --      ["You will play every 3 turns."] = "", -- A_Space_Adventure:fruit01
 --      ["- You will recieve 2-4 weapons on each kill! (Even on own hogs)"] = "", -- Continental_supplies
---      ["You win!"] = "", -- Big_Armory
 --      ["You won't believe what happened to me!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Yuck! I bet they'll keep worshipping her even after I save the village!"] = "", -- A_Classic_Fairytale:family
 --      ["Yumme Gunpowder"] = "", -- 
@@ -3016,6 +2981,7 @@
 --      ["Zombie"] = "", -- 
 --      ["Zombi"] = "", -- portal
         ["'Zooka Team"] = "'Zooka-hold",
---      ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
+--      ["Zoom: [Pinch] with 2 fingers"] = "", -- Basic_Training_-_Movement
+--      ["Zoom: [Rotate mouse wheel]"] = "", -- Basic_Training_-_Movement
 --      ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen
 }
--- a/share/hedgewars/Data/Locale/de.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/de.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -34,7 +34,6 @@
 ["Above-average pilot"]="Überdurchschnittlicher Pilot",
 ["Accuracy Bonus! +15 points"] = "Präzisionsbonus! +15 Punkte", -- Space_Invasion
 ["Accuracy bonus: +%d points"]="Präzisions-Bonus: +%d Punkte",
-["Ace"]="Ass",
 ["Achievement gotten: %s"] = "Auszeichnung erhalten: %s", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_That_Sinking_Feeling, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, Tumbler
 ["A Classic Fairytale"]="Ein klassisches Märchen",
 ["A crate critical to this mission has been destroyed."] = "Eine missionskritische Kiste wurde zerstört.", -- SimpleMission
@@ -53,7 +52,6 @@
 ["After you killed an enemy, you'll lose the weapon that he is named after."] = "Wenn du einen Feind tötest, verlierst du die Waffe, nach der er benannt wurde.", -- A_Space_Adventure:death02
 ["After you left the moon, my other loyal minions came and resurrected me so I could complete my master plan."] = "Nachdem du den Mond verlassen hast, kamen meine anderen treuen Gehilfen und haben mich wiederbelebt, damit ich meinen Masterplan vollenden kann.", -- A_Space_Adventure:death01
 ["Again with the 'cannibals' thing!"]="Nicht schon wieder dieser »Kannibalen«-Unfug!",
-["a Hedgewars mini-game"]="ein Hedgewars Mini-Spiel",
 ["A Hedgewars minigame"] = "Ein Hedgewars-Minispiel", -- Capture_the_Flag
 ["A Hedgewars mini-game"] = "Ein Hedgewars-Minispiel", -- Racer, Space_Invasion, TechRacer, Tumbler
 ["A Hedgewars tag game"] = "Ein Hedgewars-Fangenspiel", -- Mutant
@@ -75,7 +73,7 @@
 ["All But Last: You must not solely attack the team with the least health"] = "Nicht Den Letzten: Du darfst das schwächste Team nicht einzeln angreifen", -- WxW
 ["All gone...everything!"]="Alles fort, alles!",
 ["Allies"]="Verbündete",
-["All right, I'll admit it!"] = "Okay, ich geb's zu!", -- A_Classic_Fairytale:queen
+["All right, I'll admit it!"] = "Okay, ich geb’s zu!", -- A_Classic_Fairytale:queen
 ["All right, we just need to get to the other side of the island!"]="Okay, wir müssen einfach nur auf die andere Seite der Insel gelangen!",
 ["All right, you got me!"] = "Richtig, du hast mich ertappt!", -- A_Classic_Fairytale:queen
 ["All the other places are protected by our flight-inhibiting weapons."] = "All die anderen Orte werden von unseren flugverhindernden Waffen geschützt.", -- A_Space_Adventure:fruit01
@@ -154,13 +152,14 @@
 ["As you've seen, the dropped grenade roughly fell into your flying direction."] = "Wie du gesehen hast, fällt die Granate ungefähr in deine Flugrichtung.", -- Basic_Training_-_Flying_Saucer
 ["Athlete"]="Athlet",
 ["Attack: Activate"] = "Angriff: Aktivieren", -- Racer
-["Attack Captain Lime before he attacks back"]="Greif Leutnant Limone an, bevor er angreift.",
+["Attack Captain Lime before he attacks back."] = "Greif Leutnant Limone an, bevor er dich angreift.", -- A_Space_Adventure:fruit02
 ["Attack From Rope: %s"] = "Angriff Vom Seil: %s", -- WxW
 ["Attack From Rope: You may only attack from a rope."] = "Angriff Vom Seil: Du darfst nur vom Seil angreifen.", -- WxW
 ["Attack rule: %s"] = "Angriffsregel: %s", -- WxW
 ["Attack: Select this continent"] = "Angreifen: Diesen Kontinent wählen", -- Continental_supplies
 ["Attack: [Space]"] = "Angreifen: [Leertaste]", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
-["Attack the assassins before they attack back"]="Greif die Assassinen an, bevor sie angreifen.",
+["Attack: Tap the [Bomb]"] = "Angreifen: [Bombe] antippen", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
+["Attack the assassins before they attack back."] = "Greif die Assassinen an, bevor sie es tun.", -- A_Space_Adventure:fruit02
 ["Attack: Throw ball"] = "Angriff: Ball werfen", -- Knockball
 ["At the end of the game your health was "]="Am Ende des Spiels war deine Gesundheit ",
 ["At the end of the game your health was %d."] = "Am Ende des Spiels hattest du %d Gesundheit.", -- A_Space_Adventure:ice01
@@ -170,16 +169,18 @@
 ["Available weapon specials:"] = "Verfügbare Waffenextras:", -- Continental_supplies
 ["Average pilot"]="Durchschnittlicher Pilot",
 ["Avoid bazookas, red and blue invaders."] = "Weiche Bazookas und den roten und blauen Invasoren aus.", -- Space_Invasion
-["Avoid the mines!"] = "Weich den Minen aus!", -- Basic_Training_-_Rope
 ["Axes"] = "Äxter", -- Bazooka_Battlefield
 ["Aye! Fellow! Let me exit this chamber of doom!"] = "Aye! Leute! Lasst mich aus dieser Kammer des Schreckens hinaus!", -- A_Classic_Fairytale:epil
 ["Back Breaker"]="Rückenbrecher",
 ["Back in the village, after telling the villagers about the threat..."]="Zurück im Dorf, nachdem die Dorfbewohner vor der Gefahr gewarnt worden sind …",
 ["Back in the village, the two tribes finally started to live in harmony."] = "Zurück im Dorf lebten die beiden Stämme endlich wieder in Frieden.", -- A_Classic_Fairytale:epil
 ["Back Jump: [Backspace] ×2"] = "Rückwärtssprung: [Rücktaste] ×2", -- Basic_Training_-_Movement
+["Back Jump: Double-tap the [Curvy Arrow]"] = "Rückwärtssprung: [Krummen Pfeil] doppelt antippen", -- Basic_Training_-_Movement
 ["Back Jumping (1/2)"] = "Rückwärtsspringen (1/2)", -- Basic_Training_-_Movement
 ["Back Jumping (2/2)"] = "Rückwärtsspringen (2/2)", -- Basic_Training_-_Movement
 ["Backstab"]="Verrat",
+["Backwards jump: Press [Backspace] twice"] = "Rückwärtssprung: Drück [Rücktaste] doppelt", -- A_Classic_Fairytale:first_blood
+["Backwards jump: Tap the [Curvy Arrow] twice"] = "Rückwärtssprung: [Krummen Pfeil] doppelt antippen", -- A_Classic_Fairytale:first_blood
 ["Bacon"] = "Speck", -- 
 ["Bad Guy"] = "Böser Junge", -- User_Mission_-_The_Great_Escape
 ["Badmad"] = "Fies und böse", -- portal
@@ -211,7 +212,6 @@
 ["Bazooka Battlefield"] = "Bazookaschlachtfeld", -- Bazooka_Battlefield
 ["Bazooka Master"] = "Bazookameister", -- Basic_Training_-_Bazooka
 ["Bazookas are influenced by wind."] = "Bazookas werden vom Wind beeinflusst.", -- Basic_Training_-_Bazooka
-["Bazooka Team"] = "Bazooka-Team", -- Basic_Training_-_Bazooka
 ["Bearded Beast"] = "Bärtiges Biest", -- 
 ["Be careful, the future of Hogera is in your hands!"]="Sei vorsichtig, die Zukunft von Hogera liegt in deinen Händen!",
 ["Be careful, your fuel is limited from now on!"] = "Vorsichtig, dein Treibstoff ist ab jetzt begrenzt!", -- Basic_Training_-_Flying_Saucer
@@ -223,7 +223,7 @@
 ["Besides, why would I choose certain death?"] = "Außerdem, warum sollte ich den sicheren Tod wählen?", -- A_Classic_Fairytale:queen
 ["Best team times: "] = "Team-Bestzeiten: ", -- Racer, TechRacer
 ["Better get yourself another health crate to heal your wounds."] = "Hol dir besser noch eine Gesundheitskiste, um deine Wunden zu heilen.", -- Basic_Training_-_Movement
-["Better luck next time!"]="Vielleicht klappt's beim nächsten Mal!",
+["Better luck next time!"]="Vielleicht klappt’s beim nächsten Mal!",
 ["Better Safe Than Sorry"] = "Sicher ist sicher", -- A_Space_Adventure:desert02
 ["Beware, any damage taken will stay until you complete the moon's main mission"]="Achtung, jeglicher Schaden, den du nimmst, wird bleiben, bis du die Hauptmission des Mondes fertiggestellt hast.",
 ["Beware of mines: They explode after 3 seconds."] = "Vorsicht vor Minen: Sie explodieren nach 3 Sekunden.", -- A_Classic_Fairytale:journey
@@ -243,7 +243,6 @@
 ["Bloodpie"]="Blutkuchen",
 ["Bloodrocutor"]="Blutfrierer",
 ["Bloodsucker"]="Blutsauger",
-["Bloody Rookies"]="Blutige Anfänger",
 ["BlowTorch"]="Schweißbrenner",
 ["Blue"] = "Blau", -- 
 ["Blue Team"]="Blaues Team",
@@ -328,8 +327,10 @@
 ["Challenge"]="Herausforderung",
 ["Challenge Objectives"]="Herausforderungsziele",
 ["Challenge objectives"] = "Herausforderungsziele", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit03, A_Space_Adventure:ice02, A_Space_Adventure:moon02
-["Challenge over!"] = "Herausforderung beendet!", -- User_Mission_-_Rope_Knock_Challenge
+["Challenge over!"] = "Herausforderung vorbei!", -- User_Mission_-_Rope_Knock_Challenge
+["Change bounciness: Tap [B]"] = "Sprungkraft ändern: [B] antippen", -- Basic_Training_-_Grenade
 ["Change Content: [Left], [Right]"]="Inhalt ändern: [Links], [Rechts]",
+["Change detonation timer: Tap the [Clock]"] = "Explosionszeitzünder einstellen: [Uhr] antippen", -- Basic_Training_-_Grenade, A_Classic_Fairytale:shadow
 ["Change direction: [Left]/[Right]"] = "Richtung ändern: [Links]/[Rechts]", -- Basic_Training_-_Grenade
 ["Change Health Boost: [Left], [Right]"]="Gesundheitsschub ändern: [Links], [Rechts]",
 ["Change Health: [Left], [Right]"]="Gesundheit ändern: [Links], [Rechts]",
@@ -353,6 +354,8 @@
 ["Chicken"] = "Hühnchen", -- 
 ["Chief Sandologist"]="Haupt-Sandologe",
 ["Chikorita"] = "Endivie", -- 
+["Choose location: Left click"] = "Ort wählen: Linksklick", -- A_Classic_Fairytale:shadow
+["Choose location: Tap the [Target] button, then tap on the spot you want to choose"] = "Ort wählen: [Ziel]-Taste antippen, dann den gewünschten Ort antippen", -- A_Classic_Fairytale:shadow
 ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "Auswahl-/Platzierungs-/Löschmodus wählen: [Links], [Rechts]", -- HedgeEditor
 ["Choose your continent wisely, as your decision will be permanent."] = "Wähle deinen Kontinent weise, da deine Entscheidung endgültig ist.", -- Continental_supplies
 ["Choose your side! If you want to join the strange man, walk up to him.|Otherwise, walk away from him. If you decide to att...nevermind..."]="Wähl deine Seite! Wenn du dem seltsamen Mann beitreten willst, geh zu ihm hin.|Geh ansonsten von ihm fort. Wenn du angr… Vergiss es!",
@@ -361,7 +364,6 @@
 ["Cleaver"]="Hackebeil",
 ["Cleaver Placement Mode"]="Hackebeilplatzierungsmodus",
 ["CLEAVER PLACEMENT MODE"] = "HACKEBEILPLATZIERUNGSMODUS", -- HedgeEditor
-["Climber"]="Kletterer",
 ["Climb Home"]="Nach Hause klettern",
 ["Closing in"] = "Es neigt sich dem Ende zu", -- A_Classic_Fairytale:queen
 ["Clown"]="Clown",
@@ -370,11 +372,13 @@
 ["Cluster Bomb Training"] = "Splittergranatentraining", -- Target_Practice_-_Cluster_Bomb
 ["Collateral Damage II"]="Kollateralschaden II",
 ["Collateral Damage"]="Kollateralschaden",
+["- Collect all the blue crates"] = "- Sammel alle blaue Kisten auf", -- HedgeEditor
 ["Collect all the crates, but remember, our time in this life is limited!"]="Sammle all die Kisten ein, aber denk dran, unsere Zeit in diesem Leben ist begrenzt!",
 ["Collect or destroy all the health crates."]="Sammle oder zerstöre alle Gesundheitskisten.",
 ["Collect or destroy the final crate to finish the training."] = "Schnapp dir oder zerstöre die letzte Kiste, um die Übung abzuschließen.", -- Basic_Training_-_Flying_Saucer
+["- Collect the blue crate"] = "- Sammel die blaue Kiste auf", -- HedgeEditor
 ["Collect the crate and attack!"] = "Sammle die Kiste auf und greif an!", -- WxW
-["Collect the crate on the right.|Hint: Select the rope, [Up] or [Down] to aim, [Space] to fire, directional keys to move.|Ropes can be fired again in the air!"]="Sammle die Kiste auf der rechten Seite ein.|Tipp: Wähle das Seil, [Hoch] oder [Runter] zum Zielen, [Leer] zum Feuern, Richtungstasten zum Bewegen.|Seile können in der Luft erneut geschossen werden.",
+["Collect the crate on the right."] = "Sammle die Kiste rechts ein.", -- A_Classic_Fairytale:first_blood
 ["Collect the crates within the time limit!|If you fail, you'll have to try again."]="Sammle die Kisten innerhalb der Zeitbegrenzung ein!|Wenn du versagst, musst es erneut versuchen.",
 ["Collect the crate with the flying saucer!"] = "Sammle die Kiste mit der fliegenden Untertasse auf!", -- A_Space_Adventure:cosmos
 ["Collect the crate with the flying saucer"]="Sammle die Kiste mit der fliegenden Untertasse ein.",
@@ -443,7 +447,6 @@
 ["Crates: Crates drop more often with a higher chance of bonus ammo"] = "Kisten: Kisten erscheinen häufiger und haben öfters Bonusmunition", -- Battalion
 ["Crates: Crates drop randomly and may be empty"] = "Kisten: Kisten erscheinen zufällig und können leer sein", -- Battalion
 ["Crates: Crates drop randomly with chance of being empty"] = "Kisten: Kisten erscheinen zufällig und können leer sein", -- Battalion
-["crate(s)"] = "Kiste(n)", -- 
 ["Crates left: %d"]="Verbleibende Kisten: %d",
 ["Crates per turn: %d"] = "Kisten pro Zug: %d", -- WxW
 ["Crazy Gravity: Gravity randomly changes within a range from %i%% to %i%% with a period of %s"] = "Verrückte Schwerkraft: Schwerkraft verändert sich zufällig zwischen %i%% und %i%% mit einer Periode von %s", -- Gravity
@@ -474,10 +477,9 @@
 ["Deals 15 damage to all enemies in the circle."] = "Richte 15 Schaden auf alle Gegner im Kreis an.", -- Continental_supplies
 ["Deer"] = "Hirsch", -- 
 ["Defeat all enemies!"] = "Besiege alle Feinde!", -- portal
+["Defeat!"] = "Niederlage!", -- HedgeEditor
 ["Defeat Professor Hogevil!"]="Besiege Professor Bösigel!",
-["Defeat the cannibals!|"]="Besiege die Kannibalen!|",
-["Defeat the cannibals"]="Besiege die Kannibalen",
-["Defeat the cannibals!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "Besiege die Kannibalen!|Granatentipp: Setze den Zeitzünder mit [1-5], ziele mit [Hoch]/[Runter] und halte [Leer] für mehr Wurfkraft", -- A_Classic_Fairytale:shadow
+["Defeat the cannibals!"] = "Besiege die Kannibalen!", -- A_Classic_Fairytale:shadow
 ["Defeat the cyborgs!"]="Besiege die Cyborgs!",
 ["Defeat the enemy!"] = "Besiege den Feind!", -- A_Classic_Fairytale:queen
 ["Delete Waypoint"] = "Wegpunkt löschen", -- HedgeEditor
@@ -496,11 +498,11 @@
 ["Destroyer of planes"]="Flugzeug-Zerstörer",
 ["Destroy him, Leaks A Lot! He is responsible for the deaths of many of us!"]="Zerstöre ihn, Undichte Stelle! Er ist verantwortlich für viele Tote auf unserer Seite!",
 ["Destroy invaders and collect bonuses to score points."] = "Zerstöre Invasoren und sammle Boni auf, um zu punkten.", -- Space_Invasion
-["Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."]="Zerstör die Zielscheiben!|Tipp: Wähle das Shoryuken und drücke [Leertaste]|PS: Du kannst es in der Luft benutzen.",
-["Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"]="Zerstöre die Zielscheiben!|Tipp: [Hoch], [Runter] zum Zielen, [Leer] zum Schießen",
+["- Destroy the enemy"] = "- Vernichte den Feind", -- HedgeEditor
+["- Destroy the red target"] = "- Zerstöre das rote Ziel", -- HedgeEditor
+["- Destroy the red targets"] = "- Zerstöre die roten Ziele", -- HedgeEditor
 ["Destroy the targets!"] = "Zerstöre die Zielscheiben!", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
 ["+%d flamer fuel!"] = "+%d Flammenwerfertreibstoff", -- Tumbler
-["%d Hapless Hogs left"]="%d Glücklose Igel verbleibend",
 ["%d-Hit Combo! +%d points!"] = "%d-Treffer-Kombi! +%d Punkte!", -- Space_Invasion
 ["Did anyone follow you?"]="Ist dir irgendjemand gefolgt?",
 ["Did I miss something?"] = "Hab ich was verpasst?", -- Space_Invasion
@@ -518,7 +520,6 @@
 ["Disabled"] = "Deaktiviert", -- WxW
 ["Disguise as a Rockhopper Penguin"] = "Als Felsenpinguin tarnen", -- Continental_supplies
 ["Displacer"] = "Displacer", -- 
-["Disqualified!"]="Disqualifiziert!",
 ["Diver"] = "Taucher", -- User_Mission_-_Diver
 ["%d ms"] = "%d ms", -- HedgeEditor
 ["Doing stuff a monkey could do."] = "Dinge, die ein Affe tun könnte.", -- A_Classic_Fairytale:queen
@@ -562,7 +563,7 @@
 ["Drop a ball of dirt which turns into a|cluster on impact. Doesn’t end turn."] = "Lass einen Erdklumpen fallen,|der sich bei Aufprall in einen Bombensplitter|verwandelt. Beendet den Zug nicht.", -- Continental_supplies
 ["- Dropped flags may be returned or recaptured"] = "- Fallengelassene Flaggen können zurückgebracht oder aufgesammelt werden", -- Capture_the_Flag
 ["Dropping a weapon while in water would just drown it, but launching one would work."] = "Eine Waffe im Wasser fallen zu lassen, würde sie einfach nur absaufen lassen,|aber ein Abfeuern würde funktionieren.", -- Basic_Training_-_Flying_Saucer
-["Drop weapon (while on rope): [Long Jump]"] = "Waffe fallen lassen (vom Seil): [Langsprung]", -- Basic_Training_-_Rope
+["Drop weapon (while on rope): [Long Jump]"] = "Waffe fallen lassen (vom Seil): [Weitsprung]", -- Basic_Training_-_Rope
 ["Drove the minions away"]="Seine Lakaien vertrieben",
 ["Drove the Professor away"]="Den Professor vertrieben",
 ["Drowner"]="Absäufer",
@@ -610,11 +611,9 @@
 ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."]="Eliminiere alle Zielscheiben, bevor die Zeit abläuft.|Du hast in dieser Mission unbegrenzte Munition.",
 ["Eliminated the evil minions"]="Die bösen Lakaien eliminiert",
 ["Eliminated the Professor Hogevil"]="Professor Bösigel eliminiert",
-["Eliminate the Blue Team before the time runs out."] = "Eliminiere das Blaue Team, bevor die Zeit abläuft.", -- User_Mission_-_Dangerous_Ducklings
 ["Eliminate the enemy before the time runs out."] = "Eliminiere den Feind, bevor die Zeit abläuft.", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 ["Eliminate the enemy."] = "Eliminiere den Feind.", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh
 ["Eliminate the enemy hogs to win."]="Vernichte alle gegnerischen Igel, um zu gewinnen.",
-["Eliminate the enemy specialists."]="Vernichte die gegnerischen Spezialisten.",
 ["Eliminate Unit 3378."] = "Eliminiere Einheit 3378.", -- User_Mission_-_Teamwork
 ["Eliminate WatchBot 4000."] = "Eliminiere Wachboter 4000.", -- User_Mission_-_Teamwork_2
 ["Eliminate your captor."] = "Eliminiere deinen Peiniger.", -- User_Mission_-_The_Great_Escape
@@ -637,15 +636,16 @@
 ["Every time you kill an enemy hog your ammo will get reset next turn"]="Jedes Mal, wenn du einen Gegner tötest, wird deine Munition im nächsten Zug zurückgesetzt", -- A_Space_Adventure:death02
 ["Everywhere I look, I see hogs walking around …"] = "Überall, wo ich hinschaue, sehe ich Igel herumspazieren …", -- A_Classic_Fairytale:epil
 ["Exactly, man! That was my dream."]="Genau! Das war mein Traum.",
-["Except me, of course! I just saved a whole planet!"] = "Außer mir natürlich! Ich hab ja schließlich einen ganzen Planeten gerettet!", -- A_Space_Adventure:final
+["Except me, of course! I just saved a whole planet!"] = "Außer ich natürlich! Ich hab ja schließlich einen ganzen Planeten gerettet!", -- A_Space_Adventure:final
 ["Experienced beginner"]="Erfahrener Anfänger",
-["Explore the tunnel with the other hedgehogs and search for the device"]="Erforsche den Tunnel mit den anderen Igeln und such nach dem Gerät.",
+["Explore the tunnel with the other hedgehogs and search for the device."] = "Erforsche den Tunnel mit den anderen Igeln und such nach dem Gerät.", -- A_Space_Adventure:fruit02
 ["Exploring the tunnel"]="Höhlenforscher",
 ["Eye Chewer"]="Augenkauer",
 ["Fair Wind"] = "Steife Brise", -- 
 ["Fall Damage"] = "Fallschaden", -- Basic_Training_-_Movement
 ["Fallen Angel"] = "Gefallener Engel", -- Tentacle_Terror
 ["Family Reunion"]="Familientreffen",
+["Fastest escape: %d turns"] = "Schnellste Flucht: %d Züge", -- A_Space_Adventure:desert02
 ["Fastest lap: %.3fs by %s"] = "Beste Zeit: %.3fs von %s", -- TrophyRace
 ["Feeble Resistance"]="Kraftloser Widerstand",
 ["Fell From Grace"]="Fiel in Ungnade",
@@ -665,11 +665,12 @@
 ["Final result"] = "Endstand", -- Mutant
 ["Final Targets"] = "Letzte Zielscheiben", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
 ["Final team scores:"] = "Endstand:", -- Space_Invasion
+["Find all the parts of the anti-gravity device."] = "Finde all die Teile des Antischwerkraftgeräts.", -- A_Space_Adventure:cosmos
 ["Find a way to detonate all the explosives and stay alive!"]="Finde einen Weg, alle Sprengstoffe zu detonieren und bleib am Leben!",
 ["Find your tribe!|Cross the lake!"]="Finde deinen Stamm!|Überquere den Fluss!",
 ["Finish this challenge as fast as possible to earn bonus points."] = "Beende diese Herausforderung so schnell du kannst, um Bonuspunkte zu erhalten.", -- User_Mission_-_Rope_Knock_Challenge
 ["Finish waypoint placement"] = "Wegpunktplatzierung beenden", -- Racer
-["Finish your training|Hint: Animations can be skipped with the [Precise] key."]="Schließe deine Übungen ab.|Tipp: Animationen können mit der [Genaues Zielen]-Taste übersprungen werden.",
+["Finish your training."] = "Schließe deine Übungen ab.", -- A_Classic_Fairytale:first_blood
 ["Finite Ropes"] = "Endliche Seile", -- Basic_Training_-_Rope
 ["Fire a rocket with napalm."] = "Feuere eine Rakete mit Napalm ab.", -- Continental_supplies
 ["Fire: [Precise]"] = "Feuern: [Genaues Zielen]", -- Space_Invasion, Tumbler
@@ -697,6 +698,7 @@
 ["Fly to the meteorite and detonate the explosives"]="Fliege zum Meteoriten und sprenge die Bomben.",
 ["Fly to the moon"]="Flieg zum Mond.",
 ["Fly to the moon."] = "Flieg zum Mond.", -- A_Space_Adventure:cosmos
+["Follow the path and destroy the next target."] = "Folge dem Pfad und zerstöre die nächste Zielscheibe.", -- Basic_Training_-_Rope
 ["Forgetfulness: You will lose all your weapons each turn."] = "Vergesslichkeit: Du wirst jeden Zug alle Waffen verlieren.", -- Continental_supplies
 ["For the next crate, you have to do back jumps."] = "Für die nächste Kiste brauchst du Rückwärtssprünge.", -- Basic_Training_-_Movement
 ["Four Eyes"] = "Vier Augen", -- 
@@ -717,9 +719,7 @@
 ["“g=150”, where 150 is 150% of normal gravity."] = "»g=150«, wobei die »150« für 150% der Normalschwerkraft steht.", -- Gravity
 ["“g=50, g2=150, period=4000” for gravity changing|from 50 to 150 and back with period of 4000 ms."] = "»g=50, g2=150, period=4000«, für Schwerkraft,|die von 50 bis 150 wechselt mit einer Periode von 4000ms.", -- Gravity
 ["Galaxy Guardians"] = "Galaxiewächter", -- Big_Armory
-["Game Modifiers: "]="Spiel-Modifikatoren: ",
 ["Game over!"] = "Spiel vorbei!", -- Space_Invasion
-["GAME OVER!"]="SPIEL ZU ENDE!",
 ["Game Started!"]="Spiel gestartet!",
 ["Game? Was this a game to you?!"]="Spiel? War das ein Spiel für dich?!",
 ["Gangsters"] = "Gangster", -- 
@@ -727,8 +727,6 @@
 ["Gasp! A smuggler!"] = "Huch! Ein Schmuggler!", -- A_Space_Adventure:desert01
 ["Gasp!"] = "Huch!", -- A_Space_Adventure:desert01
 ["Gathering fruits all day long."] = "Den ganzen Tag nur Obst sammeln.", -- A_Classic_Fairytale:queen
-["Gear information hidden"] = "Gear-Information verborgen", -- HedgeEditor
-["Gear information shown"] = "Gear-Information angezeigt", -- HedgeEditor
 ["Gear Placement Tool"] = "Gear-Platzierungswerkzeug", -- HedgeEditor
 ["General information:"] = "Allgemeine Informationen:", -- Continental_supplies
 ["General Lemon"]="General Limone",
@@ -738,7 +736,7 @@
 ["Get him Spike!"]="Hol ihn, Stachel!",
 ["Get him, Spike!"] = "Stachel, hol ihn dir!", -- A_Space_Adventure:desert01
 ["Get on over there and take him out!"]="Mach, dass du hinüber kommst und schalte ihn aus!",
-["Get on the head of the mole"]="Geh auf den Kopf des Maulwurfs",
+["Get on the head of the mole."] = "Stell dich auf dem Kopf des Maulwurfs.", -- A_Classic_Fairytale:first_blood
 ["Get past the flower."] = "Überquere die Blume.", -- A_Classic_Fairytale:journey
 ["Get ready to fight!"]="Bereitmachen zum Kämpfen!",
 ["Get that crate!"]="Hol dir die Kiste!",
@@ -774,7 +772,6 @@
 ["GO! GO! GO!"]="Los, los, los!",
 ["Good birdy......"]="Braver Vogel …",
 ["Good bye!"] = "Tschüss!", -- Basic_Training_-_Flying_Saucer
-["Good Dude"]="Guter Junge",
 ["Good idea, they'll never find us there!"]="Gute Idee, dort werden sie uns niemals finden!",
 ["Good job! Defeat the rest of the aliens!"] = "Gut gemacht! Besiege die verbleibenden Außerirdischen!", -- A_Classic_Fairytale:queen
 ["Good job!"] = "Gut gemacht!", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
@@ -785,7 +782,7 @@
 ["Good so far!"]="Gut soweit!",
 ["Good to go!"]="Startklar!",
 ["Good! You now control Cappy."] = "Gut! Jetzt steuerst du Käppi.", -- Basic_Training_-_Movement
-["Go on top of the flower"]="Geh auf die Spitze der Blume",
+["Go on top of the flower."] = "Geh auf die Spitze der Blume.", -- A_Classic_Fairytale:first_blood
 ["Go, quick!"]="Los, schnell!",
 ["Gorkij"]="Gorkidsch",
 ["Go surf!"]="Los, surfe!",
@@ -809,7 +806,6 @@
 ["Great! You will be contacted soon for assistance."]="Gut! Du wirst schon bald für Unterstützung benachrichtigt.",
 ["Green areas aren't portal enabled"]="Grüne Bereiche sind portalabweisend",
 ["Green Bananas"]="Grüne Bananen",
-["Green Bananas won!"]="Die Grünen Bananen haben gewonnen!",
 ["Green double rings also give you a new flying saucer."] = "Grüne Doppelringe geben dir zusätzlich eine fliegende Untertasse.", -- A_Space_Adventure:ice02
 ["Green"] = "Grün", -- 
 ["Green Hog Grape"]="Grünigeltraube",
@@ -819,11 +815,8 @@
 ["Greetings, cloudy one!"]="Grüße, du Wolkiger!",
 ["Greetings from the Navy, %s (%s), for being a distance of %d away from the mainland!"]="Grüße von der Marine, %s (%s), für einen Abstand von %d vom Festland!",
 ["Greetings, %s!"] = "Sei gegrüßt, %s!", -- A_Classic_Fairytale:dragon
-["Greg"] = "Gregor", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
-["Grenade Group"]="Granatengruppe",
 ["Grenades explode after 1 to 5 seconds (you decide)."] = "Granaten explodieren nach 1 bis 5 Sekunden (du entscheidest).", -- Basic_Training_-_Grenade
 ["Grenades with high bounciness bounce a lot and behave chaotic."] = "Granaten mit hoher Sprungkraft springen sehr stark und verhalten sich chaotisch.", -- Basic_Training_-_Grenade
-["Grenade Team"] = "Granaten-Team", -- Basic_Training_-_Grenade
 ["Grenadier"]="Grenadier",
 ["Grey"] = "Grau", -- 
 ["Guards"]="Wächter",
@@ -859,7 +852,6 @@
 ["Health: Hogs lose up to 7% base health per turn"] = "Gesundheit: Igel verlieren bis zu 7% der Grundgesundheit pro Zug", -- Battalion
 ["Health Modification Mode"]="Gesundheitsmodifikationsmodus",
 ["HEALTH MODIFICATION MODE"]="GESUNDHEITSMODIFIKATIONSMODUS",
-["Heartful"]="Herzlich",
 ["Heavenly Defense"] = "Himmlische Verteidigung", -- Tentacle_Terror
 ["Heavy Cannfantry"]="Schwere Kannfanterie",
 ["Heavy"]="Schwierig",
@@ -872,6 +864,7 @@
 ["Hedgehog"] = "Igel", -- 
 ["Hedgehog Projectile"] = "Igelprojektil", -- Continental_supplies
 ["Hedgehogs can not be deleted."] = "Igel können nicht gelöscht werden.", -- HedgeEditor
+["Hedgehogs left: %d"] = "Verbleibende Igel: %d", -- User_Mission_-_That_Sinking_Feeling
 ["Hedgehogs will be revived after their death."] = "Igel werden nach ihrem Tod wiederbelebt.", -- Mutant
 ["Hedgehogs will start in the first waypoint."] = "Igel starten im ersten Wegpunkt.", -- Racer
 ["Hedgibal Lecter"]="Iglibal Lector",
@@ -889,7 +882,6 @@
 ["Help Enabled"] = "Hilfe aktiviert", -- HedgeEditor
 ["Helpers: Each team starts with %d helper points"] = "Helfer: Jedes Team beginnt mit %d Helferpunkten", -- Battalion
 ["Helpers: Hogs will get 1 out of 2 helpers randomly each turn"] = "Helfer: Igel kriegen zufällig 1 aus 2 Helfern pro Zug", -- Battalion
-["Help Hog Solo to find all the parts of the anti-gravity device."]="Hilf Igel Einsam, alle Bauteile des Antischwerkraftgerätes zu finden.",
 ["Help me, Leaks!"]="Hilf mir, Undichte!",
 ["Help me, please!"]="Hilf mir bitte!",
 ["He moves like an eagle in the sky."]="Er bewegt sich wie ein Adler in der Luft.",
@@ -904,7 +896,6 @@
 ["Here you will find the current mission instructions."] = "Hier siehst du die aktuellen Missionsanweisungen.", -- Basic_Training_-_Movement
 ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "Hier wirst du den Flug mit der fliegenden Untertasse|und ein paar coole Tricks lernen.", -- Basic_Training_-_Flying_Saucer
 ["Heroic Wind"] = "Heroischer Wind", -- Continental_supplies
-["Hero Team"]="Heldenteam",
 ["He's so brave..."]="Er ist so mutig.",
 ["He was the lab assistant of Dr. Goodhogan, the inventor of the anti-gravity device"]="Er war der Laborassistent von Dr. Gutigeln, dem Erfinder des Antischwerkraftgeräts.",
 ["He was the lab assistant of Dr. Goodhogan, the inventor of the anti-gravity device."] = "Er war der Laborassistent von Dr. Gutigeln, dem Erfinder des Antischwerkraftgeräts.", -- A_Space_Adventure:moon02
@@ -914,14 +905,15 @@
 ["Hey, guys!"]="Hey, Leute!",
 ["Hey"]="Hey",
 ["Hey Hog Solo! Finally you have come..."]="Hey, Igel Einsam! Endlich bist du angekommen …",
-["Hey, Hog Solo! Finally you have come!"] = "Hey, Igel Einsam! Endlich bist du gekommen!", -- A_Space_Adventure:moon01
 ["Hey! I was supposed to collect it!"] = "Hey! Eigentlich sollte ich die Kiste aufsammeln!", -- A_Space_Adventure:fruit02
+["Hey, %s! Finally you have come!"] = "Hallo, %s! Endlich bist du gekommen!", -- A_Space_Adventure:moon01
 ["Hey, %s! Look, someone is stealing the saucer!"] = "He, %s! Pass auf, jemand stiehlt die fliegende Untertasse!", -- A_Space_Adventure:cosmos
 ["Hey! This is cheating!"]="Hey, das ist geschummelt!",
 ["H"]="H",
 ["Hidden"] = "Versteckt", -- portal
 ["High Gravity: Gravity is %i%%"] = "Hohe Schwerkraft: Schwerkraft ist auf %i%%", -- Gravity
 ["High Jump: [Backspace]"] = "Hochsprung: [Rücktaste]", -- Basic_Training_-_Movement
+["High Jump: Tap the [Curvy Arrow] shortly"] = "Hochsprung: [Krummen Pfeil] kurz antippen", -- Basic_Training_-_Movement
 ["Highlander: Eliminate enemy hogs to take their weapons"] = "Hochländer: Eliminiere feindliche Igel, um ihre Waffen zu nehmen", -- Highlander
 ["Highlander: Eliminate hogs to take their weapons"] = "Hochländer: Eliminiere Igel, um ihre Waffen zu nehmen", -- Highlander
 ["Highland: Hogs get %d random weapons from their pool"] = "Hochland: Igel erhalten %d zufällige Waffen aus ihrem Waffenpool", -- Battalion
@@ -932,20 +924,24 @@
 ["Hill Guard"] = "Hügelwache", -- Bazooka_Battlefield
 ["Hi! Nice to meet you"]="Hi! Schön, dich zu sehen.",
 ["Hi! Nice to meet you."] = "Hi! Schön, dich zu sehen.", -- A_Space_Adventure:ice01
-["Hint: Double Jump - Press [Backspace] twice"]="Tipp: Doppelsprung – Drück [Rücktaste] 2 Mal",
+["Hint: Cinematics can be skipped with the [Precise] key."] = "Tipp: Zwischensequenzen können mit der [Genaues Zielen]-Taste übersprungen werden.", -- A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
 ["Hint: Drilling holes should solve everything."] = "Tipp: Löcher bohren sollte alle Probleme lösen.", -- A_Classic_Fairytale:family
 ["Hint: Hold down [M] to review the mission texts."] = "Tipp: Halte [M] gedrückt, um die Missionstexte erneut zu sehen.", -- A_Classic_Fairytale:first_blood
 ["Hint: It might be a good idea to place a girder before starting to drill. Just saying."] = "Tipp: Es könnte eine gute Idee sein, einen Träger zu platzieren,|bevor du mit dem Bohren anfängst. Ich sag ja nur.", -- A_Classic_Fairytale:family
 ["Hint: It might be easier if you vary the angle only slightly."] = "Tipp: Es könnte leichter sein, wenn du den Winkel nur leicht veränderst.", -- Basic_Training_-_Bazooka
+["Hint: Just select the parachute, it opens automatically when you fall."] = "Tipp: Wähle einfach den Fallschirm aus, er öffnet sich von alleine, wenn du fällst.", -- A_Classic_Fairytale:first_blood
 ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "Tipp: Der Pool eines getöteten Igels wird nicht seinem Mörder übertragen", -- Battalion
 ["Hint: Launch the bazooka horizontally at full power."] = "Tipp: Starte die Bazooka horizontal mit voller Kraft.", -- Basic_Training_-_Bazooka
-["Hint: Press [Esc] to review the mission texts."] = "Tipp: Drücke [Esc], um die Missionstexte wieder zu sehen.", -- A_Classic_Fairytale:first_blood
+["Hint: Pause the game to review the mission texts."] = "Tipp: Pausiere das Spiel, um die Missionstexte erneut zu lesen.", -- A_Classic_Fairytale:first_blood
 ["Hint: Select the blow torch, aim and press [Fire]. Press [Fire] again to stop."] = "Tipp: Wähle den Schweißbrenner aus, ziele und drücke [Angriff]. Drücke [Angriff] erneut zum Anhalten.", -- A_Classic_Fairytale:journey
 ["Hint: Select the low gravity and press [Fire]."] = "Tipp: Wähle die niedrige Schwerkraft aus und drücke [Angriff].", -- A_Classic_Fairytale:journey
+["Hint: Select the rope, [Up] or [Down] to aim, [Attack] to fire, directional keys to move."] = "Tipp: Wähle das Seil, [Hoch]/[Runter] zum Zielen,|[Angriff] zum Feuern, Richtungstasten zum Bewegen.", -- A_Classic_Fairytale:first_blood
+["Hint: Select the Shoryuken and hit [Attack].|P.S.: You can use it mid-air."] = "Tipp: Wähle das Shoryuken und drücke [Angriff].|P.S.: Du kannst es in der Luft benutzen.", -- A_Classic_Fairytale:first_blood
 ["Hint: %s needs to get really close to the princess!"] = "Tipp: %s muss sehr nah an der Prinzessin stehen!", -- A_Classic_Fairytale:family
 ["Hint: The rope only bends around objects.|When it doesn't hit anything, it's always straight."] = "Tipp: Das Seil verbiegt sich nur um Objekte.|Wenn es nichts berührt, ist es immer schnurgerade.", -- Basic_Training_-_Rope
 ["--- Hint ---"] = "--- Tipp ---", -- Battalion
 ["Hint: To jump higher, wait a bit before you hit “High Jump” a second time."] = "Tipp: Um höher zu springen, warte etwas, bevor du »Hochsprung« erneut drückst.", -- Basic_Training_-_Movement
+["Hint: To place a girder, select it,|then use [Left] and [Right] to select angle and length,|then choose a location for the girder."] = "Tipp: Um einen Träger zu platzieren, wähle ihn aus,|dann benutze [Links]/[Rechts], um Winkel und Länge zu wählen,|dann wähle einen Ort für den Träger.", -- A_Classic_Fairytale:shadow
 ["Hint: Use the quit key to see the team’s continent."] = "Tipp: Benutze die Verlassentaste, um den Kontinent des Teams zu sehen.", -- Continental_supplies
 ["Hint: When you shorten the rope, you move faster!|And when you lengthen it, you move slower."] = "Tipp: Wenn du das Seil verkürzt, bewegst du dich schneller!|Und wenn du es verlängerst, wirst du langsamer.", -- Basic_Training_-_Rope
 ["Hint: You might want to stay out of sight and take all the crates ..."] = "Tipp: Du solltest aus der Schusslinie bleiben und alle Kisten aufsammeln.", -- A_Classic_Fairytale:journey
@@ -978,27 +974,14 @@
 ["Hogminator"]="Iglinator",
 ["Hog nueve"]="Igel nueve",
 ["Hog octo"]="Igel octo",
-["Hogonauts"] = "Igelnauten", -- Basic_Training_-_Flying_Saucer
 ["Hog onze"]="Igel onze",
 ["Hog Saturn"]="Igel Saturn",
 ["Hogs in sight!"]="Igel in Sicht!",
 ["Hog Solo and GB"]="Igel Einsam und GB",
 ["Hog Solo arrived at "]="Igel Einsam ist angekommen an ",
-["Hog Solo arrived at the Desert Planet!"] = "Igel Einsam ist auf dem Wüstenplaneten angekommen!", -- A_Space_Adventure:cosmos
-["Hog Solo arrived at the Fruit Planet!"] = "Igel Einsam ist auf dem Obstplaneten angekommen!", -- A_Space_Adventure:cosmos
-["Hog Solo arrived at the Ice Planet!"] = "Igel Einsam ist auf dem Eisplaneten angekommen!", -- A_Space_Adventure:cosmos
-["Hog Solo arrived at the meteorite!"] = "Igel Einsam ist auf dem Meteoriten angekommen!", -- A_Space_Adventure:cosmos
-["Hog Solo arrived at the moon!"] = "Igel Einsam ist auf dem Mond angekommen!", -- A_Space_Adventure:cosmos
-["Hog Solo arrived at the Planet of Death!"] = "Igel Einsam ist auf dem Planeten des Todes angekommen!", -- A_Space_Adventure:cosmos
-["Hog Solo couldn't escape, try again!"]="Igel Einsam konnte nicht fliehen, versuch es nochmal!",
-["Hog Solo escaped successfully!"]="Igel Einsam ist erfolgreich geflohen!",
 ["...Hog Solo fights for his life"]="… kämpft Igel Einsam ums Überleben.",
 ["... Hog Solo fights for his life"] = "… kämpft Igel Einsam ums Überleben.", -- A_Space_Adventure:death02
-["Hog Solo has to reach the last crates"]="Igel Einsam muss die letzten Kisten erreichen.",
-["Hog Solo has to refuel his saucer."]="Igel Einsam muss seine Untertasse auftanken.",
 ["Hog Solo"]="Igel Einsam",
-["Hog Solo lost, try again!"]="Igel Einsam hat verloren, versuch es nochmal!",
-["Hog Solo wins, congratulations!"]="Igel Einsam gewinnt, Gratulation!",
 ["- Hogs will be revived"] = "- Igel werden wiederbelebt", -- Capture_the_Flag
 ["- Hogs will drop the flag when killed"] = "- Getötete Igel lassen die Flagge fallen", -- Capture_the_Flag
 ["Hog two"]="Igel zwei",
@@ -1007,12 +990,10 @@
 ["Holy shit!"] = "Ach du dicker Vater!", -- Mutant
 ["Honda"] = "Honda", -- 
 ["Honest Lee"]="Leo Ehrlich",
-["Hook"]="Haken",
 ["Hooks"] = "Haken", -- 
 ["Hoorah!!!"]="Hurra!",
-["Hooray!"]="Hurra!",
-["Hooray! I actually did it! Hogera is safe!"] = "Hurra! Ich hab's tatsächlich geschafft! Hogera ist in Sicherheit!", -- A_Space_Adventure:final
-["Hooray! I've found it, now I have to get back to Captain Lime!"] = "Hurra! Ich hab's gefunden! Nun muss ich zurück zu Leutnant Limone!", -- A_Space_Adventure:fruit02
+["Hooray! I actually did it! Hogera is safe!"] = "Hurra! Ich hab’s tatsächlich geschafft! Hogera ist in Sicherheit!", -- A_Space_Adventure:final
+["Hooray! I've found it, now I have to get back to Captain Lime!"] = "Hurra! Ich hab’s gefunden! Nun muss ich zurück zu Leutnant Limone!", -- A_Space_Adventure:fruit02
 ["Hooray! You are a champion!"] = "Hurra! Du bist ein Champion!", -- A_Space_Adventure:ice02
 ["Hopeless case"]="Hoffnungsloser Fall",
 ["Hop on top of the next flower and advance to the left coast."] = "Spring auf die Spitze der nächsten Blume und rücke zur linken Küste vor.", -- A_Classic_Fairytale:journey
@@ -1026,7 +1007,7 @@
 ["However, if you fail to do so, she dies a most violent death, just like your friend! Muahahaha!"]="Aber wenn du versagst, wird sie den grausamsten Tod sterben, genau, wie dein Freund! Muhahahaha!",
 ["However, if you fail to do so, she dies a most violent death! Muahahaha!"]="Wenn du aber versagst, wird sie den grausamsten Tod sterben! Muhahahaha!",
 ["However, my mates don't agree with me on letting you go..."]="Aber meine Freunde wollen dich nicht gehen lassen …",
-["However, the army of Yellow Watermelons is about to attack any moment now."]="Aber die Armee der Gelben Wassermelonen wird jeden Moment angreifen.", -- A_Space_Adventure:fruit01
+["However, the army of %s is about to attack any moment now."] = "Jedoch wird die Armee der %s jeden Moment angreifen.", -- A_Space_Adventure:fruit01
 ["How to Rope"] = "Verwendung des Seils", -- Basic_Training_-_Rope
 ["How would you like being discriminated against?"] = "Wie würde es sich anfühlen, wenn ihr die Diskriminierten wärt?", -- A_Classic_Fairytale:queen
 ["Huh?"] = "Hä?", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen
@@ -1046,7 +1027,6 @@
 ["I can't believe what I'm hearing!"]="Ich kann nicht glauben, was ich höre!",
 ["I can't let you go further because …"] = "Ich kann euch nicht weitergehen lassen, weil …", -- A_Classic_Fairytale:queen
 ["I can't wait any more, I have to save myself!"]="Ich kann nicht länger warten, ich muss selber zur Hilfe eilen!",
-["Ice"] = "Eis", -- Basic_Training_-_Movement
 ["Ice Jake"]="Eis-Jakob",
 ["I could just teleport myself there..."]="Ich könnte mich einfach dorthin teleportieren.",
 ["Icy Girder: [3]"] = "Eisiger Bauträger: [3]", -- HedgeEditor
@@ -1104,7 +1084,6 @@
 ["I just found out that they have captured your princess!"]="Ich habe gerade herausgefunden, dass sie deine Prinzessin gefangen haben!",
 ["I just want the strange device you found!"]="Ich will nur das seltsame Teil, das du gefunden hast.",
 ["I just wonder where Ramon and Spiky disappeared..."]="Ich frage mich lediglich, wohin Ramon und Stachli verschwunden sind.",
-["Ikeda"] = "Ikeda", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 ["I know and I'm terribly sorry!"] = "Ich weiß, und es tut mir schrecklich Leid!", -- A_Classic_Fairytale:epil
 ["I know, my hero!"] = "Ich weiß, mein Held!", -- A_Classic_Fairytale:epil
 ["I know that your resources are low due to the battle but I'll send two of my best hogs to assist you."]="Ich weiß, dass deine Ressourcen aufgrund der Schlacht begrenzt sind, aber ich werde dir zwei meiner besten Igel schicken, um dir zu helfen.",
@@ -1132,6 +1111,7 @@
 ["I'm living a dream!"] = "Ich lebe einen Traum!", -- A_Classic_Fairytale:queen
 ["I'm not sure about that!"]="Ich bin mir darüber nicht so sicher.",
 ["IMPORTANT: To see the mission panel again, hold the mission panel key."] = "WICHTIG: Um die Missionstexte erneut zu sehen, halte die Missionsanzeigentaste.", -- Basic_Training_-_Movement
+["IMPORTANT: To see the mission panel again, pause the game."] = "WICHTIG: Um die Missionstexte erneut zu sehen, pausiere das Spiel.", -- Basic_Training_-_Movement
 ["Impressive...you are still dry as the corpse of a hawk after a week in the desert..."]="Großartig! Du bist immer noch so trocken wie der Kadaver eines Adlers nach einer Woche in der Wüste.",
 ["%i ms"] = "%i ms", -- Gravity
 ["I'm so glad this is finally over!"] = "Ich bin so froh, dass es endlich vorbei ist!", -- A_Space_Adventure:final
@@ -1205,7 +1185,7 @@
 ["It must be the aliens!"]="Es müssen diese Außerirdischen sein!",
 ["It must be the cyborgs again!"]="Das müssen wohl wieder diese Cyborgs sein!",
 ["It needs some practice, but you have infinite lives."] = "Man braucht etwas Übung dafür, aber du hast unendlich viele Leben.", -- Basic_Training_-_Rope
-["I told you, I just found them."]="Ich sag's dir, ich habe sie gerade erst gefunden.",
+["I told you, I just found them."]="Ich sag’s dir, ich habe sie gerade erst gefunden.",
 ["It only works in teleportation nodes of your own clan."] = "Dies funktioniert nur innerhalb Teleportations-|stationen deines eigenen Klans.", -- Construction_Mode
 ["It's a good thing SUDDEN DEATH is 99 turns away..."]="Gut, dass SUDDEN DEATH in 99 Runden ist …",
 ["It's all about the right carrots, you know."] = "Es kommt allein auf die richtigen Karotten an, weißt du?", -- A_Classic_Fairytale:epil
@@ -1270,7 +1250,7 @@
 ["Just look at Leaks, may he rest in peace!"] = "Schau dir nur Undichte an, möge er in Frieden ruhen!", -- A_Classic_Fairytale:queen
 ["Just on a walk."]="Nur spazieren.",
 ["Just wait till I get my hands on that trauma! ARGH!"]="Warte nur, bis ich mein Trauma in die Finger kriege! ARGH!",
-["Kaboom! Hahahaha! Take this, stupid meteorite!"] = "Krawumm! Hahahaha! Nimm dass, blöder Meteorit!", -- A_Space_Adventure:final
+["Kaboom! Hahahaha! Take this, stupid meteorite!"] = "Krawumm! Hahahaha! Nimm das, blöder Meteorit!", -- A_Space_Adventure:final
 ["Kaboom!"] = "Kabumm!", -- Basic_Training_-_Flying_Saucer
 ["Kamikaze Expert! +15 points!"] = "Kamikazeexperte! +15 Punkte", -- Space_Invasion
 ["Keep it up!"]="Weiter so!",
@@ -1288,7 +1268,6 @@
 ["Kill The Leader"] = "Tötet Den Besten", -- WxW
 ["Kill The Leader: You must also hit the team with the most health."] = "Tötet Den Besten: Du musst zumindest das Team mit der höchsten Gesundheit treffen.", -- WxW
 ["Kill the traitor, %s, or spare his life!"] = "Töte den Verräter, %s, oder verschon sein Leben!", -- A_Classic_Fairytale:backstab
-["King Customer"]="König Kunde",
 ["King"]="König",
 ["--- King Mode ---"] = "--- Königsmodus ---", -- Battalion
 ["Knight"]="Ritter",
@@ -1309,7 +1288,7 @@
 ["Launch some bazookas to destroy the targets!"] = "Feuere ein paar Bazookas ab, um die Zielscheiben zu zerstören!", -- Basic_Training_-_Bazooka
 ["Leaderbot"]="Führboter",
 ["Leader"]="Führer",
-["Lead the Green Bananas to battle and eliminate all the enemies!"] = "Führ die Grünen Bananen in die Schlacht und eliminiere alle Feinde!", -- A_Space_Adventure:fruit01
+["Lead your allies to battle and eliminate all the enemies!"] = "Führ deine Verbündeten in die Schlacht und eliminiere alle Feinde!", -- A_Space_Adventure:fruit01
 ["Leaks A Lot, depressed for killing his loved one, failed to save the village..."]="Traurig darüber, sein Liebling getötet zu haben, versagte Undichte Stelle dabei, das Dorf zu retten.",
 ["Leaks A Lot gave his life for his tribe! He should have survived!"]="Undichte Stelle gab sein Leben für seinen Stamm! Er hätte überleben sollen!",
 ["Leaks A Lot must survive!"]="Undichte Stelle muss überleben!",
@@ -1326,16 +1305,15 @@
 ["[Left], [Right]: Change sprite selection"]="[Links], [Rechts]: Sprite-Auswahl ändern",
 ["Left/right: Choose crate contents"] = "Links/rechts: Kisteninhalt wählen", -- Construction_Mode
 ["Left/right: Choose structure type"] = "Links/rechts: Gebäudetyp wählen", -- Construction_Mode
-["Left Tong"] = "Linke Kneifzange", -- Bazooka_Battlefield
 ["Legs"] = "Beiner", -- 
 ["Less tools, more fun"] = "Weniger Werkzeuge, mehr Spaß", -- Battalion
 ["Lestat"] = "Lestat", -- portal
 ["Let a continent provide your weapons!"]="Lass einen Kontinent dich mit Waffen beliefern!",
 ["Let me test your skills a little, will you?"]="Lass mich deine Fertigkeiten ein wenig testen, okay?",
-["Let's get started!"] = "Los geht's!", -- Basic_Training_-_Bazooka
+["Let's get started!"] = "Los geht’s!", -- Basic_Training_-_Bazooka
 ["Let's go home!"]="Lasst uns nach Hause gehen!",
-["Let's go!"]="Los geht's!",
-["Let's go, %s!"] = "Los geht's, %s!", -- WxW
+["Let's go!"]="Los geht’s!",
+["Let's go, %s!"] = "Los geht’s, %s!", -- WxW
 ["Let's head back to the village!"]="Lass uns zurück zum Dorf gehen!",
 ["Let's see what your comrade does now!"]="Sehen wir mal, was dein Kamerad jetzt anstellt.",
 ["Let's show those cannibals what we're made of!"]="Lass uns diesen Kannibalen zeigen, aus welchem Holz wir geschnitzt sind!",
@@ -1353,19 +1331,20 @@
 ["Little Obstacle Course"] = "Kleiner Hindernislauf", -- Basic_Training_-_Rope
 ["Lively Lifeguard"] = "Lebhafter Lebensretter", -- User_Mission_-_That_Sinking_Feeling
 ["Lonely Cries"] = "Einsame Heuler", -- Continental_supplies
-["Lonely Hog"]="Einsamer Igel",
 ["Long Jump: [Enter]"] = "Weitsprung: [Enter]", -- Basic_Training_-_Movement
+["Long Jump: Tap the [Curvy Arrow] button for long"] = "Weitsprung: [Krummen Pfeil] lange drücken", -- Basic_Training_-_Movement, A_Classic_Fairytale:first_blood
 ["Long Live The Queen"] = "Lang lebe die Königin", -- A_Classic_Fairytale:queen
 ["Look around: [Mouse movement]"] = "Umsehen: [Mausbewegung]", -- Basic_Training_-_Movement
+["Look around: [Tap or swipe on the screen]"] = "Umsehen: [Auf Bildschirm tippen oder wischen]", -- Basic_Training_-_Movement
 ["Look, boss! There is the target!"]="Sieh, Boss! Dort ist das Ziel!", -- A_Space_Adventure:moon01
 ["Look, I had no choice!"]="Versteh doch, ich hatte keine Wahl!",
 ["Look out! There's more of them!"]="Passt auf! Da sind noch mehr von ihnen!",
 ["Look out! We're surrounded by cannibals!"]="Passt auf! Wir sind von Kannibalen umzingelt!",
 ["Looks like the whole world is falling apart!"]="Es scheint, als würde die ganze Welt auseinanderfallen!",
 ["Look, someone is stealing the saucer!"]="Sieh, jemand stiehlt die Untertasse!",
+["Look to the left and do a backwards jump towards the mushroom."] = "Blick nach links und mach einen Rückwärtssprung zum Pilz.", -- A_Classic_Fairytale:first_blood
 ["Loon"] = "Spinner", -- The_Specialists
 ["Loopy"] = "Gaga", -- 
-["Lord Evil"] = "Lord Böse", -- Tentacle_Terror
 ["Losing Condition: Destroy"] = "Niederlagebedingung: Zerstören", -- HedgeEditor
 ["Low Gravity: Gravity is %i%%"] = "Niedrige Schwerkraft: Schwerkraft ist auf %i%%", -- Gravity
 ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "Loyaler Hochländer: Eliminiere feindliche Igel, um ihre Waffen zu nehmen", -- Highlander
@@ -1384,7 +1363,6 @@
 ["Many meters below the surface ..."]="Viele Meter unter der Oberfläche …", -- A_Space_Adventure:desert02
 ["Mario"] = "Mario", -- 
 ["Mark gears for win/lose conditions"] = "Markiere Gears für Sieg-/Niederlagebedingungen", -- HedgeEditor
-["Mark"] = "Markus", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
 ["Mark/unmark gear: [Left Click]"] = "Gear markieren/demarkieren: [Linksklick]", -- HedgeEditor
 ["Max Citrus"]="Max Zitron",
 ["Maybe you should try an easier map next time."] = "Vielleicht solltet ihr beim nächsten Mal eine leichtere Karte ausprobieren.", -- Racer
@@ -1397,7 +1375,6 @@
 ["Mega kill!"] = "Megakiller!", -- Mutant
 ["Meiwes"]="Meiwes",
 ["mikade"] = "mikade", -- 
-["milliseconds"]="Millisekunden",
 ["Mindy"]="Intellekta",
 ["Mine Deployer"]="Minenleger",
 ["Mine Placement Mode"]="Minenplatzierungsmodus",
@@ -1414,10 +1391,11 @@
 ["Mines time: %ds"] = "Minenzeitzünder: %ds", -- SimpleMission
 ["Minion"]="Lakai",
 ["Minions"]="Lakaien",
-["MISSION FAILED"]="MISSION GESCHEITERT",
+["Mission failed!"] = "Mission fehlgeschlagen!", -- portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, SimpleMission, HedgeEditor
+["Mission"] = "Mission", -- HedgeEditor
 ["Mission Panel"] = "Missionsanzeige", -- Basic_Training_-_Movement
 ["Mission panel: [M]"] = "Missionsanzeige: [M]", -- Basic_Training_-_Movement
-["MISSION SUCCESSFUL"]="MISSION ERFOLGREICH",
+["Mission succeeded!"] = "Mission erfolgreich!", -- portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, SimpleMission, HedgeEditor
 ["Mister Pear"]="Herr Birne",
 ["Mixed %d"] = "Gemischt %d", -- WxW
 ["Mixed"] = "Gemischt", -- WxW
@@ -1429,7 +1407,6 @@
 ["Monster kill!"] = "Teuflisch!", -- Mutant
 ["Monsters"] = "Monster", -- 
 ["Mooney"] = "Finster", -- 
-["More Natives"]="Mehr Eingeborene",
 ["Morris"] = "Moritz", -- 
 ["Most mines are not active."]="Die meisten Minen sind Blindgänger.", -- A_Space_Adventure:desert02
 ["Most of the destructible terrain is marked with dashed lines."] = "Der Großteil des zerstörbaren Landes ist mit gestrichelten Linien markiert.", -- A_Space_Adventure:desert01
@@ -1447,12 +1424,10 @@
 ["My First Bazooka"] = "Meine erste Bazooka", -- Basic_Training_-_Bazooka
 ["My flying saucer stopped working!"] = "Meine fliegende Untertasse funktioniert nicht mehr!", -- A_Space_Adventure:ice01
 ["Nah, probably everyone was just stupid."] = "Ach was, wahrscheinlich waren alle nur doof.", -- A_Space_Adventure:final
-["Nameless Heroes"]="Namenlose Helden",
 ["Name"]="Name",
 ["Nancy Screw"]="Lockere Schraube",
 ["Napalm Rocket"] = "Napalmrakete", -- Continental_supplies
 ["Naranja Jed"]="Orangus Otus",
-["Natives"]="Eingeborene",
 ["Naughty Ninja"]="Böser Ninja",
 ["Near a PAotH base on the moon ..."] = "In der Nähe einer PAdI-Basis auf dem Mond …", -- A_Space_Adventure:moon01
 ["Near Secret Base 17 of PAotH in the rural Hogland ..."]="In der Nähe der Geheimbasis 17 der PAdI im ländlichen Igelland …", -- A_Space_Adventure:cosmos
@@ -1543,11 +1518,8 @@
 ["Oh, my! I forgot something!"] = "Oha! Ich habe etwas vergessen!", -- A_Classic_Fairytale:queen
 ["Oh, my!"]="Ohje!",
 ["Oh, my! This is even more entertaining than I've expected!"]="Haha! Das ist sogar noch lustiger, als ich erwartet hatte!",
-["Oh no! Just try again!"]="Oh nein! Versuch's nochmal!",
 ["Oh no, not %s!"] = "Oh nein, nicht %s!", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
-["Oh no, the Green Bananas have betrayed Hog Solo and stole the anti-gravity device part!"] = "Oh nein, die Grünen Bananen haben Igel Einsam betrogen und das Teil des Antischwerkraftgeräts gestohlen!", -- A_Space_Adventure:fruit02
-["Oh no! Time's up! Just try again."]="Oh nein! Die Zeit ist um! Versuch es nochmal.",
-["Oh no! You failed! Just try again."]="Oh nein! Du hast versagt! Versuch es nochmal.",
+["Oh no, the companions have betrayed %s and stole the anti-gravity device part!"] = "Oh nein, die Begleiter haben %s betrogen und das Antischwerkraftgerät gestohlen!", -- A_Space_Adventure:fruit02
 ["Oh no! You have died. Try again!"] = "Oh nein, du bist tot. Versuch es nochmal!", -- Basic_Training_-_Flying_Saucer
 ["Oh! Please spare me. You can take all my treasures!"]="Oh, bitte verschone mich! Du kannst all meine Schätze nehmen.",
 ["Oh, silly me! I forgot that I'm the shaman."]="Ach, ich Dummkopf! Ich hab vergessen, dass ich der Schamane bin.",
@@ -1572,8 +1544,8 @@
 ["One shall not judge one by one's appearance!"] = "Man sollte Andere nicht nach ihrem Aussehen beurteilen.", -- A_Classic_Fairytale:epil
 ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."]="Ein Stamm war friedlich und verbrachte die Zeit mit der Jagd, Übungen und den kleinen Freuden des Lebens.",
 ["Oneye"] = "Einauge", -- portal
-["Only Hog Solo can be trusted with the crate."] = "Nur Igel Einsam kann man die Kiste anvertrauen.", -- A_Space_Adventure:fruit02
 ["Only one hog per team allowed! Excess hogs will be removed."] = "Nur ein Igel pro Team erlaubt! Überschüssige Igel werden entfernt.", -- Mutant
+["Only %s can be trusted with the crate."] = "Die Kiste kann nur %s anvertraut werden.", -- A_Space_Adventure:fruit02
 ["Only the best pilots can master the following stunts."] = "Nur die besten Piloten können die folgenden Stunts meistern.", -- Basic_Training_-_Flying_Saucer
 ["Only two clans allowed! Excess hedgehogs will be removed."] = "Nur zwei Klans erlaubt! Überschüssige Igel werden entfernt.", -- CTF_Blizzard
 ["On the Desert Planet, Hog Solo found some time to play with his RC plane"] = "Auf dem Wüstenplaneten hat Igel Einsam etwas Zeit gefunden, um mit seinem Funkflugzeug zu spielen.", -- A_Space_Adventure:desert03
@@ -1586,6 +1558,7 @@
 ["Oops, I've been spotted and I have no weapons! I am doomed!"]="Upps! Ich wurde entdeckt und ich habe keine Waffen! Ich bin verloren!",
 ["Oops! You have selected the wrong hedgehog! Just try again."] = "Upps! Du hast den falschen Igel ausgewählt! Versuch es einfach erneut.", -- Basic_Training_-_Movement
 ["Open ammo menu: [Right click]"] = "Munitionsmenü öffnen: [Rechtsklick]", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
+["Open ammo menu: Tap the [Suitcase]"] = "Munitionsmenü öffnen: [Koffer] antippen", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
 ["Open that crate and we will continue!"]="Öffne diese Kiste und wir werden fortfahren!",
 ["Orange"] = "Orange", -- 
 ["Orlando Boom!"]="Orlando Bumm!",
@@ -1597,19 +1570,18 @@
 ["Ouch! You just took fall damage."] = "Autsch! Du hast Fallschaden genommen.", -- Basic_Training_-_Movement
 ["Our tribe, our beautiful island!"]="Unser Stamm, unsere schöne Insel!",
 ["Out of ammo!"] = "Munition ist alle!", -- Tumbler
-["Out of ammo! Try again!"] = "Munition ist alle! Versuch's noch mal!", -- Basic_Training_-_Bazooka
+["Out of ammo! Try again!"] = "Munition ist alle! Versuch’s noch mal!", -- Basic_Training_-_Bazooka
 ["Over the Water"] = "Über dem Wasser", -- Basic_Training_-_Rope
 ["PAotH has sent explosives but unfortunately the trigger mechanism seems to be faulty!"]="PAdI hat Sprengstoffe geschickt, aber leider scheint der Auslöser defekt zu sein.",
 ["PAotH"]="PAdI",
 ["Patches"] = "Flick", -- 
-["Pathetic Resistance"]="Erbärmlicher Widerstand",
 ["Paul McHoggy"]="Paul McIgel",
 ["Pause: [P]"] = "Pause: [P]", -- Basic_Training_-_Movement
+["Pause: Tap the [Pause] button"] = "Pause: [Pause]-Taste antippen", -- Basic_Training_-_Movement
 ["Pause the game by pressing the pause key (default \"P\") for more details"]="Pausiere das Spiel, indem du die Pausetaste (standardmäßig »P«) drückst, um mehr zu erfahren.",
 ["Penalty: If you violate above rule, you have to skip in the next turn."] = "Strafe: Wenn du obige Regel verletzt, musst du den nächsten Zug aussetzen.", -- WxW
 ["Penguin Roar"] = "Pinguinröhren", -- Continental_supplies
 ["Perfect! Now try to get the next crate without hurting yourself!"]="Perfekt! Jetzt versuch, zur nächsten Kiste zu gelangen, ohne dich zu verletzen!",
-["Per-Hog Ammo"]="Munition pro Igel",
 ["Per-hog Ammo: Weapons are not shared between hogs"] = "Igelwaffen: Igel teilen sich Waffen nicht untereinander", -- User_Mission_-_Nobody_Laugh
 ["Personal best: %.3f seconds"] = "Persönliche Bestzeit: %.3f Sekunden", -- A_Space_Adventure:ice02
 ["Pfew! That was close!"]="Puh! Das war knapp!",
@@ -1617,7 +1589,6 @@
 ["Physicist"]="Physiker",
 ["PickHammer"]="Presslufthammer",
 ["Pikachu"] = "Pikachu", -- 
-["Pincer Knights"] = "Kneifzangenkrieger", -- Bazooka_Battlefield
 ["Pings left: %d"] = "Verbleibende Pings: %d", -- Space_Invasion
 ["Pink"] = "Rosa", -- 
 ["Pirates"] = "Piraten", -- 
@@ -1668,8 +1639,6 @@
 ["Please wait …"] = "Bitte warten …", -- WxW
 ["Point Blank Combo! +5 points!"] = "Ganz-Schön-Dicht-Dran-Kombi! +5 Punkte!", -- Space_Invasion
 ["--- Points Mode ---"] = "--- Punktemodus ---", -- Battalion
-["points"]="Punkte",
-["point(s)"] = "Punkt(e)", -- Mutant
 ["Poison"]="Gift",
 ["Poisonous Apple"]="Giftapfel",
 ["Poisonous, deals no damage."] = "Giftig, macht keinen Schaden.", -- Continental_supplies
@@ -1687,35 +1656,35 @@
 ["Prepare for battle!"]="Bereitmachen zum Kämpfen!",
 ["Prepare to fight"]="Bereitmachen zum Kämpfen",
 ["Prepare to flee!"]="Bereitmachen zum Fliehen!",
-["Prepare yourself"]="Mach dich bereit",
+["Prepare yourself, %s!"] = "Mach dich bereit, %s!", -- The_Specialists
 ["Press [Attack] (space bar by default) to start,|repeatedly tap the up, left and right movement keys to accelerate."] = "Drücke [Angriff] (standardmäßig die Leertaste) zum Starten,|drücke wiederholt die Bewegungstasten oben,|links und rechts zum Beschleunigen.", -- Basic_Training_-_Flying_Saucer
 ["Press [Attack] to begin."] = "Drücke [Angreifen], um anzufangen.", -- A_Classic_Fairytale:first_blood
 ["Press [Attack] to confirm."] = "Drücke [Angreifen] zum Bestätigen.", -- Continental_supplies
 ["Press [Attack] to select this continent!"] = "Drücke [Angreifen], um diesen Kontinent auszuwählen!", -- Continental_supplies
 ["Press [Left] and [Right] to change the difficulty."] = "Drücke [Links] und [Rechts], um den Schwierigkeitsgrad zu ändern.", -- A_Classic_Fairytale:first_blood
-["Press [Left] or [Right] to move around, [Enter] to jump"]="Drücke [Links] oder [Rechts] zum Bewegen, [Eingabe] zum Springen.",
+["Press [Left] or [Right] to move around, [Long Jump] to jump forwards."] = "Drücke [Links]/[Rechts] zum Bewegen, [Weitsprung], um vorwärts zu springen.", -- A_Classic_Fairytale:first_blood
 ["Press [Long jump] to accept this configuration and begin placing hedgehogs."] = "Drücke [Weitsprung], um diese Konfiguration zu akzeptieren|und mit der Igelplatzierung anzufangen.", -- WxW
 ["Press [Long jump] to accept this configuration and start the game."] = "Drücke [Weitsprung], um diese Konfiguration zu akzeptieren|und das Spiel zu starten.", -- WxW
+["Press [M] to see the mission texts"] = "Drücke [M], um die Missionstexte zu sehen", -- Basic_Training_-_Movement
 ["Press [Precise] to skip intro"]="Drücke [Genaues Zielen], um das Intro zu überspringen",
 ["Press [Up] and [Down] to move between menu items.|Press [Attack], [Left], or [Right] to toggle."] = "Drücke [Hoch] und [Runter], um zwischen Menüpunkten zu wechseln.|Drücke [Angriff], [Links] oder [Rechts] zum Wechseln.", -- WxW
 ["Prestigious Pilot"]="Prestigeträchtiger Pilot",
 ["Princess Peach"] = "Prinzessin Peach", -- 
 ["Princess"] = "Prinzessin", -- A_Classic_Fairytale:family, A_Classic_Fairytale:journey
-["Private Nolak"]="Gefreiter Nolak",
 ["Problems, dude? Chillax!"] = "Mann, hast du ein Problem? Chill mal!", -- A_Classic_Fairytale:epil
 ["Professional pilot"]="Profipilot",
 ["Professional stunt pilot"]="Profi-Stuntpilot",
 ["Professor Hogevil, then known as James Hogus, worked for PAotH back in my time."]="Professor Bösigel, früher bekannt als Jakobus Iglus, arbeitete in meiner Zeit für PAdI.", -- A_Space_Adventure:moon02
 ["Professor"]="Professor",
+["Professor's Team"] = "Professors Team", -- A_Space_Adventure:death01
 ["Prof. Hogevil"]="Prof. Bösigel",
-["Pro Killers"] = "Profikiller", -- Big_Armory
 ["Protect the King: When the king dies, so does the team"] = "Beschützt den König: Wenn der König stirbt, stirbt das Team mit", -- Battalion
-["Protect yourselves!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "Beschütze dich!|Granatentipp: Setze den Zeitzünder mit [1-5], ziele mit [Hoch]/[Runter] und halte [Leer] für mehr Kraft", -- A_Classic_Fairytale:shadow
 ["Purple"] = "Violett", -- 
 ["Pyromancer"]="Feuermacher",
 ["Pyro"]="Pyromane",
 ["Quit: [Esc]"] = "Verlassen: [Esc]", -- Basic_Training_-_Movement
 ["Race complexity limit reached"] = "Rennkomplexitätslimit erreicht", -- Racer, TechRacer
+["Race failed!"] = "Rennen gescheitert!", -- A_Space_Adventure:moon02
 ["Racer tool"] = "Wettrennwerkzeug", -- Racer
 ["Racer"] = "Wettrennen", -- Racer
 ["Race"] = "Wettrennen", -- TrophyRace
@@ -1748,22 +1717,18 @@
 ["Replenishment: Weapons are restocked on turn start of a new hog"] = "Aufstockung: Waffen werden am Zugbeginn eines neuen Igels aufgestockt", -- Highlander
 ["Repositioning Mode"] = "Repositionierungsmodus", -- HedgeEditor
 ["REPOSITIONING MODE"] = "REPOSITIONIERUNGSMODUS", -- HedgeEditor
-["rescues"] = "gerettet", -- User_Mission_-_That_Sinking_Feeling
 ["Rescue the imprisoned PAotH team and get the fuel!"]="Rette das gefangene PAdI-Team und hol dir den Treibstoff!",
 ["Respawner: Resurrects dead hogs."] = "Wiederbeleber: Belebt tote Igel wieder.", -- Construction_Mode
 ["Respawner"]="Wiederbeleber",
 ["Retract/Extend rope: [Up]/[Down]"] = "Seil einziehen/ausfahren: [Hoch]/[Runter]", -- Basic_Training_-_Rope
 ["- Return the enemy flag to your base to score"] = "- Bring die Feindesflagge zu deiner Basis, um zu punkten", -- Capture_the_Flag
-[" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"]=" – Bringe die gegnerische Flagge zu deiner Heimatbasis, um zu punkten | – Das Team, das zuerst 3 Flaggen erobert, gewinnt | – Du kannst nur punkten, wenn deine eigene Flagge in deiner Basis ist | – Igel lassen die Flagge fallen, wenn sie sterben oder ertrinken | – Fallengelassene Flaggen können zurückgebracht oder wieder gestohlen werden | – Igel tauchen nach ihrem Tod wieder auf",
 ["Return to Leaks A Lot!"] = "Kehre zu Undichte Stelle zurück!", -- A_Classic_Fairytale:shadow
 ["Return to the mission menu by pressing the \"Go back\" button."]="Kehre zum Missionsmenü zurück, indem du den »Zurück«-Knopf drückst.", -- A_Space_Adventure:cosmos
 ["Return to the Surface"]="Zurück an die Oberfläche",
 ["Return to the training menu by pressing the “Go back” button."] = "Kehre zum Trainingsmenü zurück, indem du den »Zurück«-Knopf drückst.", -- Basic_Training_-_Movement
-["Rhombus"] = "Raute", -- Basic_Training_-_Movement
 ["Rider"] = "Reiter", -- portal
 ["Rifleman"]="Schütze",
 ["Righteous Beard"]="Redlicher Bart",
-["Right Tong"] = "Rechte Kneifzange", -- Bazooka_Battlefield
 ["Ripe"] = "Reif", -- 
 ["Rise the water if nobody else is in the circle and deal 6 damage to all enemy hogs."] = "Lass das Wasser steigen, wenn sonst keiner im Kreis ist, und richte 6 Schaden auf alle Feinde an.", -- Continental_supplies
 ["Robert Yellow Apple"]="Robert Gelbapfel",
@@ -1771,8 +1736,8 @@
 ["Ronald"] = "Ronald", -- portal
 ["Roof"] = "Decke", -- WxW
 ["Rope-knocking Challenge"] = "Seilschubsen", -- User_Mission_-_Rope_Knock_Challenge
-["Roper"] = "Seiler", -- 
 ["Ropes and Crates"]="Seile und Kisten",
+["Ropes can be fired again in the air!"] = "Seile können in der Luft erneut gefeuert werden!", -- A_Classic_Fairytale:first_blood
 ["Rope Weapons"] = "Seilwaffen", -- Basic_Training_-_Rope
 ["Rope won't get reset"]="Seil wird nicht zurückgesetzt.",
 ["Roshi"] = "Roschi", -- 
@@ -1784,7 +1749,6 @@
 ["Round limit:"] = "Rundenbegrenzung:", -- TechRacer
 ["Rounds complete: %d/%d"] = "Gespielte Runden: %d/%d", -- Racer, Space_Invasion, TechRacer
 ["Round's slowest lap: %.3fs by %s"] = "Schlechteste Zeit der Runde: %.3fs von %s", -- TrophyRace
-["Rounds until Sudden Death: %d"] = "Runden bis zum Sudden Death: %d", -- Battalion
 ["RS1"]="RE1",
 ["RS2"]="RE2",
 ["Rubber"]="Gummi",
@@ -1808,10 +1772,17 @@
 ["Salvation was one step closer now..."]="Die Erlösung war nun einen Schritt näher.",
 ["Sam"]="Steffen",
 ["Sandals?! I thought you left your ring!"] = "Sandalen?! Ich dachte, du hattest deinen Ring vergessen!", -- A_Classic_Fairytale:queen
+["%s and GB"] = "%s und GB", -- A_Space_Adventure:fruit02
 ["%s and %s enter the battlefield"] = "%s und %s betreten das Schlachtfeld", -- A_Space_Adventure:fruit01
 ["Sandstorm"]="Sandsturm",
 ["Sandy"]="Sandi",
-["Save as many hapless hogs as possible!"]="Rette so viele glücklose Igel wie möglich!",
+["%s arrived at the Desert Planet!"] = "%s ist auf dem Wüstenplaneten angekommen!", -- A_Space_Adventure:cosmos
+["%s arrived at the Fruit Planet!"] = "%s ist auf dem Obstplaneten angekommen!", -- A_Space_Adventure:cosmos
+["%s arrived at the Ice Planet!"] = "%s ist auf dem Eisplaneten angekommen!", -- A_Space_Adventure:cosmos
+["%s arrived at the meteorite!"] = "%s ist auf dem Meteoriten angekommen!", -- A_Space_Adventure:cosmos
+["%s arrived at the moon!"] = "%s ist auf dem Mond angekommen!", -- A_Space_Adventure:cosmos
+["%s arrived at the Planet of Death!"] = "%s ist auf dem Planeten des Todes angekommen!", -- A_Space_Adventure:cosmos
+["Save as many hogs as possible!"] = "Rette so viele Igel, wie du kannst!", -- User_Mission_-_That_Sinking_Feeling
 ["Save Fell From Heaven!"]="Rette Fiel Vom Himmel!",
 ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "Rette Undichte Stelle!|Tipp: Das Werkzeug »Igel wechseln« könnte von Nutzen sein.", -- A_Classic_Fairytale:shadow
 ["Save Level: Precise+4"]="Level sichern: Genaues Zielen + 4",
@@ -1823,16 +1794,17 @@
 ["%s bravely climbed up to a dizzy height of %d to reach home."]="Mutig erklomm %s eine schwindelerregende Höhe von %d, um das Zuhause zu erreichen.",
 ["Scallywag"] = "Tunichtgut", -- 
 ["Scalp Muncher"]="Skalpknabberer",
-["Scenario failed!"] = "Szenario fehlgeschlagen!", -- SimpleMission
 ["Scenario"] = "Szenario", -- Big_Armory, portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape
 ["Scientist"]="Wissenschaftler",
 ["%s climbed home in %d seconds!"] = "%s ist in %d Sekunden nach Hause geklettert!", -- ClimbHome
+["%s (contd.)"] = "%s (mehr)", -- A_Classic_Fairytale:epil
 ["Score: %d"] = "Punktzahl: %d", -- Space_Invasion
 ["Score goal: %d"] = "Punkteziel: %d", -- Control
 ["Score graph"] = "Punktegraph", -- Mutant
 ["Score points by killing other hedgehogs."] = "Hole Punkte, indem du andere Igel tötest.", -- Mutant
 ["Scores:"] = "Punktestand:", -- Mutant
 ["Scoring: "] = "Punktewertung: ", -- Mutant
+["%s couldn't escape, try again!"] = "%s konnte nicht fliehen, versuch es erneut!", -- A_Space_Adventure:fruit01
 ["Script parameter examples:"] = "Skriptparameterbeispiele:", -- Gravity
 ["%s: %d (deaths: %d)"] = "%s: %d (Tode: %d)", -- Mutant
 ["%s (%d), %d sec"] = "%s (%d), %d s", -- Continental_supplies
@@ -1844,10 +1816,9 @@
 ["%s (+%d)"] = "%s (+%d)", -- Battalion
 ["%s (%d)"] = "%s (%d)", -- Continental_supplies
 ["%s, %d sec"] = "%s, %d s", -- Continental_supplies
-["Search for the device with the help of the other hedgehogs "]="Such nach dem Gerät mit der Hilfe der anderen Igel.",
+["Search for the device with the help of the other hedgehogs."] = "Such nach dem Gerät mit der Hilfe der anderen Igel.", -- A_Space_Adventure:fruit02
 ["Searching in the dust"]="Suche im Staub",
 ["Searching the stars!"]="Suche in den Sternen",
-["seconds"]="Sekunden",
 ["Seems like every time you take a \"walk\", the enemy finds us!"] = "Es scheint, dass jedes Mal, wenn du »spazieren« gehst, der Feind uns findet!", -- A_Classic_Fairytale:backstab
 ["See that crate farther on the right?"]="Siehst du die Kiste weiter rechts?",
 ["See ya!"]="Mach's gut!",
@@ -1870,6 +1841,7 @@
 ["Select your continent with [Up]/[Down] or by selecting a representative weapon."] = "Wähle deinen Kontinent mit [Hoch]/[Runter]. Alternativ kannst du eine repräsentative Waffe wählen.", -- Continental_supplies
 ["%s enters the battlefield"] = "%s betritt das Schlachtfeld", -- A_Space_Adventure:fruit01
 ["Sergey"] = "Sergey", -- 
+["%s escaped successfully!"] = "%s ist erfolgreich geflohen!", -- A_Space_Adventure:fruit01
 ["Set bounciness: [Left Shift] + [1]-[5]"] = "Sprunghaftigkeit setzen: [Umschalt links] + [1]-[5]", -- Basic_Training_-_Grenade
 ["Set detonation timer: [1]-[5]"] = "Explosionszeitzünder einstellen: [1]-[5]", -- Basic_Training_-_Grenade
 ["Set Health: [Left Click]"]="Gesundheit setzen: [Linksklick]",
@@ -1888,16 +1860,18 @@
 ["%s gets an extra life"] = "%s erhält ein Extraleben", -- Construction_Mode
 ["%s goes the way of the lemming."] = "%s geht den Weg der Lemminge.", -- User_Mission_-_Rope_Knock_Challenge
 ["Sgt. Smith"] = "Gfr. Schmidt", -- 
-["%s had it coming."] = "%s hat's verdient.", -- User_Mission_-_Rope_Knock_Challenge
+["%s had it coming."] = "%s hat’s verdient.", -- User_Mission_-_Rope_Knock_Challenge
 ["%s had no chance."] = "%s hatte keine Chance.", -- User_Mission_-_Rope_Knock_Challenge
 ["... share your beauty with the world every morning, my princess!"]="…, ja, wie du deine Schönheit mit dem Rest der Welt teilst, meine Prinzessin!",
 ["%s has been killed before taking enough damage first."] = "%s ist vor dem Erleiden des erforderlichen Schadens gestorben.", -- SimpleMission
 ["%s has been knocked out."] = "%s wurde eliminiert.", -- User_Mission_-_Rope_Knock_Challenge
 ["%s has been rescued from death"] = "%s wurde wiederbelebt", -- Construction_Mode
+["%s has dropped the flag!"] = "%s ließ die Flagge fallen!", -- CTF_Blizzard
 ["%s has fallen victim to gravity."] = "%s fiel der Schwerkraft zum Opfer.", -- User_Mission_-_Rope_Knock_Challenge
 ["%s has mutated! +2 points"] = "%s mutierte! +2 Punkte", -- Mutant
 ["%s has passed the best height of %s!"]="%s hat die Besthöhe von %s überschritten!",
 ["%s has scored!"] = "%s hat gepunktet!", -- Capture_the_Flag
+["%s has to refuel the saucer."] = "%s muss die Untertasse auftanken.", -- A_Space_Adventure:moon01
 ["%s hates Newton."] = "%s hasst Newton", -- User_Mission_-_Rope_Knock_Challenge
 ["She endangered the whole tribe!"] = "Sie hatte den ganzen Stamm in Gefahr gebracht!", -- A_Classic_Fairytale:epil
 ["sheepluva"] = "sheepluva", -- 
@@ -1914,8 +1888,6 @@
 ["Shinobi"] = "Shinobi", -- 
 ["%s hit the ground."] = "%s traf den Boden.", -- User_Mission_-_Rope_Knock_Challenge
 ["Shoppa Love"]="Seilliebe",
-["Shoppa Union"]="Konsumentenunion",
-["Shoppers"] = "Käufer", -- 
 ["Sigh."] = "Seufz.", -- A_Classic_Fairytale:epil
 ["Silly"]="Doofi",
 ["Silver"] = "Silber", -- 
@@ -1926,11 +1898,11 @@
 ["%s is now as poor as a church mouse"] = "%s ist jetzt so arm wie eine Kirchenmaus", -- Construction_Mode
 ["%s is now a zombie hedgehog"] = "%s ist jetzt ein Zombie-Igel", -- Construction_Mode
 ["%s is suddenly low on ammo"] = "%s fehlt es plötzlich an Munition", -- Construction_Mode
-["Skip your turn to try again."] = "Überspringe deinen Zug, um es erneut zu versuchen.", -- Basic_Training_-_Rope
 ["Skulls"] = "Schädels", -- Bazooka_Battlefield
 ["Slimer"] = "Schleimer", -- 
 ["Slippery"]="Rutschig",
 ["%s lost all the weapons"] = "%s hat alle Waffen verloren", -- Construction_Mode
+["%s lost, try again!"] = "%s hat verloren, versuch es nochmal!", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
 ["Slot %d: %s"] = "Slot %d: %s", -- Frenzy
 ["Slot keys save time! (F1-F10 by default)"]="Schnelltasten, um Zeit zu sparen! (standardmäßig F1–F10)",
 ["Slowpoke"] = "Flegmon", -- 
@@ -1944,6 +1916,7 @@
 ["Smith 0.99f"]="Smith 0.99f",
 ["Smith 1.0"]="Smith 1.0",
 ["Smugglers"]="Schmuggler",
+["%s must collect the final crates."] = "%s muss die letzten Kisten aufsammeln.", -- A_Space_Adventure:fruit02
 ["%s must skip this turn for rule violation."] = "%s muss wegen einer Regelverletzung aussetzen.", -- WxW
 ["Sneaks"] = "Schleichs", -- Bazooka_Battlefield
 ["%s never got the ninja diploma."]="%s ist bei der Ninjaprüfung durchgefallen.",
@@ -1951,10 +1924,8 @@
 ["Sniper! +8 points!"] = "Scharfschütze! +8 Punkte!", -- Space_Invasion
 ["Sniper"]="Heckenschütze",
 ["Sniper Training"]="Scharfschützen-Training",
-["Sniperz"]="Heckenschützen",
 ["So, as promised I have brought you where I think that the device you are looking for is hidden."]="Nun, wie versprochen habe ich dich an den Ort gebracht, von dem ich glaube, dass das Gerät dort versteckt ist.",
 ["So far, you had infinite ropes, but in the|real world, ropes are usually limited."] = "Bisher hattest du unendlich viele Seile,|aber in der realen Welt sind Seile normalerweise begrenzt.", -- Basic_Training_-_Rope
-["So Hog Solo, here we are ..."]="Also, Igel Einsam, da wären wir!",
 ["So humiliating..."]="Welch Demütigung!",
 ["So, I believe that it's a good place to start."]="Also glaube ich, dass es ein guter Ort zum Anfangen ist.", -- A_Space_Adventure:desert01
 ["So, I kindly ask for your help."]="Also bitte ich dich ergebenst um Hilfe.",
@@ -1965,15 +1936,16 @@
 ["Some parts of the land are indestructible."]="Einige Teile des Landes sind unzerstörbar.",
 ["Some sick game of yours?!"] = "Ein krankes Spiel von euch?!", -- A_Classic_Fairytale:queen
 ["Some weapons can be dropped from the rope."] = "Einige Waffen können vom Seil aus fallen gelassen werden.", -- Basic_Training_-_Rope
-["Somewhere else on the planet of fruits, Captain Lime helps Hog Solo"]="Irgendwo anders auf dem Obstplaneten hilft Leutnant Limone Igel Einsam",
-["Somewhere else on the planet of fruits Hog Solo gets closer to the device"]="Anderswo auf dem Obstplaneten kommt Igel Einsam näher an das Gerät.",
+["Somewhere else on the planet of fruits, Captain Lime helps %s"] = "Irgendwo anders auf dem Planeten des Obstes hilft Leutnant Limone %s", -- A_Space_Adventure:fruit02
+["Somewhere else on the planet of fruits, %s gets closer to the device"] = "Irgendwo anders auf dem Planeten des Obstes kommt %s näher an das Gerät", -- A_Space_Adventure:fruit02
 ["Somewhere in the Fruit Planet Hog Solo got lost ..."]="Irgendwo auf dem Obstplaneten hat sich Igel Einsam verlaufen …",
 ["Somewhere in the Planet of Death..."]="Irgendwo auf dem Todesplaneten …",
 ["Somewhere on the Planet of Death ..."] = "Irgendwo auf dem Planeten des Todes …", -- A_Space_Adventure:death02
 ["Somewhere on the Planet of Fruits a terrible war is about to begin ..."]="Irgendwo auf dem Obstplaneten steht ein fürchterlicher Krieg bevor",
 ["Somewhere on the uninhabitable Death Planet ..."]="Irgendwo auf dem unbewohnbaren Todesplaneten …",
 ["So, now I got the last part and I have your friends captured."]="Und jetzt habe ich das letzte Teil und deine Freunde gefangengenommen.",
-["So the princess was never heard of again ..."] = "Und so hörte man nie wieder was von der Prinzessin …", -- A_Classic_Fairytale:family
+["So, %s, here we are ..."] = "Nun, %s, hier wären wir …", -- A_Space_Adventure:cosmos
+["So the princess was never heard of again ..."] = "Und so hörte man nie wieder von der Prinzessin …", -- A_Classic_Fairytale:family
 ["So, uhmm, how did you manage to teleport them so far?"] = "Und, ähm, wie hast du es geschafft, sie so weit zu teleportieren?", -- A_Classic_Fairytale:epil
 ["Sour"] = "Sauer", -- 
 ["South America"]="Südamerika",
@@ -2020,7 +1992,7 @@
 ["%s (%s) is addicted to killing: %d invaders destroyed in one round."] = "%s (%s) ist im Tötungsrausch: %d Invasoren in einer Runde zerstört .", -- Space_Invasion
 ["%s (%s) is a hardened hunter: No misses and %d hits in its best round!"] = "%s (%s) ist ein abgehärteter Jäger: Kein Schuss verfehlt und %d Treffer in der besten Runde!", -- Space_Invasion
 ["%s (%s) is a tumbleweed: %d points in one round."] = "%s (%s) schlägt Purzelbäume: %d Punkte in einer Runde.", -- Space_Invasion
-["%s (%s) is good at this: %d points in only one round!"] = "%s (%s) hat's echt drauf: %d Punkte in nur einer Runde.", -- Space_Invasion
+["%s (%s) is good at this: %d points in only one round!"] = "%s (%s) hat’s echt drauf: %d Punkte in nur einer Runde.", -- Space_Invasion
 ["%s (%s) is Rambo in a hedgehog costume! He destroyed %d invaders in one round."] = "%s (%s) ist Rambo im Igelkostüm: Er zerstörte %d Invasoren in nur einer Runde.", -- Space_Invasion
 ["%s skipped ninja classes."]="%s hat den Ninjaunterricht geschwänzt.",
 ["%s spawned at a really bad position."] = "%s hatte eine sehr schlechte Startposition.", -- User_Mission_-_Rope_Knock_Challenge
@@ -2073,8 +2045,6 @@
 ["Structure Placement Mode"]="Gebäudeplatzierungsmodus",
 ["Structure Placer"] = "Gebäudeplatzierer", -- Construction_Mode
 ["Stupid, stupid Hogerians!"] = "Dumme, dumme Hogerianer!", -- A_Space_Adventure:final
-["Subject 1"] = "Subjekt 1", -- portal
-["Subjects"] = "Subjekte", -- portal
 ["Subtract %d"] = "%d subtrahieren", -- HedgeEditor
 ["--- Sudden Death ---"] = "--- Sudden Death ---", -- Battalion
 ["Summer Squash"]="Sommerkürbis",
@@ -2091,7 +2061,7 @@
 ["Surfer! +15 points!"]="Surfer! +15 Punkte",
 ["Surfer!"]="Surfer!",
 ["Surprise supplies: Get 1-3 random weapons each turn."] = "Überraschungsnachschub: Erhalte 1-3 zufällige Waffen pro Zug.", -- Continental_supplies
-["Survive!|Hint: Cinematics can be skipped with the [Precise] key."]="Überlebe!|Tipp: Zwischensequenzen können mit der [Genaues Zielen]-Taste übersprungen werden.",
+["Survive!"] = "Überlebe!", -- A_Classic_Fairytale:shadow
 ["%s violated the “All But Last” rule and will be penalized."] = "%s verletzte die »Nicht Den Letzten«-Regel und wird aussetzen müssen.", -- WxW
 ["%s violated the “Kill The Leader” rule and will be penalized."] = "%s verletzte die »Tötet Den Besten«-Regel und wird aussetzen müssen.", -- WxW
 ["Swap place with a random enemy in the circle."] = "Vertausch die Plätze mit einem zufälligen Gegner im Kreis.", -- Continental_supplies
@@ -2110,6 +2080,7 @@
 ["%s! Why?!"] = "%s! Warum!", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
 ["Swing, Leaks A Lot, on the wings of the wind!"]="Schwing, Undichte Stelle, auf den Flügeln des Windes!",
 ["Swing: [Left]/[Right]"] = "Schwingen: [Links]/[Rechts]", -- Basic_Training_-_Rope
+["%s wins, congratulations!"] = "%s gewinnt, Gratulation!", -- A_Space_Adventure:moon01
 ["%s wins!"]="%s gewinnt!",
 ["%s wins with a best time of %.1fs."] = "%s gewinnt mit einer Bestzeit von %.1fs.", -- Racer, TechRacer
 ["Switch: Drop ball of dirt from parachute (once)"] = "Wechseln: Erdklumpen fallen lassen (ein mal)", -- Continental_supplies
@@ -2120,6 +2091,7 @@
 ["Switch hedgehog: [Tabulator]"] = "Igel wechseln: [Tabulator]", -- Basic_Training_-_Movement
 ["Switch: Select weapon special"] = "Wechseln: Waffenextra auswählen", -- Continental_supplies
 ["Switch: Toggle crate radar"] = "Wechseln: Kistenradar umschalten", -- WxW
+["%s won!"] = "%s gewinnt!", -- A_Space_Adventure:fruit01
 ["Swords"] = "Schwerter", -- Bazooka_Battlefield
 ["Syntax Errol"]="Syntaxfehlel",
 ["%s, you may choose the rules."] = "%s, du darfst die Regeln bestimmen", -- WxW
@@ -2133,6 +2105,8 @@
 ["Tails"] = "Fuß", -- 
 ["Talk about mixed signals..."]="Zuckerbrot und Peitsche …",
 ["Tall Potato"]="Großkartoffel",
+["Tap [Pause] to see the mission texts"] = "[Pause] antippen, um Missionstexte zu sehen", -- Basic_Training_-_Movement
+["Tap the “rotating arrow” button on the left|until you have selected Cappy, the hedgehog with the cap!"] = "Tippe den Knopf mit den rotierenden Pfeilen links unten an,|bis du Käppi ausgewählt hast, dem Igel mit der Mütze!", -- Basic_Training_-_Movement
 ["Target Placement Mode"]="Zielscheibenplatzierungsmodus",
 ["TARGET PLACEMENT MODE"] = "ZIELSCHEIBENPLATZIERUNGSMODUS", -- HedgeEditor
 ["Target Practice: Bazooka (easy)"] = "Zielübung: Bazooka (einfach)", -- Target_Practice_-_Bazooka_easy
@@ -2147,14 +2121,17 @@
 ["Tatsujin"] = "Tatsujin", -- 
 ["Tatters"] = "Lumpen", -- 
 ["Team %d"] = "Team %d", -- SimpleMission
+["Team highscore: %d"] = "Team-Punkterekord: %d", -- Utils
 ["Team Identity Mode"]="Team-Identitätsmodus",
 ["TEAM IDENTITY MODE"]="TEAMIDENTITÄTSMODUS",
-["Team of Hearts"]="Team der Herzen",
+["Team lowscore: %d"] = "Niedrigste Team-Punktzahl: %d", -- Utils
 ["Teams are tied! Continue playing rounds until we have a winner!"] = "Gleichstand! Spielt weiter Runden, bis wir einen Sieger haben!", -- Space_Invasion
 ["Team’s best heights per round"]="Die Besthöhen der Teams pro Runde",
+["Team's best time: %.3fs"] = "Team-Bestzeit: %.3fs", -- Utils
+["Team's longest time: %.3fs"] = "Längste Zeit des Teams: %.3fs", -- Utils
+["Team's top accuracy: %d%"] = "Beste Treffgenauigkeit des Teams: %d%", -- Utils
 ["Teamwork 2"] = "Teamwork 2", -- User_Mission_-_Teamwork_2
 ["Teamwork"] = "Teamwork", -- User_Mission_-_Teamwork
-["Team Zook"]="Team Zook",
 ["TechRacer"] = "TechRacer", -- TechRacer
 ["Teleporation Node"]="Teleporterstation",
 ["Teleportation Node: Allows teleportation|    between other nodes."] = "Teleportationsstation: Ermöglicht Teleportation|    zwischen anderen Stationen.", -- Construction_Mode
@@ -2177,13 +2154,13 @@
 ["That is, indeed, very weird..."]="Das ist tatsächlich sehr merkwürdig.",
 ["That makes it almost invaluable!"]="Das macht es fast unbezahlbar!",
 ["That ought to show them!"]="Das wird ihnen eine Lehre sein!",
-["That's all, folks!"] = "Das war's, Leute!", -- A_Classic_Fairytale:epil
+["That's all, folks!"] = "Das war’s, Leute!", -- A_Classic_Fairytale:epil
 ["That's for my father!"]="Das ist für meinen Vater!",
 ["That shaman sure knows what he's doing!"]="Dieser Schamane weiß genau, was er tut!",
 ["That Sinking Feeling"]="Land unter",
 ["That's just the way it works, you know."] = "So laufen die Dinge halt, versteht ihr?", -- A_Classic_Fairytale:queen
 ["That's not our problem!"]="Das ist nicht unser Problem!",
-["That's typical of you!"]="Das ist so typisch für dich!",
+["That's typical of you!"]="Das ist so typisch für euch!",
 ["That's why he always wears a hat since then."]="Deshalb trägt er seitdem immer einen Hut.",
 ["That traitor won't be killing us anymore!"] = "Der Verräter wird uns nicht mehr ermorden!", -- A_Classic_Fairytale:queen
 ["That was just mean!"]="Das war einfach nur gemein!",
@@ -2214,7 +2191,7 @@
 ["The Customer is King"] = "Der Kunde ist König", -- Challenge_-_Speed_Shoppa_-_ShoppaKing
 ["the Desert Planet"]="der Wüstenplanet",
 ["The device part has been stolen!"] = "Das Geräteteil wurde gestohlen!", -- A_Space_Adventure:fruit02
-["The device part is hidden in one of the crates! Go and get it!"]="Das Bauteil ist in einer der Kisten versteckt. Geh und hole es!",
+["The device part is hidden in one of the crates! Go and get it!"]="Das Bauteil ist in eine der Kisten versteckt. Geh und hole es!",
 ["The Devs"] = "Die Proggers", -- 
 ["The Dilemma"]="Das Dilemma",
 ["The editor weapons and tools have been added!"]="Die Editorwaffen und -werkzeuge wurden hinzugefügt!",
@@ -2243,11 +2220,12 @@
 ["the Fruit Planet"]="der Obstplanet",
 ["The giant umbrella from the last crate should help break the fall."]="Der Riesenschirm aus der letzten Kiste sollte helfen, den Sturz abzubremsen.",
 ["The Great Escape"]="Gesprengte Ketten",
-["The Green Bananas lost, try again!"]="Die Grünen Bananen haben verloren, versuche es nochmal!",
+["- The green target must survive"] = "- Das grüne Ziel muss überleben", -- HedgeEditor
+["- The green targets must survive"] = "- Die grünen Ziele müssen überleben", -- HedgeEditor
 ["The guardian"]="Der Wächter",
 ["The hardships of the war turned %s (%s) into a killing machine: %d invaders destroyed in one round!"] = "Die Grauen des Krieges verwandelten %s (%s) in eine Tötungsmaschine: %d Invasoren in einer Runde getötet!", -- Space_Invasion
+["The health of your current hedgehog|is shown at the top right corner."] = "Die Gesundheit deines aktiven Igels|wird oben rechts angezeigt.", -- Basic_Training_-_Movement
 ["The hedgehog with least points (or most deaths) becomes the Bottom Feeder."] = "Der Igel mit den wenigsten Punkten (oder meisten Toden) wird zum Versager.", -- Mutant
-["The Hogies"]="Die Igelinge",
 ["The Hospital"] = "Das Krankenhaus", -- 
 ["the Ice Planet"]="der Eisplanet",
 ["The Individualist"]="Der Individualist",
@@ -2266,7 +2244,6 @@
 ["The Moonwalk"]="Der Mondspaziergang",
 ["The Mutant has super weapons and a lot of health."] = "Der Mutant hat Superwaffen und eine hohe Gesundheit.", -- Mutant
 ["The Mutant loses health quickly, but gains health by killing."] = "Der Mutant verliert schnell Gesundheit, heilt sich aber für jeden Abschuss.", -- Mutant
-["The Nameless One"]="Der Namenlose",
 ["The Navy greets %s for managing to get in a distance of %d away from the mainland!"]="Die Marine grüßt %s für einen Abstand von %d vom Festland!",
 ["The next 4 times you play the \"The last encounter\" mission you'll get 20 more hit points and a laser sight."]="Die nächsten 4 Male, die du die Mission »Das letzte Gefecht« spielst, wirst du 20 weitere Trefferpunkte und ein Laservisier erhalten.",
 ["The next crate is an utility crate."] = "Die nächste Kiste ist eine Werkzeugkiste.", -- Basic_Training_-_Movement
@@ -2278,6 +2255,7 @@
 ["Then what am I?"] = "Was bin ich dann?", -- A_Classic_Fairytale:epil
 ["The only woman, huh?"] = "Die einzige Frau, wie?", -- A_Classic_Fairytale:epil
 ["The oppression of the elders, of course!"] = "Die Unterdrückung der Ältesten natürlich!", -- A_Classic_Fairytale:queen
+["The other hog has died, he should have survived!"] = "Der andere Igel ist gestorben, er hätte überleben müssen!", -- A_Space_Adventure:moon02
 ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."]="Der andere Stamm bestand nur aus Kannibalen, sie verbrachten ihre Zeit damit, die Organe anderer Igel aufzufressen.",
 ["The part device is hidden in one of the crates! Go and get it!"]="Das Bauteil ist in einer der Kisten versteckt. Geh und hole es!",
 ["the Planet of Death"]="der Todesplanet",
@@ -2304,7 +2282,7 @@
 ["The Showdown"]="Das Showdown",
 ["The Slaughter"]="Die Schlachtung",
 ["The Society of Perfectionists greets %s (%s): No misses and %d hits in its best round."] = "Die Gesellschaft der Perfektionisten grüßt %s (%s): In der besten Runde %d Treffer, kein Schuss ging daneben.", -- Space_Invasion
-["THE SPECIALISTS"]="DIE SPEZIALISTEN",
+["The Specialists: Each hedgehog starts with its own weapon set"] = "Die Spezialisten: Jeder Igel startet mit seinen eigenen Waffen", -- The_Specialists
 ["The spinning arrows above your hedgehog show|which hedgehog is selected right now."] = "Die rotierenden Pfeile über deinen Igel zeigen an,|welcher Igel jetzt ausgewählt ist.", -- Basic_Training_-_Movement
 ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "Die Geister der Ahnen sind sicherlich erfreut, Undichte Stelle.", -- A_Classic_Fairytale:first_blood
 ["The targets will guide you through the training."] = "Die Zielscheiben führen dich durch die Übung.", -- Basic_Training_-_Rope
@@ -2350,7 +2328,6 @@
 ["This almost concludes our tutorial."] = "Damit ist unsere Übung fast abgeschlossen.", -- Basic_Training_-_Flying_Saucer
 ["This also increases the effectiveness of Medicine."] = "Dies erhöht außerdem die Wirksamkeit von Medizin.", -- Continental_supplies
 ["This game wasn’t really exciting."] = "Diese Runde war nicht so aufregend.", -- Space_Invasion
-["This Hog Solo is so naive! When he returns I'll shoot him and keep that device for myself!"]="Dieser Igel Einsam ist so naiv! Wenn er zurückkehrt, werde ich ihn erschießen und das Gerät für mich selbst behalten!",
 ["This is a new personal best, congratulations!"] = "Das ist eine neue persönliche Bestleistung, Gratulation!", -- A_Space_Adventure:death02, A_Space_Adventure:desert02, A_Space_Adventure:fruit03
 ["This is a new personal best time, congratulations!"] = "Das ist eine neue persönliche Bestzeit, Gratulation!", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 ["This is Cappy."] = "Das ist Käppi.", -- Basic_Training_-_Movement
@@ -2367,6 +2344,7 @@
 ["This rain is really something..."]="Das nenne ich mal einen Regenschauer …",
 ["This round’s award for ultimate disappointment goes to: Everyone!"]="Der ultimative Enttäuschungspreis geht in dieser Runde an: alle!",
 ["This seems like a wealthy hedgehog, nice ..."] = "Das scheint ein reicher Igel zu sein, nett …", -- A_Space_Adventure:desert01
+["This %s is so naive! I'm going to shoot this fool so I can keep that device for myself!"] = "%s ist so naiv! Ich werde diesen Deppen abknallen, damit ich das Gerät für mich behalten kann!", -- A_Space_Adventure:fruit02
 ["This was an awesome performance! But this challenge can be finished with even just one RC plane. Can you figure out how?"]="Das war eine großartige Vorstellung! Aber diese Herausforderung kann sogar mit nur einem Funkflugzeug gemeistert werden. Kannst du herausfinden, wie?",
 ["This will be fun!"]="Das wird Spaß machen!",
 ["This will be useful when I need a new platform or if I want to rise."] = "Das wird sich als nützlich erweisen, wenn ich eine neue Plattform brauche oder ich nach oben muss.", -- portal
@@ -2402,12 +2380,12 @@
 ["To begin with the training, hit the attack key!"] = "Um mit der Übung anzufangen, drücke die Angriffstaste.", -- Basic_Training_-_Movement
 ["To begin with the training, select the bazooka from the ammo menu!"] = "Um mit dem Training anzufangen, wähl die Bazooka aus dem Munitionsmenü aus!", -- Basic_Training_-_Bazooka
 ["To begin with the training, select the grenade from the ammo menu!"] = "Um mit dem Training anzufangen, wähl die Granate aus dem Munitionsmenü aus!", -- Basic_Training_-_Grenade
+["To begin with the training, tap the attack button!"] = "Um mit dem Training anzufangen, tippe die Angriffstaste an!", -- Basic_Training_-_Movement
 ["To finish hedgehog selection, just do anything|with him, like walking."] = "Um die Igelwahl zu beenden, mach irgendwas mit dem Igel, z.B. gehen.", -- Basic_Training_-_Movement
 ["To get over the next obstacles, keep some distance from the wall before you back jump."] = "Um über die nächsten Hindernisse zu kommen, halte etwas Abstand von der Wand,|bevor du rückwärts springst.", -- Basic_Training_-_Movement
 ["To get over the water, you have to do multiple|rope shots and swings."] = "Um über das Wasser zu gelangen, brauchst du mehrere Seilschüsse|und musst mehrfach schwingen.", -- Basic_Training_-_Rope
 ["Toggle Editing Weapons and Tools: [Precise]+[2]"] = "Editorwaffen- und Werkzeuge umschalten: [Genaues Zielen]+[2]", -- HedgeEditor
 ["Toggle Editing Weapons and Tools: Precise+2"]="Waffen- und Werkzeugbearbeitung umschalten: Genaues Zielen + 2",
-["Toggle Gear Information: [Precise]+[3]"] = "Gear-Infos umschalten: [Genaues Zielen]+[3]", -- HedgeEditor
 ["Toggle Help: Precise+1"]="Hilfe umschalten: Genaues Zielen + 1",
 ["Toggle Help: [Precise]+[1]"] = "Hilfe umschalten: [Genaues Zielen]+[1]", -- HedgeEditor
 ["Toggle Help: Precise+1 (While a tool is selected)"]="Hilfe umschalten: Genaues Zielen + 1 (Während ein Werkzeug ausgewählt ist)",
@@ -2419,14 +2397,14 @@
 ["Too bad! Then you should really leave!"] = "Schade. Dann solltest du wirklich gehen!", -- A_Space_Adventure:fruit01
 ["Too slow! Try again ..."]="Zu langsam! Versuch es nochmal.",
 ["Top-class elite pilot"]="Elitepilot der Spitzenklasse",
-["To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"]="Um einen Träger zu platzieren, wähle ihn, benutze [Links] und [Rechts], um den Winkel und die Länge zu wählen, platziere ihn mit [Linksklick].",
 ["To reach higher ground, walk to a ledge, look to the left, then do a back jump."] = "Um auf höheres Gelände zu kommen, geh zur Kante,|blicke nach links und mach einen Rückwärtssprung.", -- Basic_Training_-_Movement
 ["Torn Muscle"]="Loser Muskel",
 ["To the caves..."]="Zu den Höhlen …",
 ["Touch all waypoints as fast as you can!"] = "Berühre alle Wegpunkte so schnell du kannst!", -- Racer
-["To win the game, Hog Solo has to get the bottom crates and come back to the surface."]="Um das Spiel zu gewinnen, muss Igel Einsam zu den unteren Kisten gelangen und wieder zurück zur Oberfläche kommen.",
+["- Touch the sparkles near your base to teleport"] = "- Berühre die Funken in der Nähe deiner Basis zum Teleportieren", -- CTF_Blizzard
+["To win the game, %s has to get the bottom crates and come back to the surface."] = "Um das Spiel zu gewinnen, muss %s die unteren Kisten erreichen und zurück an die Oberfläche gelangen.", -- A_Space_Adventure:fruit02
 ["To win the game you had to collect the 2 crates with no specific order."]="Um das Spiel zu gewinnen, musstest du die 2 Kisten in beliebiger Reihenfolge einsammeln.",
-["To win the game you have to eliminate all your enemies."]="Um das Spiel zu gewinnen, musst du all deine Gegner eliminieren",
+["To win the game you have to eliminate Professor Hogevil."] = "Um das Spiel zu gewinnen, musst du Professor Bösigel eliminieren.", -- A_Space_Adventure:death01
 ["To win the game you have to find the right crate."]="Um das Spiel zu gewinnen, musst du die richtige Kiste finden.",
 ["To win the game you have to go next to Thanta."]="Um das Spiel zu gewinnen, musst du neben Thanta stehen.",
 ["To win the game you have to go to the surface."]="Um das Spiel zu gewinnen, musst du an die Oberfläche gelangen.",
@@ -2435,13 +2413,10 @@
 ["To win the game you have to stand next to Thanta."] = "Um das Spiel zu gewinnen, musst du neben Thanta stehen.", -- A_Space_Adventure:ice01
 ["Toxic Team"]="Giftige Gegner",
 ["Track completed!"] = "Strecke durchlaufen!", -- Racer, TechRacer
-["Trainee"] = "Azubi", -- 
 ["Training complete!"] = "Übung abgeschlossen!", -- Basic_Training_-_Flying_Saucer
-["Training Team"] = "Trainingsteam", -- 
 ["Training"] = "Übung", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 ["Traitors don't get to shout around here!"] = "Verräter haben hier nicht das Recht, herumzubrüllen!", -- A_Classic_Fairytale:epil
 ["Traitors"]="Verräter",
-["Trapped"] = "Gefangen", -- Basic_Training_-_Movement
 ["Trapper"]="Trapper",
 ["Travel carefully as your fuel is limited"]="Reise vorsichtig, da dein Treibstoff begrenzt ist.",
 ["Travel to all the neighbor planets and collect all the pieces"]="Reise zu allen Nachbarplaneten und sammle alle Bauteile ein.",
@@ -2458,7 +2433,6 @@
 ["Try to land softly, as you can still take fall damage!"] = "Lande vorsichtig, da du immer noch Fallschaden nehmen könntest!", -- Basic_Training_-_Flying_Saucer
 ["Try to protect the chief! You won't lose if he dies, but it is advised that he survives."]="Versuche, den Häuptling zu beschützen! Du wirst nicht verlieren, wenn er stirbt, aber es ist ratsam, dass er überlebt.",
 ["Try to reach and destroy the next target quickly."] = "Versuch, das nächste Ziel möglichst schnell|zu erreichen und zu zerstören.", -- Basic_Training_-_Rope
-["T_T"]="T_T",
 ["Tumbler"] = "Purzler", -- Tumbler
 ["Turn around: [Left Shift] + [Left]/[Right]"] = "Umdrehen: [Umschalt links] + [Links]/[Rechts]", -- Basic_Training_-_Movement
 ["Turning Around"] = "Umdrehen", -- Basic_Training_-_Movement
@@ -2477,7 +2451,6 @@
 ["Uhmm...ok no."]="Ähm, okay, nein.",
 ["Ukemi"] = "Ukemi", -- 
 ["Ultra kill!"] = "Ultra-Killer!", -- Mutant
-["Ultrasoldier"] = "Ultrasoldat", -- Big_Armory
 ["unC0Rr"] = "unC0Rr", -- 
 ["Under Construction"]="Baustelle",
 ["Under normal circumstances we could easily defeat them but we have kindly sent most of our men to the Kingdom of Sand to help with the annual dusting of the king's palace."]="Unter normalen Bedingungen könnten wir sie leicht besiegen, aber wir hatten freundlicherweise die meisten unserer Männer zum Sandkönigreich geschickt, um bei der jährlichen Entstaubung des Königspalasts zu helfen.",
@@ -2499,7 +2472,6 @@
 ["United We Stand"]="Gemeinsam sind wir stark",
 ["Unlike bazookas, grenades are not influenced by wind."] = "Anders als Bazookas werden Granaten nicht vom Wind beeinflusst.", -- Basic_Training_-_Grenade
 ["Unlimited Attacks: Attacks don't end your turn"] = "Unbegrenzte Angriffe: Angriffe beenden deinen Zug nicht", -- User_Mission_-_Diver, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree
-["Unlimited Attacks"]="Unbegrenzte Angriffe",
 ["Unlucky Sods"]="Arme Schweine",
 ["Unstoppable!"]="Unaufhaltsam!",
 ["Unsuspecting Louts"]="Nichtsahnende Lümmel",
@@ -2514,6 +2486,7 @@
 ["Use it with precaution!"]="Benutze sie weise.",
 ["User Challenge"]="Benutzerherausforderung",
 ["!"] = "!", -- User_Mission_-_Dangerous_Ducklings
+["User Mission"] = "Benutzermission", -- HedgeEditor
 ["Use space button twice to change flying saucer while being in air."]="Drücke die Angriffstaste 2 mal, um die fliegende Untertasse im Flug zu wechseln",
 ["Use space button twice to change flying saucer while floating in mid-air."]="Drücke die Angriffstaste 2 mal, um die fliegende Untertasse im Flug zu wechseln.",
 ["Use the attack key twice to change the flying saucer while being in air."] = "Benutze die Angriffstaste 2 mal, um die fliegende Untertasse in der Luft zu wechseln.", -- A_Space_Adventure:ice02
@@ -2523,7 +2496,7 @@
 ["Use the bazooka and the flying saucer to get the icegun."]="Benutze die Bazooka und die fliegende Untertasse, um die Eiskanone zu ergattern",
 ["Use the flying saucer from the crate to fly to the moon."] = "Benutze die fliegende Untertasse aus der Kiste, um zum Mond zu fliegen.", -- A_Space_Adventure:cosmos
 ["Use the flying saucer to fly to the other planets."] = "Benutze die fliegende Untertasse, um zu den anderen Planeten zu fliegen.", -- A_Space_Adventure:cosmos
-["Use the parachute ([Space] while in air) to get the next crate"]="Benutze den Fallschirm ([Leer] drücken, wenn in der Luft), um die nächste Kiste zu erhalten.",
+["Use the parachute to get the next crate."] = "Benutze den Fallschirm, um zur nächsten Kiste zu gelangen.", -- A_Classic_Fairytale:first_blood
 ["Use the portal gun to get to the next crate, then use the new gun to get to the final destination!|"]="Benutze das Portalgewehr, um zur nächsten Kiste zu kommen,|dann benutze das nächste Werkzeug, um zum letzten Ziel zu kommen.|",
 ["Use the RC plane and destroy the all the targets"]="Benutze das Funkflugzeug und zerstöre alle Zielscheiben",
 ["Use the RC plane and destroy the all the targets."]="Benutze das Funkflugzeug und zerstöre alle Zielscheiben.",
@@ -2575,7 +2548,6 @@
 ["Victory Condition: Collect"] = "Siegbedingung: Einsammeln", -- HedgeEditor
 ["Victory Condition: Destroy"] = "Siegbedingung: Zerstören", -- HedgeEditor
 ["Victory for %s!"] = "Sieg für %s!", -- Capture_the_Flag
-["Victory for the "]="Sieg für ",
 ["Victory!"]="Sieg!",
 ["Violence is not the answer to your problems!"]="Gewalt ist nicht die Antwort auf deine Probleme!",
 ["Visit the Death Planet after completing all the other planets' main missions"]="Besuche den Todesplaneten, nachdem du die Hauptmissionen aller anderen Planeten fertiggestellt hast.",
@@ -2596,9 +2568,6 @@
 ["Walls left: %d"] = "Verbleibende Wände: %d", -- WxW
 ["Wall to wall"] = "Wand zu Wand", -- WxW
 ["Waluigi"]="Waluigi",
-["Wannabe Flyboys"]="Möchtegernflieger",
-["Wannabe Ropers"] = "Möchtegernseiler", -- Basic_Training_-_Rope
-["Wannabe Shoppsta"]="Möchtegernkäufer",
 ["Wario"] = "Wario", -- 
 ["Warming Up"] = "Aufwärmübungen", -- Basic_Training_-_Grenade
 ["Warning: Deletition Mode Active"]="Achtung: Löschmodus aktiv",
@@ -2629,7 +2598,6 @@
 ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "Waffen: Fast jede Igelvariante erhält 1 Kamikaze", -- Battalion
 ["Weapon specials: Some weapons have special modes (see weapon description)."] = "Waffenextras: Einige Waffen haben Sondermodi (siehe Waffenbeschreibung).", -- Continental_supplies
 ["Weapons reset: The weapons are reset after each turn."] = "Gleichbleibende Bewaffnung: Die Waffen werden nach jedem Zug zurückgesetzt.", -- WxW
-["Weapons Reset"]="Waffenzurücksetzung",
 ["We are indeed."]="Das sind wir in der Tat.",
 ["We can't defeat them!"]="Wir können sie nicht besiegen!",
 ["We can't hold them up much longer!"]="Wir können sie nicht länger aufhalten!",
@@ -2645,9 +2613,9 @@
 ["We have to hurry! Are you armed?"]="Wir müssen uns beeilen! Bist du bewaffnet?",
 ["We have to protect the village!"]="Wir müssen das Dorf schützen!",
 ["We have to unite and defeat those cylergs!"]="Wir müssen uns zusammentun, und diese Cylergs besiegen!",
-["Welcome Hog Solo, surprised to see me?"]="Hallo, Igel Einsam! Bist du überrascht, mich zu sehen?",
 ["Welcome home! Please take a seat"] = "Willkommen zu Hause! Bitte nimm Platz", -- ClimbHome
 ["Welcome, Leaks A Lot!"]="Willkommen, Undichte Stelle!",
+["Welcome, %s, surprised to see me?"] = "Willkommen, %s, überrascht, mich zu sehen?", -- A_Space_Adventure:death01
 ["Welcome to the Death Planet!"]="Willkommen auf dem Todesplaneten!",
 ["Welcome to the Desert Planet!"]="Willkommen auf dem Wüstenplaneten!",
 ["Welcome to the Fruit Planet!"]="Willkommen auf dem Obstplaneten!",
@@ -2808,19 +2776,19 @@
 ["You can’t open a portal on the blue surface."] = "Du kannst kein Portal auf der blauen Oberfläche öffnen.", -- portal
 ["You can use the other 2 hogs to assist you."]="Du kannst die anderen beiden Igel benutzen, um dich zu unterstützen.",
 ["You can use the rope to reach new places."] = "Du kannst das Seil benutzen, um neue Orte zu erreichen.", -- Basic_Training_-_Rope
-["You choose well, Hog Solo!"]="Gute Wahl, Igel Einsam!",
+["You choose well, %s!"] = "Eine gute Wahl, %s!", -- A_Space_Adventure:fruit01
 ["You completed the mission in %.3f seconds."] = "Du hast die Mission in %.3f Sekunden abgeschlossen.", -- A_Space_Adventure:ice02
 ["You completed the mission in %d rounds."] = "Du hast die Mission in %d Runden abgeschlossen.", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03
 ["You completed the mission in "]="Du hast die Mission fertiggestellt in ",
 ["You complete the mission in "]="Du hast die Mission abgeschlossen in ",
-["You couldn't have come to a worse time, Hog Solo!"]="Du könntest du einer kaum schlechteren Zeit ankommen, Igel Einsam!",
+["You couldn't have come to a worse time, %s!"] = "Du konntest zu keiner schlechteren Zeit gekommen sein, %s!", -- A_Space_Adventure:fruit01
 ["You couldn't possibly believe that after refusing my offer I'd just let you go!"]="Du kannst wohl nicht ernsthaft glauben, dass ich dich einfach laufen lasse, nachdem du mein Angebot abgelehnt hast!",
 ["You'd almost swear the water was rising!"]="Man könnte fast schwören, das Wasser würde steigen!",
 ["You'd better watch your steps..."]="Pass besser auf, wohin du trittst.",
 ["You defended yourself against Captain Lime."]="Du hast dich gegen Leutnant Limone gewehrt.",
-["You defended yourself against the Fruit Assassins."] = "Du hast dich gegen die Obstassassinen gewehrt.", -- A_Space_Adventure:fruit02
+["You defended yourself against %s."] = "Du hast dich gegen %s gewehrt.", -- A_Space_Adventure:fruit02
 ["You defended yourself against the Strawberry Assassins."]="Du hast dich gegen die Erdbeerassassinen gewehrt.",
-["You did great, Hog Solo! However, we aren't out of danger yet!"]="Du hast dich wacker geschlagen, Igel Einsam! Aber wir haben die Gefahren noch nicht überstanden.",
+["You did great, %s! However, we aren't out of danger yet!"] = "Du hast dich gut geschlagen, %s! Aber die Gefahr ist noch nicht gebannt!", -- A_Space_Adventure:cosmos
 ["You don't deserve my sacrifice!"] = "Ihr verdient mein Opfer nicht!", -- A_Classic_Fairytale:queen
 ["You drove Professor Hogevil away."] = "Du hast Professor Bösigel verjagt.", -- A_Space_Adventure:moon01
 ["You drove the minions away."] = "Du hast die Lakaien verjagt.", -- A_Space_Adventure:moon01
@@ -2833,12 +2801,12 @@
 ["You got me!"] = "Du hast mich!", -- A_Space_Adventure:moon02
 ["You had %.1fs remaining on the clock (+%d points)."] = "Verbleibende Zeit: %.1fs (+%d Punkte)", -- 
 ["You had %.2fs remaining on the clock (+%d points)."]="Verbleibende Zeit: %.2fs (+%d Punkte).",
-["You had %d additional flying saucers left."] = "Du hattest %d zusätzliche fliegende Untertassen übrig.", -- A_Space_Adventure:ice02
 ["You had "]="Du hattest ",
 ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: You might want to use some mines ..."] = "Du hast 7 Züge, bevor die nächste Welle ankommt.|Stell sicher, die ankommenden Kannibalen angemessen zu begrüßen!|Wenn der Igel stirbt, ist alles verloren.|Tipp: Du solltest ein paar Minen legen.", -- A_Classic_Fairytale:backstab
 ["You have acquired the last device part."]="Du hast das letzte Bauteil erhalten.",
 ["You have activated Switch Hedgehog!"] = "Du hast »Igel wechseln« aktiviert!", -- Basic_Training_-_Movement
 ["You have beaten the challenge!"]="Du hast die Herausforderung gemeistert!",
+["You have beaten the team record, congratulations!"] = "Du hast den Teamrekord geschlagen, Gratulation!", -- Utils
 ["You have been giving us out to the enemy, haven't you!"]="Du hast uns an den Feind verkauft, nicht wahr?",
 ["You have chosen the perfect moment to leave."]="Du hast den perfekten Augenblick ausgesucht, um zu gehen.",
 ["You have chosen to fight!"] = "Du hast dich für die Schlacht entschieden!", -- A_Space_Adventure:fruit01
@@ -2858,7 +2826,6 @@
 ["You have eliminated all visible enemy hedgehogs!"]="Du hast alle sichtbaren feindlichen Igel besiegt!",
 ["You have eliminated Professor Hogevil."] = "Du hast Professor Bösigel eliminiert.", -- A_Space_Adventure:moon01
 ["You have eliminated the evil minions."] = "Du hast die bösen Lakaien eliminiert.", -- A_Space_Adventure:moon01
-["You have eliminated the whole evil team. You're pretty tough!"] = "Du hast das ganze böse Team ausgelöscht. Du bist ein ganz schön harter Brocken!", -- A_Space_Adventure:moon01
 ["You have escaped successfully."]="Du bist erfolgreich geflohen.",
 ["You have failed to complete your task, young one!"]="Du hast versagt, Jüngling!",
 ["You have failed to save the tribe!"]="Du hast es nicht geschafft, den Stamm zu retten!",
@@ -2910,6 +2877,7 @@
 ["You have to travel again"]="Du musst erneut reisen.",
 ["You have to try again!"]="Du muss es nochmal versuchen!",
 ["You have triggered the secret Do-Not-Rope-to-the-Moon Defense System."] = "Du hast das geheime Seil-dich-nicht-zum-Mond-hinauf-Verteidigungssystem ausgelöst.", -- A_Space_Adventure:cosmos
+["You have unlocked the target radar!"] = "Du hast das Zielscheibenradar freigeschaltet!", -- TargetPractice
 ["You have used %d flying saucers."] = "Du hast %d fliegende Untertassen benutzt.", -- A_Space_Adventure:ice02
 ["You have used %d RC planes."]="Du hast %d Funkflugzeuge benutzt.",
 ["You have used "]="Du hast benutzt ",
@@ -2934,11 +2902,10 @@
 ["You'll have only one RC plane at the start of the mission"]="Am Anfang der Mission hast du nur ein Funkflugzeug",
 ["You'll have only one RC plane at the start of the mission."]="Am Anfang der Mission hast du nur ein Funkflugzeug.",
 ["You'll have to eliminate Captain Lime at the end."]="Am Ende musst du Leutnant Limone eliminieren.", -- A_Space_Adventure:fruit02
-["You'll have to eliminate the Fruit Assassins at the end."] = "Am Ende musst du die Obstassassinen eliminieren.", -- A_Space_Adventure:fruit02
+["You'll have to eliminate %s at the end."] = "Am Ende musst du %s eliminieren.", -- A_Space_Adventure:fruit02
 ["You'll have to eliminate the Strawberry Assassins at the end."]="Am Ende musst du die Erdbeerassassinen eliminieren.", -- A_Space_Adventure:fruit02
 ["You'll lose if you die or if your time is up."]="Du verlierst, wenn du stirbst oder deine Zeit abläuft.", -- A_Space_Adventure:moon02
 ["You'll see what I mean!"]="Du wirst verstehen, was ich meine.",
-["You lose!"]="Du hast verloren!",
 ["You lost your target, try again!"]="Du hast deine Zielscheibe verloren, versuch es nochmal!",
 ["You may find it handy."]="Du könntest es gebrauchen.", -- A_Space_Adventure:cosmos
 ["You may only attack from a rope!"]="Du darfst nur von einem Seil angreifen!",
@@ -2960,8 +2927,7 @@
 ["Your accuracy was %.1f%%."]="Deine Treffgenauigkeit betrug %.1f%%.",
 ["Your accuracy was %.1f%% (+%d points)."] = "Deine Treffgenauigkeit betrug %.1f%% (+%d Punkte).", -- 
 ["Your ammo is limited this time."] = "Diesmal ist deine Munition begrenzt.", -- Basic_Training_-_Bazooka
-["Your deaths will be avenged, Cannibals!"] = "Eure Tode werden gerächt, Kannibalen!", -- A_Classic_Fairytale:enemy
-["Your deaths will be avenged, Natives!"] = "Eure Tode werden gerächt, Eingeborene!", -- A_Classic_Fairytale:enemy
+["Your deaths will be avenged, %s!"] = "Eure Tode werden nicht ungesühnt bleiben, %s!", -- A_Classic_Fairytale:enemy
 ["Your death will not be in vain, Dense Cloud!"]="Dein Tod wird nicht ungesühnt bleiben, Dichte Wolke!",
 ["You're a coward!"] = "Du bist ein Feigling!", -- A_Classic_Fairytale:queen
 ["You're...alive!? But we saw you die!"]="Du … lebst? Aber wir sahen dich sterben!",
@@ -2987,26 +2953,27 @@
 ["Your next task is to collect some crates by using the rope!"] = "Für deine nächste Aufgabe musst du ein paar Kisten mit dem Seil aufsammeln.", -- A_Classic_Fairytale:first_blood
 ["Your personal best time so far: %.3f seconds"] = "Deine persönliche Bestzeit bisher: %.3f Sekunden", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 ["Your rank: %s"]="Dein Rang: %s",
-["You saved %d of 8 Hapless Hogs."]="Du hast %d von 8 Glücklosen Igeln gerettet.",
+["Your rope is gone! Try again!"] = "Dein Seil ist futsch! Versuch es erneut!", -- Basic_Training_-_Rope
+["You saved %d of 8 hegehogs."] = "Du hast %d von 8 Igeln gerettet.", -- User_Mission_-_That_Sinking_Feeling
 ["You see, hedgehog spikes are very, very valuable."] = "Ihr müsst verstehen, Igelstacheln sind sehr, sehr wertvoll.", -- A_Classic_Fairytale:queen
 ["You see the wind strength at the bottom right corner."] = "Du siehst die Windstärke in der unteren rechten Ecke.", -- Basic_Training_-_Bazooka
+["You see the wind strength at the top."] = "Du siehst die Windstärke oben.", -- Basic_Training_-_Bazooka
 ["You should have known that we don't rely on meatbags!"] = "Ihr solltet gewusst haben, dass wir uns nicht auf Fleischbeutel verlassen!", -- A_Classic_Fairytale:queen
 ["You should know this more than anyone, Leaks!"] = "Du solltest es von allen am Ehesten wissen, Undichte!", -- A_Classic_Fairytale:queen
 ["You speak great truth, Hannibal. Here, take a sip!"] = "Du sprichst weise Worte, Hannibal. Hier, nimm einen Schluck!", -- A_Classic_Fairytale:epil
 ["You've been assaulting us, we have been just defending ourselves!"]="Ihr habt uns überfallen, wir haben uns nur verteidigt!",
-["You've failed. Try again."]="Du bist gescheitert. Versuche es nochmal.",
 ["You will be avenged!"]="Du wirst gerächt!",
 ["You will fail if you run out of ammo and there are still targets available."]="Du wirst verlieren, wenn du keine Munition mehr hast und immer noch Zielscheiben übrigbleiben.", -- A_Space_Adventure:desert03
 ["You will gain some extra ammo from the crates the next time you play the \"Getting to the device\" mission."]="Du wirst etwas zusätzliche Munition aus den Kisten erhalten, wenn du das nächste Mal die Mission »Zum Greifen nah« spielst.", -- A_Space_Adventure:fruit03
 ["You will play every 3 turns"]="Du wirst alle 3 Züge spielen.",
 ["You will play every 3 turns."] = "Du wirst alle 3 Züge spielen.", -- A_Space_Adventure:fruit01
-["You win!"] = "Du hast gewonnen!", -- Big_Armory
 ["You won't believe what happened to me!"]="Ihr werdet nicht glauben, was mir passiert ist!",
 ["Yuck! I bet they'll keep worshipping her even after I save the village!"]="Pfui! Ich wette, sie werden sie verehren, selbst, wenn ich das Dorf rette.",
 ["Yumme Gunpowder"] = "S. Schießpulver", -- 
 ["Zealandia"]="Neuseeland-Kontinent",
 ["Zombie"] = "Zombie", -- 
 ["Zombi"] = "Zombi", -- portal
-["Zook"]="Zook",
+["Zoom: [Pinch] with 2 fingers"] = "Zoomen: Mit 2 Fingern [kneifen]", -- Basic_Training_-_Movement
+["Zoom: [Rotate mouse wheel]"] = "Zoomen: [Mausrad drehen]", -- Basic_Training_-_Movement
 ["Zork"]="Zork",
 }
--- a/share/hedgewars/Data/Locale/de.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/de.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -110,6 +110,7 @@
 01:45=%1: %2
 01:46=[Klan] %1: %2
 01:47=[%1]: %2
+01:48=?
 
 ; Event messages
 ; Hog (%1) died
@@ -345,11 +346,11 @@
 02:02=Habt keine Angst!
 02:02=Seid mutig und siegreich!
 
-02:02=Gleich geht's rund …
-02:02=Hier geht's gleich zur Sache
+02:02=Gleich geht’s rund …
+02:02=Hier geht’s gleich zur Sache
 02:02=Lasst die Spiele beginnen!
-02:02=Jetzt geht's los!
-02:02=Auf geht's!
+02:02=Jetzt geht’s los!
+02:02=Auf geht’s!
 
 ; Round ends and team (%1) wins
 02:03=%1 gewinnt!
@@ -413,7 +414,7 @@
 02:05=Frisches Pflaster!
 02:05=Frische Bandagen!
 02:05=Damit wirst du dich besser fühlen
-02:05=Ein Hallo-Trank! Upps, falsches Spiel
+02:05=Ein Heiltrank! Upps, falsches Spiel
 02:05=Zugreifen!
 02:05=Ein gesunder Snack
 02:05=Ein Mittel, um Schmerzen zu lindern
@@ -442,12 +443,12 @@
 02:05=Heilt die Kranken!
 02:05=Das ist gut für dich
 02:05=Irgendjemand scheint euch zu mögen
-02:05=Schnapp's dir, bevor es der Feind tut!
+02:05=Schnapp’s dir, bevor es der Feind tut!
 02:05=Hilfe für kranke Igel
 02:05=Braucht da unten jemand Hilfe?
 02:05=Alles, was ein verwundeter Igel braucht
 02:05=Schwer verletzt? Das kriegen wir hin
-02:05=Hol dir Erste Hilfe, bevor's zu spät ist
+02:05=Hol dir Erste Hilfe, bevor’s zu spät ist
 02:05=Brotrationen!
 02:05=Stell deine Gesundheit wieder her
 02:05=Das wird euch helfen
@@ -467,7 +468,7 @@
 02:05=Leb etwas länger
 02:05=Diese Kiste wird dir helfen
 02:05=Braucht jemand Hilfe?
-02:05=Hol sie dir, bevor's zu spät ist!
+02:05=Hol sie dir, bevor’s zu spät ist!
 02:05=Niedrige Gesundheit? Wir haben die Lösung!
 02:05=Von fast tot bis kerngesund in nur einem Augenblick!
 02:05=Die effizienteste Art der Heilung
@@ -540,10 +541,9 @@
 02:06=Lasst nicht zu, dass der Feind sie sich holt!
 02:06=Schönes neues Spielzeug!
 02:06=Eine geheimnisvolle Kiste!
-02:06=Ein eckiges Ü-Ei!
+02:06=Eine eckige Überraschung!
 02:06=Die Holzkiste der Pandora!
 02:06=Willst du mit mir spielen?
-02:06=Quadratisch, praktisch, … gefährlich?
 02:06=Diese Kiste bringt Bombenstimmung!
 02:06=Damit kann man dem Feind so richtig einheizen
 02:06=Jetzt geht die Party erst richtig los!
@@ -584,7 +584,7 @@
 02:06=Keine Munition? Kein Problem?
 02:06=Zeit zum Nachladen!
 02:06=Die hier macht »Bumm!«
-02:06=Manche mögen's heiß
+02:06=Manche mögen’s heiß
 02:06=Ein paar unartige Igel brauchen Bestrafung
 02:06=Zerschmettert den Feind!
 02:06=Spaß! Explosionen! Zerstörung!
@@ -598,11 +598,11 @@
 02:06=Heroische Bewaffnung für heroische Igel
 02:06=Überraschungswaffe!
 02:06=Es regnet Kisten!
-02:06=Die ultimative Waffe? Oder nur so 'ne Langweilige?
+02:06=Die ultimative Waffe? Oder nur so ’ne Langweilige?
 02:06=Hol sie dir zuerst
 02:06=Das macht Igel zu Toast
 02:06=So eine wunderschöne … Waffe
-02:06=Was ist da drin? Finden wir's heraus!
+02:06=Was ist da drin? Finden wir’s heraus!
 02:06=Auspacken!
 02:06=Diese Kiste bringt Zerstörung
 02:06=Sie nennen mich »Terminator«
@@ -620,7 +620,7 @@
 02:06=Die Chaoskiste
 02:06=Wer zuerst kommt, mahlt zuerst!
 02:06=Hat jemand »Waffen« gesagt?
-02:06=Jetzt wird's ernst
+02:06=Jetzt wird’s ernst
 02:06=Die Schonfrist ist vorbei
 02:06=Lasst das Wettrüsten beginnen!
 02:06=Nimm dich in acht, wenn der Feind sich sie holt
@@ -631,7 +631,7 @@
 02:06=Ich hab gehört, ihr wollt Waffen …
 02:06=Zerstörerische Lieferung!
 02:06=Es ist Zeit, ihnen eine Lektion zu erteilen!
-02:06=Die Chance, um deinen geheimen Plan in die Tat umzusetzen
+02:06=Die Chance, um deinen geheimen Plan umzusetzen
 02:06=Das ist die Chance!
 02:06=Aufsammeln oder in die Luft jagen?
 02:06=Ist das die ultimative Waffe?
@@ -677,7 +677,6 @@
 02:07=Heimwerker atmen auf!
 02:07=Schaffe, schaffe, Häusle baue
 02:07=Werkzeuge kann man immer gebrauchen
-02:07=Auf diese Kisten können Sie bauen
 02:07=Ein Geschenk der Techniker!
 02:07=Strategen freuen sich!
 02:07=Dies könnte deine Mobilität wiederherstellen …
@@ -699,7 +698,7 @@
 02:07=Hat jemand einen Werkzeugkasten bestellt?
 02:07=Nützliche Lieferung!
 02:07=Braucht jemand ein Werkzeug?
-02:07=Ich kann's kaum erwarten, diese Kiste zu öffnen!
+02:07=Ich kann’s kaum erwarten, diese Kiste zu öffnen!
 02:07=Ein schwerer Werkzeugkasten fällt vom Himmel!
 02:07=Ein kleines Helferlein für kleine Igelchen
 02:07=Erweitere deine Möglichkeiten
@@ -974,8 +973,8 @@
 02:12=%1 wurde übel vergiftet
 02:12=%1 fühlt sich schwindelig
 02:12=%1 fiel der chemischen Kriegsführung zum Opfer
-02:12=Die Haut von %1 Haut nimmt eine sehr ungesunde Färbung an
-02:12=%1 sollte die Vitamine geschluckt haben
+02:12=%1 nimmt eine sehr ungesunde Färbung an
+02:12=%1 hätte die Vitamine einnehmen sollen
 02:12=%1 hat Bauchschmerzen
 02:12=%1 sieht nicht gerade gesund aus
 02:12=%1 braucht ein Lazarett
@@ -1348,7 +1347,7 @@
 04:40=Entzünde einen Teil der Landschaft mit dieser|(schon bald) brennenden Flüssigkeit.|Angriff: Halten, um mit mehr Kraft zu werfen
 04:41=Der Beweis, dass die Natur sogar die fliegende|Untertasse übertreffen könnte. Vogli kann|deinen Igel herumtragen und zudem faule Eier|auf deine Feinde fallen lassen, um sie zu vergiften.|Angriff: Aktivieren und Eier fallen lassen|Hoch/Links/Rechts: In eine Richtung flattern
 04:42=Das tragbare Portalgerät ermöglicht es dir,|dich, deine Feinde oder Waffen direkt zwischen|zwei Punkten auf der Karte zu teleportieren.|Benutze es weise und deine Kampagne wird ein …|RIESENERFOLG!|Haftungsausschluss\: Funktioniert nicht auf Gummi.|Angriff: Öffnet ein Portal|Wechseln: Wechselt die Portalfarbe
-04:43=Lass dein musikalisches Debüt einschlagen wie eine Bombe!|Lass ein mächtiges Piano vom Himmel fallen, das alles|im Weg zerstampfen wird, aber beachte:|Dein Igel muss sein Leben geben, um das Piano zu spielen.|Cursor: Zielgebiet wählen und Angriff starten|F1–F9: Das Piano spielen
+04:43=Lass dein musikalisches Debüt einschlagen wie eine Bombe!|Lass ein mächtiges Piano vom Himmel fallen, das alles|im Weg zerstampfen wird, aber beachte\:|Dein Igel muss sein Leben geben, um das Piano zu spielen.|Cursor: Zielgebiet wählen und Angriff starten|F1–F9: Das Piano spielen
 04:44=Das ist nicht nur Käse, das ist biologische Kriegsführung!|Er wird nicht viel Schaden verursachen, sobald der Zünder|abgelaufen ist, aber er wird garantiert jeden in der Nähe|vergiften!|1–5: Zeitzünder einstellen|Genaues Zielen + 1-5: Sprungkraft einstellen|Angriff: Halten, um mit mehr Kraft zu werfen
 04:45=All die Physikstunden haben sich endlich bezahlt gemacht!|Entfessle eine zerstörerische Sinuswelle, die sich durch|das Gelände (und deine Feinde) brennen wird.|Pass auf, die Waffe erzeugt einen ordentlichen Rückstoß.|Angriff: Feuern
 04:46=Brutzle deine Feinde mit fließenden Flammen.|Herzerwärmend!|Angriff: Aktivieren|Hoch/Runter: Beim Feuern zielen|Links/Rechts: Durchfluss ändern
@@ -1420,3 +1419,5 @@
 06:24=/shrug: Igel mit den Achseln zucken lassen
 06:25=/wave: Igel winken lassen
 06:26=Unbekannter Befehl oder ungültige Parameter. Sag »/help« im Chat für eine Liste an Befehlen.
+06:27=/help room: Raum-Chatbefehle auflisten
+06:28=Du bist nicht online!
--- a/share/hedgewars/Data/Locale/en.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/en.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -1,5 +1,6 @@
 ; English locale
 
+; Weapon names
 00:00=Grenade
 00:01=Cluster Bomb
 00:02=Bazooka
@@ -13,6 +14,7 @@
 00:10=Dynamite
 00:11=Baseball Bat
 00:12=Shoryuken
+; Short for “second” (unit of time)
 00:13=sec
 00:14=Parachute
 00:15=Air Attack
@@ -62,6 +64,7 @@
 00:59=Creeper
 00:60=Minigun
 
+; Game messages and HUD texts
 01:00=Loading …
 01:01=Round draw
 01:02=%1 wins!
@@ -72,11 +75,12 @@
 01:07=%1 remaining
 01:08=Fuel: %1%
 01:09=Synchronizing ...
-01:10=Using this utility won't end your turn!
+01:10=This won't end your turn!
 01:11=This weapon or utility is not yet available!
 01:12=Last round till Sudden Death!
 01:13=%1 rounds till Sudden Death!
 01:14=Get ready, %1!
+; Bounciness adjectives
 01:15=Slight
 01:16=Low
 01:17=Normal
@@ -115,6 +119,8 @@
 01:46=[Clan] %1: %2
 ; Hedgehog chat. %1 = hog name, %2 = message
 01:47=[%1]: %2
+; Symbol for unknown mine timer
+01:48=?
 
 ; Event messages
 ; Normal hog (%1) died (0 health)
@@ -388,7 +394,7 @@
 02:05=The doctor calls
 02:05=Fresh band-aids!
 02:05=This will make you feel better
-02:05=A Hi-Potion! Whoops, wrong game
+02:05=A potion of healing! Whoops, wrong game
 02:05=A pick-me-up!
 02:05=Grab it
 02:05=A healthy snack
@@ -1145,7 +1151,7 @@
 02:17=%1 has been checkmated
 02:17=%1 is dead, long live %1!
 
-; Weapon Categories
+; Weapon categories/subcaptions
 03:00=Timed grenade
 03:01=Timed grenade
 03:02=Ballistic weapon
@@ -1209,7 +1215,7 @@
 03:59=Incomplete weapon
 03:60=The ultimate firearm
 
-; Weapon Descriptions (use | as line breaks)
+; Weapon descriptions (use | as line breaks)
 04:00=Attack your enemies using a simple grenade.|It will explode once its timer reaches zero.|1-5: Set grenade's timer|Precise + 1-5: Set bounce strength|Attack: Hold to throw with more power
 04:01=Attack your enemies using a cluster bomb.|It will split into smaller bombs once its timer|reaches zero.|1-5: Set cluster bomb's timer|Precise + 1-5: Set bounce strength|Attack: Hold to throw with more power
 04:02=Attack your enemies using a ballistic projectile|that might be influenced by wind.|Attack: Hold to shoot with more power
@@ -1253,7 +1259,7 @@
 04:40=Set some ground on fire using this bottle|filled with (soon to be) burning liquid.|Attack: Hold to shoot with more power
 04:41=The evidence nature might even top the flying|saucer. Birdy can carry your hog around and|drop eggs on your enemies to poison them!|Be quick, as using Birdy eats into your turn|time!|Attack: Activate and drop eggs|Up/Left/Right: Flap in one direction
 04:42=This portable portal device is capable|of instantly transporting you, your enemies,|or your weaponry between two points on the|terrain.|Use it wisely and your campaign will be a ...|HUGE SUCCESS!|Disclaimer\: Does not work on rubber bands.|Attack: Shoot a portal|Switch: Change portal colour
-04:43=Make your musical debut an explosive success!|Drop a mighty piano from the heavens,|stomping everything in its path, but beware:|Your hog must be sacrificed to play the piano.|Cursor: Select target region|F1-F9: Play the piano
+04:43=Make your musical debut an explosive success!|Drop a mighty piano from the heavens,|stomping everything in its path, but beware\:|Your hog must be sacrificed to play the piano.|Cursor: Select target region|F1-F9: Play the piano
 04:44=This isn't just cheese, it's biological warfare!|It won't cause an huge amount of damage once|the timer reaches zero but it will definitely|poison anyone unlucky to touch the smell!|1-5: Set timer|Precise + 1-5: Set bounce strength|Attack: Hold to throw with more power
 04:45=All those physics classes have finally paid off!|Launch a devastating sine wave which burns itself|through terrain.|Watch out, this weapon has a strong knockback.|Attack: Shoot
 04:46=Cover your foes with sizzling liquid flame.|Heartwarming!|Attack: Activate|Up/Down: Continue aiming|Left/Right: Modify spitting power
@@ -1325,3 +1331,5 @@
 06:24=/shrug: Make hedgehog shrug
 06:25=/wave: Make hedgehog wave its hand
 06:26=Unknown command or invalid parameters. Say “/help” in chat for a list of commands.
+06:27=/help room: List room chat commands
+06:28=You're not online!
--- a/share/hedgewars/Data/Locale/es.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/es.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -26,7 +26,6 @@
 --      ["Above-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Accuracy Bonus! +15 points"] = "", -- Space_Invasion
 --      ["Accuracy bonus: +%d points"] = "", -- Basic_Training_-_Sniper_Rifle
---      ["Ace"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge
 --      ["Achievement gotten: %s"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_That_Sinking_Feeling, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, Basic_Training_-_Rope, Tumbler
 --      ["A Classic Fairytale"] = "", -- A_Classic_Fairytale:first_blood
 --      ["A crate critical to this mission has been destroyed."] = "", -- SimpleMission
@@ -46,7 +45,6 @@
 --      ["Again with the 'cannibals' thing!"] = "", -- A_Classic_Fairytale:enemy
 --      ["A Hedgewars minigame"] = "", -- Capture_the_Flag
 --      ["A Hedgewars mini-game"] = "", -- Racer, Space_Invasion, TechRacer, Tumbler
-	["a Hedgewars mini-game"] = "un minijuego de Hedgewars", -- Space_Invasion, The_Specialists
 --      ["A Hedgewars tag game"] = "", -- Mutant
 --      ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome
 --      ["Aim at the ceiling and hold [Attack] pressed until the rope attaches."] = "", -- Basic_Training_-_Rope
@@ -141,13 +139,14 @@
 --      ["As you've seen, the dropped grenade roughly fell into your flying direction."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Athlete"] = "", -- Battalion
 --      ["Attack: Activate"] = "", -- Racer
---      ["Attack Captain Lime before he attacks back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack Captain Lime before he attacks back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack From Rope: %s"] = "", -- WxW
 --      ["Attack From Rope: You may only attack from a rope."] = "", -- WxW
 --      ["Attack rule: %s"] = "", -- WxW
 --      ["Attack: Select this continent"] = "", -- Continental_supplies
 --      ["Attack: [Space]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
---      ["Attack the assassins before they attack back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack: Tap the [Bomb]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
+--      ["Attack the assassins before they attack back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack: Throw ball"] = "", -- Knockball
 --      ["At the end of the game your health was %d."] = "", -- A_Space_Adventure:ice01
 --      ["At the start of the game each enemy hog has only the weapon that he is named after."] = "", -- A_Space_Adventure:death02
@@ -155,16 +154,18 @@
 --      ["Available weapon specials:"] = "", -- Continental_supplies
 --      ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion
---      ["Avoid the mines!"] = "", -- Basic_Training_-_Rope
 --      ["Axes"] = "", -- Bazooka_Battlefield
 --      ["Aye! Fellow! Let me exit this chamber of doom!"] = "", -- A_Classic_Fairytale:epil
 --      ["Back Breaker"] = "", -- A_Classic_Fairytale:backstab
 --      ["Back in the village, after telling the villagers about the threat..."] = "", -- A_Classic_Fairytale:united
 --      ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil
 --      ["Back Jump: [Backspace] ×2"] = "", -- Basic_Training_-_Movement
+--      ["Back Jump: Double-tap the [Curvy Arrow]"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (1/2)"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (2/2)"] = "", -- Basic_Training_-_Movement
 --      ["Backstab"] = "", -- A_Classic_Fairytale:backstab
+--      ["Backwards jump: Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Backwards jump: Tap the [Curvy Arrow] twice"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Bacon"] = "", -- 
 --      ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Badmad"] = "", -- portal
@@ -197,7 +198,6 @@
 --      ["Bazooka Battlefield"] = "", -- Bazooka_Battlefield
 --      ["Bazooka Master"] = "", -- Basic_Training_-_Bazooka
 --      ["Bazookas are influenced by wind."] = "", -- Basic_Training_-_Bazooka
---      ["Bazooka Team"] = "", -- Basic_Training_-_Bazooka
 	["Bazooka Training"] = "Entrenamiento con bazuca",
 --      ["Bearded Beast"] = "", -- 
 --      ["Be careful, the future of Hogera is in your hands!"] = "", -- A_Space_Adventure:cosmos
@@ -231,7 +231,6 @@
 --      ["Bloodpie"] = "", -- A_Classic_Fairytale:backstab
 --      ["Bloodrocutor"] = "", -- A_Classic_Fairytale:shadow
 --      ["Bloodsucker"] = "", -- A_Classic_Fairytale:shadow
-	["Bloody Rookies"] = "Reclutas", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 --      ["Blue"] = "", -- 
 --      ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Bob"] = "", -- A_Space_Adventure:cosmos
@@ -314,7 +313,9 @@
 --      ["Challenge objectives"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit03, A_Space_Adventure:moon02
 --      ["Challenge over!"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa, ClimbHome
+--      ["Change bounciness: Tap [B]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Content: [Left], [Right]"] = "", -- HedgeEditor
+--      ["Change detonation timer: Tap the [Clock]"] = "", -- Basic_Training_-_Grenade, A_Classic_Fairytale:shadow
 --      ["Change direction: [Left]/[Right]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Change Health: [Left], [Right]"] = "", -- HedgeEditor
@@ -334,6 +335,8 @@
 --      ["Chicken"] = "", -- 
 --      ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01
 --      ["Chikorita"] = "", -- 
+--      ["Choose location: Left click"] = "", -- A_Classic_Fairytale:shadow
+--      ["Choose location: Tap the [Target] button, then tap on the spot you want to choose"] = "", -- A_Classic_Fairytale:shadow
 --      ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Choose your continent wisely, as your decision will be permanent."] = "", -- Continental_supplies
 --      ["Choose your side! If you want to join the strange man, walk up to him.|Otherwise, walk away from him. If you decide to att...nevermind..."] = "", -- A_Classic_Fairytale:shadow
@@ -342,7 +345,6 @@
 --      ["Cleaver"] = "", -- Construction_Mode
 --      ["Cleaver Placement Mode"] = "", -- Construction_Mode
 --      ["CLEAVER PLACEMENT MODE"] = "", -- HedgeEditor
---      ["Climber"] = "", -- ClimbHome
 --      ["Climb Home"] = "", -- ClimbHome
 --      ["Closing in"] = "", -- A_Classic_Fairytale:queen
 --      ["Clown"] = "", -- HedgeEditor
@@ -352,11 +354,13 @@
 --      ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb
 --      ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey
 --      ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey
+--      ["- Collect all the blue crates"] = "", -- HedgeEditor
 --      ["Collect all the crates, but remember, our time in this life is limited!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect or destroy all the health crates."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Collect or destroy the final crate to finish the training."] = "", -- Basic_Training_-_Flying_Saucer
+--      ["- Collect the blue crate"] = "", -- HedgeEditor
 --      ["Collect the crate and attack!"] = "", -- WxW
---      ["Collect the crate on the right.|Hint: Select the rope, [Up] or [Down] to aim, [Space] to fire, directional keys to move.|Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Collect the crate on the right."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the crates within the time limit!|If you fail, you'll have to try again."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the first crate to begin!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Collect the freezer and get the device part from Thanta."] = "", -- A_Space_Adventure:ice01
@@ -424,7 +428,6 @@
 --      ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates per turn: %d"] = "", -- WxW
---      ["crate(s)"] = "", -- SpeedShoppa
 --      ["Crazy Gravity: Gravity randomly changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity
 --      ["Crazy Runner"] = "", -- A_Space_Adventure:moon02
 --      ["Cricket Time"] = "", -- Continental_supplies
@@ -457,11 +460,10 @@
 --      ["Deals 15 damage to all enemies in the circle."] = "", -- Continental_supplies
 --      ["Deer"] = "", -- 
 --      ["Defeat all enemies!"] = "", -- portal
+--      ["Defeat!"] = "", -- HedgeEditor
 --      ["Defeat Professor Hogevil!"] = "", -- A_Space_Adventure:death01
---      ["Defeat the cannibals"] = "", -- A_Classic_Fairytale:backstab
---      ["Defeat the cannibals!|"] = "", -- A_Classic_Fairytale:united
+--      ["Defeat the cannibals!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cannibals!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Defeat the cannibals!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cyborgs!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen
 --      ["Delete Waypoint"] = "", -- HedgeEditor
@@ -482,11 +484,11 @@
 --      ["Destroyer of planes"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Destroy him, Leaks A Lot! He is responsible for the deaths of many of us!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion
+--      ["- Destroy the enemy"] = "", -- HedgeEditor
+--      ["- Destroy the red target"] = "", -- HedgeEditor
+--      ["- Destroy the red targets"] = "", -- HedgeEditor
 --      ["Destroy the targets!"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
---      ["Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
---      ["Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"] = "", -- A_Classic_Fairytale:first_blood
 --      ["+%d flamer fuel!"] = "", -- Tumbler
---      ["%d Hapless Hogs left"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["+%d health"] = "", -- Mutant
 --      ["%d-Hit Combo! +%d points!"] = "", -- Space_Invasion
 --      ["Did anyone follow you?"] = "", -- A_Classic_Fairytale:united
@@ -507,7 +509,6 @@
 --      ["Disguise as a Rockhopper Penguin"] = "", -- Continental_supplies
 --      ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies
 --      ["Displacer"] = "", -- 
---      ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Diver"] = "", -- User_Mission_-_Diver
 --      ["%d ms"] = "", -- HedgeEditor
 --      ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen
@@ -594,10 +595,8 @@
 --      ["Elderbot"] = "", -- A_Classic_Fairytale:family
 --      ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape
 	["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Destruye todos los objetivos antes de que se agote el tiempo.|La munición en esta misión es ilimitada.", --Bazooka, Shotgun, SniperRifle
---      ["Eliminate the Blue Team before the time runs out."] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Eliminate the enemy before the time runs out."] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 	["Eliminate the enemy hogs to win."] = "Acaba con los erizos enemigos para ganar",
-	["Eliminate the enemy specialists."] = "Acaba con los Especialistas",
 --      ["Eliminate the enemy."] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh
 --      ["Eliminate Unit 3378."] = "", -- User_Mission_-_Teamwork
 --      ["Eliminate WatchBot 4000."] = "", -- User_Mission_-_Teamwork_2
@@ -622,13 +621,14 @@
 --      ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab
 --      ["Except me, of course! I just saved a whole planet!"] = "", -- A_Space_Adventure:final
 --      ["Experienced beginner"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Explore the tunnel with the other hedgehogs and search for the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Explore the tunnel with the other hedgehogs and search for the device."] = "", -- A_Space_Adventure:fruit02
 --      ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02
 --      ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey
 --      ["Fair Wind"] = "", -- 
 --      ["Fall Damage"] = "", -- Basic_Training_-_Movement
 --      ["Fallen Angel"] = "", -- Tentacle_Terror
 --      ["Family Reunion"] = "", -- A_Classic_Fairytale:family
+--      ["Fastest escape: %d turns"] = "", -- A_Space_Adventure:desert02
 --      ["Fastest lap: %.3fs by %s"] = "", -- TrophyRace
 	["Fastest lap: "] = "Vuelta rápida: ",
 	["Feeble Resistance"] = "Resistencia Fútil",
@@ -648,11 +648,12 @@
 --      ["Final result"] = "", -- Mutant
 --      ["Final Targets"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
 --      ["Final team scores:"] = "", -- Space_Invasion
+--      ["Find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Find a way to detonate all the explosives and stay alive!"] = "", -- A_Space_Adventure:final
 --      ["Find your tribe!|Cross the lake!"] = "", -- A_Classic_Fairytale:dragon
 --      ["Finish this challenge as fast as possible to earn bonus points."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Finish waypoint placement"] = "", -- Racer
---      ["Finish your training|Hint: Animations can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Finish your training."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Finite Ropes"] = "", -- Basic_Training_-_Rope
 --      ["Fire a rocket with napalm."] = "", -- Continental_supplies
 --      ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler
@@ -680,6 +681,7 @@
 --      ["Flying Saucer Training"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Fly into space to fight off the invaders with barrels!"] = "", -- Space_Invasion
 --      ["Fly to the meteorite and detonate the explosives"] = "", -- A_Space_Adventure:cosmos
+--      ["Follow the path and destroy the next target."] = "", -- Basic_Training_-_Rope
 --      ["Forgetfulness: You will lose all your weapons each turn."] = "", -- Continental_supplies
 --      ["For the next crate, you have to do back jumps."] = "", -- Basic_Training_-_Movement
 --      ["Four Eyes"] = "", -- 
@@ -699,8 +701,6 @@
 --      ["“g=150”, where 150 is 150% of normal gravity."] = "", -- Gravity
 --      ["“g=50, g2=150, period=4000” for gravity changing|from 50 to 150 and back with period of 4000 ms."] = "", -- Gravity
 --      ["Galaxy Guardians"] = "", -- Big_Armory
-	["Game Modifiers: "] = "Modificadores: ",
-	["GAME OVER!"] = "¡FIN DEL JUEGO!",
 --      ["Game over!"] = "", -- Space_Invasion
 	["Game Started!"] = "¡El juego ha empezado!",
 --      ["Game? Was this a game to you?!"] = "", -- A_Classic_Fairytale:enemy
@@ -710,8 +710,6 @@
 --      ["Gasp! A smuggler!"] = "", -- A_Space_Adventure:desert01
 --      ["Gasp!"] = "", -- A_Space_Adventure:desert01
 --      ["Gathering fruits all day long."] = "", -- A_Classic_Fairytale:queen
---      ["Gear information hidden"] = "", -- HedgeEditor
---      ["Gear information shown"] = "", -- HedgeEditor
 --      ["Gear Placement Tool"] = "", -- HedgeEditor
 --      ["General information"] = "", -- Continental_supplies
 --      ["General information:"] = "", -- Continental_supplies
@@ -721,7 +719,7 @@
 --      ["Get Dense Cloud out of the pit!"] = "", -- A_Classic_Fairytale:journey
 --      ["Get him, Spike!"] = "", -- A_Space_Adventure:desert01
 	["Get on over there and take him out!"] = "¡Ves allí y elimínalo!",
---      ["Get on the head of the mole"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Get on the head of the mole."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Get past the flower."] = "", -- A_Classic_Fairytale:journey
 --      ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01
 --      ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood
@@ -759,7 +757,6 @@
 	["GO! GO! GO!"] = "¡VAMOS! ¡VAMOS! ¡VAMOS!",
 	["Good birdy......"] = "Buen pajarito......",
 --      ["Good bye!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Good Dude"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Good idea, they'll never find us there!"] = "", -- A_Classic_Fairytale:united
 --      ["Good job!"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Good job! Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -770,7 +767,7 @@
 	["Good so far!"] = "¡Vamos bien!",
 	["Good to go!"] = "¡Sigue!",
 --      ["Good! You now control Cappy."] = "", -- Basic_Training_-_Movement
---      ["Go on top of the flower"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Go on top of the flower."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Go, quick!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Gorkij"] = "", -- A_Classic_Fairytale:journey
 --      ["Go surf!"] = "", -- WxW
@@ -793,7 +790,6 @@
 --      ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow
 --      ["Green"] = "", -- 
 --      ["Green Bananas"] = "", -- A_Space_Adventure:fruit01
---      ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Green double rings also give you a new flying saucer."] = "", -- A_Space_Adventure:ice02
 --      ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01
 --      ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01
@@ -803,11 +799,8 @@
 --      ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Greetings from the Navy, %s (%s), for being a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["Greetings, %s!"] = "", -- A_Classic_Fairytale:dragon
---      ["Greg"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
---      ["Grenade Group"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard
 --      ["Grenades explode after 1 to 5 seconds (you decide)."] = "", -- Basic_Training_-_Grenade
 --      ["Grenades with high bounciness bounce a lot and behave chaotic."] = "", -- Basic_Training_-_Grenade
---      ["Grenade Team"] = "", -- Basic_Training_-_Grenade
 --      ["Grenade Training"] = "", -- Basic_Training_-_Grenade
 --      ["Grenadiers"] = "", -- Basic_Training_-_Grenade
 --      ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor
@@ -848,7 +841,6 @@
 --      ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion
 --      ["Health Modification Mode"] = "", -- HedgeEditor
 --      ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor
---      ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
 --      ["Heavenly Defense"] = "", -- Tentacle_Terror
 --      ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united
 	["Heavy"] = "Pesado",
@@ -861,6 +853,7 @@
 --      ["Hedgehog Projectile"] = "", -- Continental_supplies
 --      ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies
 --      ["Hedgehogs can not be deleted."] = "", -- HedgeEditor
+--      ["Hedgehogs left: %d"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Hedgehogs will be revived after their death."] = "", -- Mutant
 --      ["Hedgehogs will start in the first waypoint."] = "", -- Racer
 --      ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab
@@ -876,7 +869,6 @@
 --      ["Help Enabled"] = "", -- HedgeEditor
 --      ["Helpers: Each team starts with %d helper points"] = "", -- Battalion
 --      ["Helpers: Hogs will get 1 out of 2 helpers randomly each turn"] = "", -- Battalion
---      ["Help Hog Solo to find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Help me, Leaks!"] = "", -- A_Classic_Fairytale:journey
 --      ["Help me, please!!!"] = "", -- A_Classic_Fairytale:journey
 --      ["Help me, please!"] = "", -- A_Classic_Fairytale:journey
@@ -891,20 +883,20 @@
 --      ["Here you will find the current mission instructions."] = "", -- Basic_Training_-_Movement
 --      ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Heroic Wind"] = "", -- Continental_supplies
---      ["Hero Team"] = "", -- User_Mission_-_The_Great_Escape
 --      ["He's so brave..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["He was the lab assistant of Dr. Goodhogan, the inventor of the anti-gravity device."] = "", -- A_Space_Adventure:moon02
 --      ["He won't be selling us out anymore!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey, don't forget us! We still need to climb up!"] = "", -- A_Classic_Fairytale:family
 --      ["Hey, guys!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey guys!"] = "", -- A_Classic_Fairytale:united
---      ["Hey, Hog Solo! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey! I was supposed to collect it!"] = "", -- A_Space_Adventure:fruit02
+--      ["Hey, %s! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey, %s! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey
 --      ["Hidden"] = "", -- portal
 --      ["High Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["High Jump: [Backspace]"] = "", -- Basic_Training_-_Movement
+--      ["High Jump: Tap the [Curvy Arrow] shortly"] = "", -- Basic_Training_-_Movement
 --      ["--- Highland ---"] = "", -- Battalion
 --      ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander
 --      ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion
@@ -915,20 +907,24 @@
 --      ["Hill Guard"] = "", -- Bazooka_Battlefield
 --      ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01
 --      ["--- Hint ---"] = "", -- Battalion
---      ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
 --      ["Hint: Drilling holes should solve everything."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: Hold down [M] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: If this mission panel disappears, you can|see it again by hitting the Pause or Quit key."] = "", -- Basic_Training_-_Movement
 --      ["Hint: It might be a good idea to place a girder before starting to drill. Just saying."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: It might be easier if you vary the angle only slightly."] = "", -- Basic_Training_-_Bazooka
+--      ["Hint: Just select the parachute, it opens automatically when you fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion
 --      ["Hint: Launch the bazooka horizontally at full power."] = "", -- Basic_Training_-_Bazooka
---      ["Hint: Press [Esc] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Pause the game to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Select the blow torch, aim and press [Fire]. Press [Fire] again to stop."] = "", -- A_Classic_Fairytale:journey
 --      ["Hint: Select the low gravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey
+--      ["Hint: Select the rope, [Up] or [Down] to aim, [Attack] to fire, directional keys to move."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Select the Shoryuken and hit [Attack].|P.S.: You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: %s needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family
 --      ["Hint: The rope only bends around objects.|When it doesn't hit anything, it's always straight."] = "", -- Basic_Training_-_Rope
 --      ["Hint: To jump higher, wait a bit before you hit “High Jump” a second time."] = "", -- Basic_Training_-_Movement
+--      ["Hint: To place a girder, select it,|then use [Left] and [Right] to select angle and length,|then choose a location for the girder."] = "", -- A_Classic_Fairytale:shadow
 --      ["Hint: Use the quit key to see the team’s continent."] = "", -- Continental_supplies
 --      ["Hint: When you shorten the rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope
 --      ["Hint: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey
@@ -962,24 +958,11 @@
 --      ["Hogminator"] = "", -- A_Classic_Fairytale:family
 --      ["Hog nueve"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog octo"] = "", -- A_Space_Adventure:fruit03
---      ["Hogonauts"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Hog onze"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog Saturn"] = "", -- A_Space_Adventure:fruit03
 --      ["Hogs in sight!"] = "", -- Continental_supplies
 --      ["Hog Solo and GB"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hog Solo"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01, A_Space_Adventure:moon02
---      ["Hog Solo couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo escaped successfully!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo has to reach the last crates"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo has to refuel his saucer."] = "", -- A_Space_Adventure:moon01
---      ["Hog Solo lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
---      ["Hog Solo wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["- Hogs will be revived"] = "", -- Capture_the_Flag
 --      ["- Hogs will drop the flag when killed"] = "", -- Capture_the_Flag
 --      ["Hog two"] = "", -- A_Space_Adventure:fruit03
@@ -989,9 +972,7 @@
 --      ["Homing Bee"] = "", -- Construction_Mode
 --      ["Honda"] = "", -- 
 --      ["Honest Lee"] = "", -- A_Classic_Fairytale:enemy
---      ["Hook"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
 --      ["Hooks"] = "", -- 
-	["Hooray!"] = "¡Hurra!",
 --      ["Hooray! I actually did it! Hogera is safe!"] = "", -- A_Space_Adventure:final
 --      ["Hooray! I've found it, now I have to get back to Captain Lime!"] = "", -- A_Space_Adventure:fruit02
 --      ["Hooray! You are a champion!"] = "", -- A_Space_Adventure:ice02
@@ -1007,7 +988,7 @@
 --      ["However, if you fail to do so, she dies a most violent death, just like your friend! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, if you fail to do so, she dies a most violent death! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, my mates don't agree with me on letting you go..."] = "", -- A_Classic_Fairytale:dragon
---      ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
+--      ["However, the army of %s is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
 --      ["How to Rope"] = "", -- Basic_Training_-_Rope
 --      ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen
 --      ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen
@@ -1027,7 +1008,6 @@
 --      ["I can't believe what I'm hearing!"] = "", -- A_Classic_Fairytale:backstab
 --      ["I can't let you go further because …"] = "", -- A_Classic_Fairytale:queen
 --      ["I can't wait any more, I have to save myself!"] = "", -- A_Classic_Fairytale:shadow
---      ["Ice"] = "", -- Basic_Training_-_Movement
 --      ["Ice Jake"] = "", -- A_Space_Adventure:ice01
 --      ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family
 --      ["Icy Girder: [3]"] = "", -- HedgeEditor
@@ -1085,7 +1065,6 @@
 --      ["I just found out that they have captured your princess!"] = "", -- A_Classic_Fairytale:family
 --      ["I just want the strange device you found!"] = "", -- A_Space_Adventure:ice01
 --      ["I just wonder where Ramon and Spiky disappeared..."] = "", -- A_Classic_Fairytale:journey
---      ["Ikeda"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["I know and I'm terribly sorry!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know, my hero!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know that your resources are low due to the battle but I'll send two of my best hogs to assist you."] = "", -- A_Space_Adventure:fruit02
@@ -1113,6 +1092,7 @@
 --      ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen
 --      ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united
 --      ["IMPORTANT: To see the mission panel again, hold the mission panel key."] = "", -- Basic_Training_-_Movement
+--      ["IMPORTANT: To see the mission panel again, pause the game."] = "", -- Basic_Training_-_Movement
 --      ["Impressive...you are still dry as the corpse of a hawk after a week in the desert..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["%i ms"] = "", -- Gravity
 --      ["I'm so glad this is finally over!"] = "", -- A_Space_Adventure:final
@@ -1271,7 +1251,6 @@
 --      ["Kill the traitor, %s, or spare his life!"] = "", -- A_Classic_Fairytale:backstab
 --      ["--- King ---"] = "", -- Battalion
 --      ["King"] = "", -- Battalion
---      ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing
 --      ["--- King Mode ---"] = "", -- Battalion
 --      ["Knight"] = "", -- Battalion
 --      ["Knives"] = "", -- 
@@ -1290,7 +1269,7 @@
 --      ["Launch some bazookas to destroy the targets!"] = "", -- Basic_Training_-_Bazooka
 --      ["Leader"] = "", -- A_Classic_Fairytale:enemy
 --      ["Leaderbot"] = "", -- A_Classic_Fairytale:queen
---      ["Lead the Green Bananas to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
+--      ["Lead your allies to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
 --      ["Leaks A Lot"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Leaks A Lot, depressed for killing his loved one, failed to save the village..."] = "", -- A_Classic_Fairytale:journey
 --      ["Leaks A Lot gave his life for his tribe! He should have survived!"] = "", -- A_Classic_Fairytale:first_blood
@@ -1305,7 +1284,6 @@
 --      ["Left/right: Choose crate contents"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode
---      ["Left Tong"] = "", -- Bazooka_Battlefield
 --      ["Legs"] = "", -- 
 --      ["Less tools, more fun"] = "", -- Battalion
 --      ["Lestat"] = "", -- portal
@@ -1334,18 +1312,19 @@
 	["Lively Lifeguard"] = "Salvavidas dicharachero",
 --      ["Lonely Cries"] = "", -- Continental_supplies
 --      ["Lonely Cries: [Rise the water if no hog is in the circle and deal 6 damage to all enemy hogs.]"] = "", -- Continental_supplies
---      ["Lonely Hog"] = "", -- ClimbHome
 --      ["Long Jump: [Enter]"] = "", -- Basic_Training_-_Movement
+--      ["Long Jump: Tap the [Curvy Arrow] button for long"] = "", -- Basic_Training_-_Movement, A_Classic_Fairytale:first_blood
 --      ["Long Live The Queen"] = "", -- A_Classic_Fairytale:queen
 --      ["Look around: [Mouse movement]"] = "", -- Basic_Training_-_Movement
+--      ["Look around: [Tap or swipe on the screen]"] = "", -- Basic_Training_-_Movement
 --      ["Look, boss! There is the target!"] = "", -- A_Space_Adventure:moon01
 --      ["Look, I had no choice!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! There's more of them!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! We're surrounded by cannibals!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Looks like the whole world is falling apart!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Look to the left and do a backwards jump towards the mushroom."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Loon"] = "", -- The_Specialists
 --      ["Loopy"] = "", -- 
---      ["Lord Evil"] = "", -- Tentacle_Terror
 --      ["Losing Condition: Destroy"] = "", -- HedgeEditor
 --      ["Low Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander
@@ -1365,7 +1344,6 @@
 --      ["Mario"] = "", -- 
 --      ["Mark gears for win/lose conditions"] = "", -- HedgeEditor
 --      ["Mark/unmark gear: [Left Click]"] = "", -- HedgeEditor
---      ["Mark"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
 --      ["- Massive weapon bonus on first turn"] = "", -- Continental_supplies
 --      ["Max Citrus"] = "", -- A_Space_Adventure:fruit01
 --      ["Maybe you should try an easier map next time."] = "", -- Racer
@@ -1380,7 +1358,6 @@
 --      ["Mega kill!"] = "", -- Mutant
 --      ["Meiwes"] = "", -- A_Classic_Fairytale:backstab
 --      ["mikade"] = "", -- 
---      ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer
 --      ["Mindy"] = "", -- A_Classic_Fairytale:united
 	["Mine Deployer"] = "Plantador de minas",
 --      ["Mine Placement Mode"] = "", -- Construction_Mode
@@ -1399,12 +1376,12 @@
 --      ["Minion"] = "", -- A_Space_Adventure:moon01
 --      ["Minions"] = "", -- A_Space_Adventure:moon01
 --      ["Mission failed!"] = "", -- Big_Armory
-	["MISSION FAILED"] = "MISIÓN FRACASADA", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Mission failure in %d s"] = "", -- Big_Armory
+--      ["Mission"] = "", -- HedgeEditor
 --      ["Mission lost!"] = "", -- Basic_Training_-_Grenade
 --      ["Mission Panel"] = "", -- Basic_Training_-_Movement
 --      ["Mission panel: [M]"] = "", -- Basic_Training_-_Movement
-	["MISSION SUCCESSFUL"] = "MISIÓN COMPLETADA", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+--      ["Mission succeeded!"] = "", -- portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, SimpleMission, HedgeEditor
 --      ["Mission won!"] = "", -- Basic_Training_-_Grenade
 --      ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02
 --      ["Mixed %d"] = "", -- WxW
@@ -1420,7 +1397,6 @@
 --      ["Monster kill!"] = "", -- Mutant
 --      ["Monsters"] = "", -- 
 --      ["Mooney"] = "", -- 
---      ["More Natives"] = "", -- A_Classic_Fairytale:epil
 --      ["Morris"] = "", -- 
 --      ["Most mines are not active."] = "", -- A_Space_Adventure:desert02
 --      ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01
@@ -1440,13 +1416,11 @@
 --      ["Nade Boy"] = "", -- Basic_Training_-_Grenade
 --      ["Nah, probably everyone was just stupid."] = "", -- A_Space_Adventure:final
 --      ["Name"] = "", -- A_Classic_Fairytale:queen
-	["Nameless Heroes"] = "Héroes anónimos",
 --      ["Nancy Screw"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:queen
 --      ["Napalm"] = "", -- Construction_Mode
 --      ["Napalm Rocket"] = "", -- Continental_supplies
 --      ["Napalm rocket: [Fire a bomb with napalm!]"] = "", -- Continental_supplies
 --      ["Naranja Jed"] = "", -- A_Space_Adventure:fruit01
---      ["Natives"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Naughty Ninja"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Near a PAotH base on the moon ..."] = "", -- A_Space_Adventure:moon01
 --      ["Near Secret Base 17 of PAotH in the rural Hogland ..."] = "", -- A_Space_Adventure:cosmos
@@ -1541,11 +1515,8 @@
 --      ["Oh, my!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oh, my! I forgot something!"] = "", -- A_Classic_Fairytale:queen
 --      ["Oh, my! This is even more entertaining than I've expected!"] = "", -- A_Classic_Fairytale:backstab
-	["Oh no! Just try again!"] = "¡Oh, no! ¿Por qué no lo intentas de nuevo?", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Oh no, not %s!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
---      ["Oh no, the Green Bananas have betrayed Hog Solo and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
-	["Oh no! Time's up! Just try again."] = "¡Oh, no, se te acabó el tiempo! ¿Por qué no lo intentas de nuevo?", --Bazooka, Shotgun, SniperRifle
---      ["Oh no! You failed! Just try again."] = "", -- Basic_Training_-_Cluster_Bomb
+--      ["Oh no, the companions have betrayed %s and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
 --      ["Oh no! You have died. Try again!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Oh! Please spare me. You can take all my treasures!"] = "", -- A_Space_Adventure:ice01
 --      ["Oh, silly me! I forgot that I'm the shaman."] = "", -- A_Classic_Fairytale:backstab
@@ -1567,9 +1538,9 @@
 --      ["One shall not judge one by one's appearance!"] = "", -- A_Classic_Fairytale:epil
 --      ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oneye"] = "", -- portal
---      ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant
 --      ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant
+--      ["Only %s can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard
 --      ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01
@@ -1581,6 +1552,7 @@
 --      ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01
 --      ["Oops! You have selected the wrong hedgehog! Just try again."] = "", -- Basic_Training_-_Movement
 --      ["Open ammo menu: [Right click]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
+--      ["Open ammo menu: Tap the [Suitcase]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
 --      ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood
 	["Opposing Team: "] = "Equipo enemigo: ",
 --      ["Orange"] = "", -- 
@@ -1600,15 +1572,14 @@
 --      ["PAotH has sent explosives but unfortunately the trigger mechanism seems to be faulty!"] = "", -- A_Space_Adventure:cosmos
 --      ["Parachute"] = "", -- Continental_supplies
 --      ["Patches"] = "", -- 
-	["Pathetic Resistance"] = "Patética resistencia", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02
 --      ["Pause: [P]"] = "", -- Basic_Training_-_Movement
+--      ["Pause: Tap the [Pause] button"] = "", -- Basic_Training_-_Movement
 --      ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW
 --      ["Penguin Roar"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hog’s health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Perfect! Now try to get the next crate without hurting yourself!"] = "", -- A_Classic_Fairytale:first_blood
-	["Per-Hog Ammo"] = "Armamento individualizado",
 --      ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh
 --      ["Personal best: %.3f seconds"] = "", -- A_Space_Adventure:ice02
 --      ["Per team weapons"] = "", -- Continental_supplies
@@ -1617,7 +1588,6 @@
 --      ["Physicist"] = "", -- HedgeEditor
 --      ["Piano Strike"] = "", -- Construction_Mode
 --      ["Pikachu"] = "", -- 
---      ["Pincer Knights"] = "", -- Bazooka_Battlefield
 --      ["Pings left: %d"] = "", -- Space_Invasion
 --      ["Pink"] = "", -- 
 --      ["Pirates"] = "", -- 
@@ -1670,8 +1640,6 @@
 --      ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion
 --      ["--- Points ---"] = "", -- Battalion
 --      ["--- Points Mode ---"] = "", -- Battalion
-	["points"] = "puntos", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
---      ["point(s)"] = "", -- TargetPractice, Mutant
 --      ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02
 --      ["Poisonous, deals no damage."] = "", -- Continental_supplies
 	["Poison"] = "Veneno",
@@ -1691,37 +1659,37 @@
 --      ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to fight"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos
-	["Prepare yourself"] = "Prepárate",
+--      ["Prepare yourself, %s!"] = "", -- The_Specialists
 --      ["Press [Attack] (space bar by default) to start,|repeadedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] (space bar by default) to start,|repeatedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] to begin."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Attack] to confirm."] = "", -- Continental_supplies
 --      ["Press [Attack] to select this continent!"] = "", -- Continental_supplies
 --      ["Press [Left] and [Right] to change the difficulty."] = "", -- A_Classic_Fairytale:first_blood
---      ["Press [Left] or [Right] to move around, [Enter] to jump"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Press [Left] or [Right] to move around, [Long Jump] to jump forwards."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW
 --      ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW
+--      ["Press [M] to see the mission texts"] = "", -- Basic_Training_-_Movement
 	["Press [Precise] to skip intro"] = "Aprieta [Incrementar precisión] para saltar la intro",
 --      ["Press [Up] and [Down] to move between menu items.|Press [Attack], [Left], or [Right] to toggle."] = "", -- WxW
 --      ["Prestigious Pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Princess"] = "", -- A_Classic_Fairytale:family, A_Classic_Fairytale:journey
 --      ["Princess Peach"] = "", -- 
---      ["Private Nolak"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["Problems, dude? Chillax!"] = "", -- A_Classic_Fairytale:epil
 --      ["Professional pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professional stunt pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professor"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
 --      ["Professor Hogevil, then known as James Hogus, worked for PAotH back in my time."] = "", -- A_Space_Adventure:moon02
+--      ["Professor's Team"] = "", -- A_Space_Adventure:death01
 --      ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
---      ["Pro Killers"] = "", -- Big_Armory
 --      ["Protect the King: When the king dies, so does the team"] = "", -- Battalion
 --      ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Protect yourselves!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Purple"] = "", -- 
 --      ["Pyro"] = "", -- HedgeEditor, The_Specialists
 --      ["Pyromancer"] = "", -- Battalion
 --      ["Quit: [Esc]"] = "", -- Basic_Training_-_Movement
 --      ["Race complexity limit reached"] = "", -- Racer, TechRacer
+--      ["Race failed!"] = "", -- A_Space_Adventure:moon02
 --      ["Racer"] = "", -- Racer
 --      ["Racer tool"] = "", -- Racer
 --      ["Race"] = "", -- TrophyRace
@@ -1757,23 +1725,19 @@
 --      ["Replenishment: Weapons are restocked on turn start of a new hog"] = "", -- Highlander
 --      ["Repositioning Mode"] = "", -- HedgeEditor
 --      ["REPOSITIONING MODE"] = "", -- HedgeEditor
---      ["rescues"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Rescue the imprisoned PAotH team and get the fuel!"] = "", -- A_Space_Adventure:moon01
 --      ["Respawner"] = "", -- Construction_Mode
 --      ["Respawner: Resurrects dead hogs."] = "", -- Construction_Mode
 --      ["Resurrector"] = "", -- Construction_Mode
 --      ["Retract/Extend rope: [Up]/[Down]"] = "", -- Basic_Training_-_Rope
 --      ["- Return the enemy flag to your base to score"] = "", -- Capture_the_Flag
-	[" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = "- Vuelve a tu base con la bandera enemiga para anotar un punto | - El equipo que anote 3 puntos gana | - Sólo se puede anotar si tu propia bandera está en tu base | - Los erizos resucitan cuando mueren",
 --      ["Return to Leaks A Lot!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Return to the mission menu by pressing the \"Go back\" button."] = "", -- A_Space_Adventure:cosmos
 --      ["Return to the Surface"] = "", -- A_Space_Adventure:fruit02
 --      ["Return to the training menu by pressing the “Go back” button."] = "", -- Basic_Training_-_Movement
---      ["Rhombus"] = "", -- Basic_Training_-_Movement
 --      ["Rider"] = "", -- portal
 --      ["Rifleman"] = "", -- Battalion
 --      ["Righteous Beard"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:queen, A_Classic_Fairytale:united
---      ["Right Tong"] = "", -- Bazooka_Battlefield
 --      ["Ripe"] = "", -- 
 --      ["Rise the water if nobody else is in the circle and deal 6 damage to all enemy hogs."] = "", -- Continental_supplies
 --      ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01
@@ -1782,8 +1746,8 @@
 --      ["Roof"] = "", -- WxW
 --      ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Rope Master"] = "", -- Basic_Training_-_Rope
---      ["Roper"] = "", -- SpeedShoppa
 --      ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
+--      ["Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Rope Team"] = "", -- Basic_Training_-_Rope
 --      ["Rope Training"] = "", -- Basic_Training_-_Rope
 --      ["Rope Weapons"] = "", -- Basic_Training_-_Rope
@@ -1797,7 +1761,6 @@
 --      ["Round limit:"] = "", -- TechRacer
 --      ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer
 --      ["Round's slowest lap: %.3fs by %s"] = "", -- TrophyRace
---      ["Rounds until Sudden Death: %d"] = "", -- Battalion
 --      ["RS1"] = "", -- A_Space_Adventure:fruit03
 --      ["RS2"] = "", -- A_Space_Adventure:fruit03
 --      ["Rubber"] = "", -- Construction_Mode, HedgeEditor
@@ -1823,10 +1786,17 @@
 --      ["Salvation was one step closer now..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Sam"] = "", -- A_Space_Adventure:cosmos
 --      ["Sandals?! I thought you left your ring!"] = "", -- A_Classic_Fairytale:queen
+--      ["%s and GB"] = "", -- A_Space_Adventure:fruit02
 --      ["%s and %s enter the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sandstorm"] = "", -- A_Space_Adventure:desert01
 --      ["Sandy"] = "", -- A_Space_Adventure:desert01
-	["Save as many hapless hogs as possible!"] = "¡Salva a tantos pobres desgraciados como puedas!",
+--      ["%s arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
+--      ["Save as many hogs as possible!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey
 --      ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow
 --      ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor
@@ -1838,9 +1808,9 @@
 --      ["Scallywag"] = "", -- 
 --      ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab
 --      ["Scenario"] = "", -- Big_Armory, portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape
---      ["Scenario failed!"] = "", -- SimpleMission
 --      ["Scientist"] = "", -- Battalion
 --      ["%s climbed home in %d seconds!"] = "", -- ClimbHome
+--      ["%s (contd.)"] = "", -- A_Classic_Fairytale:epil
 --      ["Score: %d"] = "", -- Space_Invasion
 --      ["Score goal: %d"] = "", -- Control
 --      ["Score graph"] = "", -- Mutant, Space_Invasion
@@ -1850,6 +1820,7 @@
 --      ["Scores"] = "", -- Mutant
 --      ["Scores:"] = "", -- Mutant
 --      ["Scoring: "] = "", -- Mutant
+--      ["%s couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
 --      ["Script parameter examples:"] = "", -- Gravity
 --      ["%s (+%d)"] = "", -- Battalion
 --      ["%s: %d"] = "", -- Capture_the_Flag, Control
@@ -1862,10 +1833,9 @@
 --      ["%s died … and lives again!"] = "", -- Construction_Mode
 --      ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome
 --      ["%s, %d sec"] = "", -- Continental_supplies
---      ["Search for the device with the help of the other hedgehogs "] = "", -- A_Space_Adventure:fruit02
+--      ["Search for the device with the help of the other hedgehogs."] = "", -- A_Space_Adventure:fruit02
 --      ["Searching in the dust"] = "", -- A_Space_Adventure:desert01
 --      ["Searching the stars!"] = "", -- A_Space_Adventure:cosmos
---      ["seconds"] = "", -- ClimbHome
 --      ["Seduction"] = "", -- Continental_supplies
 --      ["Seems like every time you take a \"walk\", the enemy finds us!"] = "", -- A_Classic_Fairytale:backstab
 --      ["See that crate farther on the right?"] = "", -- A_Classic_Fairytale:first_blood
@@ -1892,6 +1862,7 @@
 --      ["Select your continent with [Up]/[Down] or by selecting a representative weapon."] = "", -- Continental_supplies
 --      ["%s enters the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sergey"] = "", -- 
+--      ["%s escaped successfully!"] = "", -- A_Space_Adventure:fruit01
 --      ["Set bounciness: [Left Shift] + [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set detonation timer: [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set Health: [Left Click]"] = "", -- HedgeEditor
@@ -1915,10 +1886,12 @@
 --      ["%s has been killed before taking enough damage first."] = "", -- SimpleMission
 --      ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has been rescued from death"] = "", -- Construction_Mode
+--      ["%s has dropped the flag!"] = "", -- CTF_Blizzard
 --      ["%s has fallen victim to gravity."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has mutated! +2 points"] = "", -- Mutant
 --      ["%s has passed the best height of %s!"] = "", -- ClimbHome
 --      ["%s has scored!"] = "", -- Capture_the_Flag
+--      ["%s has to refuel the saucer."] = "", -- A_Space_Adventure:moon01
 --      ["%s hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil
 --      ["sheepluva"] = "", -- 
@@ -1935,8 +1908,6 @@
 --      ["Shinobi"] = "", -- 
 --      ["%s hit the ground."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Shoppa Love"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
---      ["Shoppa Union"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes, Challenge_-_Speed_Shoppa_-_ShoppaKing
---      ["Shoppers"] = "", -- SpeedShoppa
 --      ["Shotgun"] = "", -- Continental_supplies
 --      ["Sigh."] = "", -- A_Classic_Fairytale:epil
 	["Silly"] = "Idiota",
@@ -1949,11 +1920,11 @@
 --      ["%s is now as poor as a church mouse"] = "", -- Construction_Mode
 --      ["%s is now a zombie hedgehog"] = "", -- Construction_Mode
 --      ["%s is suddenly low on ammo"] = "", -- Construction_Mode
---      ["Skip your turn to try again."] = "", -- Basic_Training_-_Rope
 --      ["Skulls"] = "", -- Bazooka_Battlefield
 --      ["Slimer"] = "", -- 
 --      ["Slippery"] = "", -- A_Classic_Fairytale:journey
 --      ["%s lost all the weapons"] = "", -- Construction_Mode
+--      ["%s lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
 --      ["Slot %d: %s"] = "", -- Frenzy
 --      ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy
 --      ["Slowpoke"] = "", -- 
@@ -1967,6 +1938,7 @@
 --      ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smugglers"] = "", -- A_Space_Adventure:desert01
+--      ["%s must collect the final crates."] = "", -- A_Space_Adventure:fruit02
 --      ["%s must skip this turn for rule violation."] = "", -- WxW
 --      ["Sneaks"] = "", -- Bazooka_Battlefield
 --      ["%s never got the ninja diploma."] = "", -- ClimbHome
@@ -1975,10 +1947,8 @@
 --      ["Sniper"] = "", -- HedgeEditor, The_Specialists
 --      ["Sniper Rifle"] = "", -- Continental_supplies
 	["Sniper Training"] = "Entrenamiento con rifle francotirador",
-	["Sniperz"] = "Francotiradores",
 --      ["So, as promised I have brought you where I think that the device you are looking for is hidden."] = "", -- A_Space_Adventure:fruit02
 --      ["So far, you had infinite ropes, but in the|real world, ropes are usually limited."] = "", -- Basic_Training_-_Rope
---      ["So Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["So, I believe that it's a good place to start."] = "", -- A_Space_Adventure:desert01
 --      ["So, I kindly ask for your help."] = "", -- A_Space_Adventure:fruit01
@@ -1988,11 +1958,12 @@
 --      ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03
 --      ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen
 --      ["Some weapons can be dropped from the rope."] = "", -- Basic_Training_-_Rope
---      ["Somewhere else on the planet of fruits, Captain Lime helps Hog Solo"] = "", -- A_Space_Adventure:fruit02
---      ["Somewhere else on the planet of fruits Hog Solo gets closer to the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, Captain Lime helps %s"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, %s gets closer to the device"] = "", -- A_Space_Adventure:fruit02
 --      ["Somewhere on the Planet of Fruits a terrible war is about to begin ..."] = "", -- A_Space_Adventure:fruit01
 --      ["Somewhere on the uninhabitable Death Planet ..."] = "", -- A_Space_Adventure:death01
 --      ["So, now I got the last part and I have your friends captured."] = "", -- A_Space_Adventure:death01
+--      ["So, %s, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So the princess was never heard of again ..."] = "", -- A_Classic_Fairytale:family
 --      ["So, uhmm, how did you manage to teleport them so far?"] = "", -- A_Classic_Fairytale:epil
 --      ["Sour"] = "", -- 
@@ -2093,8 +2064,6 @@
 --      ["Structure Placement Mode"] = "", -- Construction_Mode
 --      ["Structure Placer"] = "", -- Construction_Mode
 --      ["Stupid, stupid Hogerians!"] = "", -- A_Space_Adventure:final
---      ["Subject 1"] = "", -- portal
---      ["Subjects"] = "", -- portal
 --      ["Subtract %d"] = "", -- HedgeEditor
 --      ["--- Sudden Death ---"] = "", -- Battalion
 --      ["Summer Squash"] = "", -- A_Space_Adventure:fruit01
@@ -2111,7 +2080,7 @@
 --      ["Surfer! +15 points!"] = "", -- Space_Invasion
 --      ["Surfer!"] = "", -- WxW
 --      ["Surprise supplies: Get 1-3 random weapons each turn."] = "", -- Continental_supplies
---      ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:shadow
+--      ["Survive!"] = "", -- A_Classic_Fairytale:shadow
 --      ["%s violated the “All But Last” rule and will be penalized."] = "", -- WxW
 --      ["%s violated the “Kill The Leader” rule and will be penalized."] = "", -- WxW
 --      ["Swap place with a random enemy in the circle."] = "", -- Continental_supplies
@@ -2130,6 +2099,7 @@
 --      ["%s! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
 --      ["Swing, Leaks A Lot, on the wings of the wind!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Swing: [Left]/[Right]"] = "", -- Basic_Training_-_Rope
+--      ["%s wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome
 --      ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer
 --      ["switch"] = "", -- Continental_supplies
@@ -2143,6 +2113,7 @@
 --      ["Switch Hog"] = "", -- Construction_Mode
 --      ["Switch: Select weapon special"] = "", -- Continental_supplies
 --      ["Switch: Toggle crate radar"] = "", -- WxW
+--      ["%s won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Swords"] = "", -- Bazooka_Battlefield
 --      ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon
 --      ["%s, you may choose the rules."] = "", -- WxW
@@ -2151,6 +2122,8 @@
 --      ["Tails"] = "", -- 
 --      ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Tall Potato"] = "", -- A_Space_Adventure:fruit01
+--      ["Tap [Pause] to see the mission texts"] = "", -- Basic_Training_-_Movement
+--      ["Tap the “rotating arrow” button on the left|until you have selected Cappy, the hedgehog with the cap!"] = "", -- Basic_Training_-_Movement
 --      ["Target"] = "", -- HedgeEditor
 --      ["Target Placement Mode"] = "", -- Construction_Mode
 --      ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor
@@ -2166,15 +2139,18 @@
 --      ["Tatters"] = "", -- 
 	["Team %d: "] = "Equipo %d",
 --      ["Team %d"] = "", -- SimpleMission
+--      ["Team highscore: %d"] = "", -- Utils
 --      ["Team Identity Mode"] = "", -- HedgeEditor
 --      ["TEAM IDENTITY MODE"] = "", -- HedgeEditor
---      ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
+--      ["Team lowscore: %d"] = "", -- Utils
 --      ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion
+--      ["Team's best time: %.3fs"] = "", -- Utils
 --      ["Team Scores:"] = "", -- Control
 --      ["Team scores:"] = "", -- Space_Invasion
+--      ["Team's longest time: %.3fs"] = "", -- Utils
+--      ["Team's top accuracy: %d%"] = "", -- Utils
 --      ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2
 --      ["Teamwork"] = "", -- User_Mission_-_Teamwork
---      ["Team Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
 --      ["TechRacer"] = "", -- TechRacer
 --      ["Teleporation Node"] = "", -- Construction_Mode
 --      ["Teleportation Mode"] = "", -- Construction_Mode
@@ -2266,11 +2242,12 @@
 --      ["The forgotten continent"] = "", -- Continental_supplies
 --      ["The giant umbrella from the last crate should help break the fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Great Escape"] = "", -- User_Mission_-_The_Great_Escape
---      ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01
+--      ["- The green target must survive"] = "", -- HedgeEditor
+--      ["- The green targets must survive"] = "", -- HedgeEditor
 --      ["The guardian"] = "", -- A_Classic_Fairytale:shadow
 --      ["The hardships of the war turned %s (%s) into a killing machine: %d invaders destroyed in one round!"] = "", -- Space_Invasion
+--      ["The health of your current hedgehog|is shown at the top right corner."] = "", -- Basic_Training_-_Movement
 --      ["The hedgehog with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant
---      ["The Hogies"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["The Hospital"] = "", -- 
 --      ["The Individualist"] = "", -- A_Classic_Fairytale:shadow
 --      ["Their buildings were very primitive back then, even for an uncivilised island."] = "", -- A_Classic_Fairytale:united
@@ -2288,7 +2265,6 @@
 --      ["The Mutant has super-weapons and a lot of health."] = "", -- Mutant
 --      ["The Mutant loses health quickly, but gains health by killing."] = "", -- Mutant
 --      ["The Mutant loses health quickly if he doesn't keep scoring kills."] = "", -- Mutant
-	["The Nameless One"] = "Anónimo",
 --      ["The Navy greets %s for managing to get in a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["The next 4 times you play the \"The last encounter\" mission you'll get 20 more hit points and a laser sight."] = "", -- A_Space_Adventure:death02
 --      ["The next crate is an utility crate."] = "", -- Basic_Training_-_Movement
@@ -2302,6 +2278,7 @@
 --      ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil
 --      ["The oppression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
 --      ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
+--      ["The other hog has died, he should have survived!"] = "", -- A_Space_Adventure:moon02
 --      ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Police"] = "", -- 
 --      ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -2326,7 +2303,7 @@
 --      ["The Showdown"] = "", -- A_Classic_Fairytale:shadow
 --      ["The Slaughter"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:first_blood
 --      ["The Society of Perfectionists greets %s (%s): No misses and %d hits in its best round."] = "", -- Space_Invasion
-	["THE SPECIALISTS"] = "LOS ESPECIALISTAS",
+--      ["The Specialists: Each hedgehog starts with its own weapon set"] = "", -- The_Specialists
 --      ["The spinning arrows above your hedgehog show|which hedgehog is selected right now."] = "", -- Basic_Training_-_Movement
 --      ["The spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
@@ -2374,7 +2351,6 @@
 --      ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["This also increases the effectiveness of Medicine."] = "", -- Continental_supplies
 --      ["This game wasn’t really exciting."] = "", -- Space_Invasion
---      ["This Hog Solo is so naive! When he returns I'll shoot him and keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This is a new personal best, congratulations!"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert02, A_Space_Adventure:fruit03
 --      ["This is a new personal best time, congratulations!"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["This is Cappy."] = "", -- Basic_Training_-_Movement
@@ -2392,6 +2368,7 @@
 	["This rain is really something..."] = "Vaya que si llueve...",
 --      ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome
 --      ["This seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01
+--      ["This %s is so naive! I'm going to shoot this fool so I can keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This was an awesome performance! But this challenge can be finished with even just one RC plane. Can you figure out how?"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["This will be fun!"] = "", -- A_Classic_Fairytale:enemy
 --      ["This will be useful when I need a new platform or if I want to rise."] = "", -- portal
@@ -2432,11 +2409,11 @@
 --      ["To begin with the training, hit the attack key!"] = "", -- Basic_Training_-_Movement
 --      ["To begin with the training, select the bazooka from the ammo menu!"] = "", -- Basic_Training_-_Bazooka
 --      ["To begin with the training, select the grenade from the ammo menu!"] = "", -- Basic_Training_-_Grenade
+--      ["To begin with the training, tap the attack button!"] = "", -- Basic_Training_-_Movement
 --      ["To finish hedgehog selection, just do anything|with him, like walking."] = "", -- Basic_Training_-_Movement
 --      ["To get over the next obstacles, keep some distance from the wall before you back jump."] = "", -- Basic_Training_-_Movement
 --      ["To get over the water, you have to do multiple|rope shots and swings."] = "", -- Basic_Training_-_Rope
 --      ["Toggle Editing Weapons and Tools: [Precise]+[2]"] = "", -- HedgeEditor
---      ["Toggle Gear Information: [Precise]+[3]"] = "", -- HedgeEditor
 --      ["Toggle Help: [Precise]+[1]"] = "", -- HedgeEditor
 --      ["Toggle Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Toggle Shield: [Long jump]"] = "", -- Space_Invasion
@@ -2446,14 +2423,14 @@
 --      ["Too bad! Then you should really leave!"] = "", -- A_Space_Adventure:fruit01
 --      ["Too slow! Try again ..."] = "", -- A_Space_Adventure:moon02
 --      ["Top-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"] = "", -- A_Classic_Fairytale:shadow
 --      ["To reach higher ground, walk to a ledge, look to the left, then do a back jump."] = "", -- Basic_Training_-_Movement
 --      ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey
 --      ["To the caves..."] = "", -- A_Classic_Fairytale:united
 --      ["Touch all waypoints as fast as you can!"] = "", -- Racer
---      ["To win the game, Hog Solo has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
+--      ["- Touch the sparkles near your base to teleport"] = "", -- CTF_Blizzard
+--      ["To win the game, %s has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
 --      ["To win the game you had to collect the 2 crates with no specific order."] = "", -- A_Space_Adventure:desert01
---      ["To win the game you have to eliminate all your enemies."] = "", -- A_Space_Adventure:death01
+--      ["To win the game you have to eliminate Professor Hogevil."] = "", -- A_Space_Adventure:death01
 --      ["To win the game you have to find the right crate."] = "", -- A_Space_Adventure:desert01
 --      ["To win the game you have to go next to Thanta."] = "", -- A_Space_Adventure:ice01
 --      ["To win the game you have to go to the surface."] = "", -- A_Space_Adventure:desert02
@@ -2461,13 +2438,10 @@
 --      ["To win the game you have to stand next to Thanta."] = "", -- A_Space_Adventure:ice01
 	["Toxic Team"] = "Tóxicos", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Track completed!"] = "", -- Racer, TechRacer
---      ["Trainee"] = "", -- TargetPractice
 --      ["Training"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Training complete!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Training Team"] = "", -- TargetPractice
 --      ["Traitors"] = "", -- A_Classic_Fairytale:epil
 --      ["Traitors don't get to shout around here!"] = "", -- A_Classic_Fairytale:epil
---      ["Trapped"] = "", -- Basic_Training_-_Movement
 --      ["Trapper"] = "", -- HedgeEditor
 --      ["Travel carefully as your fuel is limited"] = "", -- A_Space_Adventure:cosmos
 --      ["Travel to all the neighbor planets and collect all the pieces"] = "", -- A_Space_Adventure:cosmos
@@ -2484,7 +2458,6 @@
 --      ["Try to land softly, as you can still take fall damage!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Try to protect the chief! You won't lose if he dies, but it is advised that he survives."] = "", -- A_Classic_Fairytale:united
 --      ["Try to reach and destroy the next target quickly."] = "", -- Basic_Training_-_Rope
-	["T_T"] = "T_T",
 --      ["Tumbler"] = "", -- Tumbler
 --      ["Turn around: [Left Shift] + [Left]/[Right]"] = "", -- Basic_Training_-_Movement
 --      ["Turning Around"] = "", -- Basic_Training_-_Movement
@@ -2503,7 +2476,6 @@
 --      ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy
 --      ["Ukemi"] = "", -- 
 --      ["Ultra kill!"] = "", -- Mutant
---      ["Ultrasoldier"] = "", -- Big_Armory
 --      ["unC0Rr"] = "", -- 
 --      ["Under Construction"] = "", -- A_Classic_Fairytale:shadow
 --      ["Under normal circumstances we could easily defeat them but we have kindly sent most of our men to the Kingdom of Sand to help with the annual dusting of the king's palace."] = "", -- A_Space_Adventure:fruit01
@@ -2527,7 +2499,6 @@
 --      ["United We Stand"] = "", -- A_Classic_Fairytale:united
 	["Unit"] = "Unidad",
 --      ["Unlike bazookas, grenades are not influenced by wind."] = "", -- Basic_Training_-_Grenade
-	["Unlimited Attacks"] = "Ataques ilimitados",
 --      ["Unlimited Attacks: Attacks don't end your turn"] = "", -- User_Mission_-_Diver, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree
 --      ["Unlucky Sods"] = "", -- User_Mission_-_Rope_Knock_Challenge
 	["Unstoppable!"] = "¡Imparable!",
@@ -2543,13 +2514,14 @@
 --      ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood
 	["User Challenge"] = "Reto personal",
 --      ["!"] = "", -- User_Mission_-_Dangerous_Ducklings
+--      ["User Mission"] = "", -- HedgeEditor
 --      ["Use the attack key twice to change the flying saucer while being in air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the attack key twice to change the flying saucer while floating in mid-air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the bazooka and the flying saucer to get the freezer."] = "", -- A_Space_Adventure:ice01
 --      ["Use the flying saucer from the crate to fly to the moon."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly the other planets."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly to the other planets."] = "", -- A_Space_Adventure:cosmos
---      ["Use the parachute ([Space] while in air) to get the next crate"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Use the parachute to get the next crate."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Use the portal gun to get to the next crate, then use the new gun to get to the final destination!|"] = "", -- A_Classic_Fairytale:dragon
 --      ["Use the RC plane and destroy the all the targets."] = "", -- A_Space_Adventure:desert03
 --      ["Use the rope in order to catch the blue hedgehog"] = "", -- A_Space_Adventure:moon02
@@ -2583,7 +2555,6 @@
 --      ["Victory Condition: Collect"] = "", -- HedgeEditor
 --      ["Victory Condition: Destroy"] = "", -- HedgeEditor
 --      ["Victory for %s!"] = "", -- Capture_the_Flag
-	["Victory for the "] = "La victoria es para ", -- CTF_Blizzard, Capture_the_Flag
 --      ["Violence is not the answer to your problems!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos
 --      ["Vladimir"] = "", -- 
@@ -2602,9 +2573,6 @@
 --      ["Walls left: %d"] = "", -- WxW
 --      ["Wall to wall"] = "", -- WxW
 --      ["Waluigi"] = "", -- 
---      ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Wannabe Ropers"] = "", -- Basic_Training_-_Rope
---      ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Wario"] = "", -- 
 --      ["Warming Up"] = "", -- Basic_Training_-_Grenade
 --      ["Warning: Fire cake detected"] = "", -- ClimbHome
@@ -2633,7 +2601,6 @@
 --      ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion
 --      ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion
 --      ["Weapon specials: Some weapons have special modes (see weapon description)."] = "", -- Continental_supplies
-	["Weapons Reset"] = "Armamento reiniciado",
 --      ["Weapons reset: The weapons are reset after each turn."] = "", -- WxW
 --      ["We are indeed."] = "", -- A_Classic_Fairytale:backstab
 --      ["We can't defeat them!"] = "", -- A_Classic_Fairytale:shadow
@@ -2650,9 +2617,9 @@
 --      ["We have to hurry! Are you armed?"] = "", -- A_Space_Adventure:moon01
 --      ["We have to protect the village!"] = "", -- A_Classic_Fairytale:united
 --      ["We have to unite and defeat those cylergs!"] = "", -- A_Classic_Fairytale:enemy
---      ["Welcome Hog Solo, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome home! Please take a seat"] = "", -- ClimbHome
 --      ["Welcome, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey
+--      ["Welcome, %s, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome to the Death Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
@@ -2819,16 +2786,16 @@
 --      ["You can’t open a portal on the blue surface."] = "", -- portal
 --      ["You can use the other 2 hogs to assist you."] = "", -- A_Space_Adventure:fruit02
 --      ["You can use the rope to reach new places."] = "", -- Basic_Training_-_Rope
---      ["You choose well, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You choose well, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You completed the mission in %.3f seconds."] = "", -- A_Space_Adventure:ice02
 --      ["You completed the mission in %d rounds."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03
---      ["You couldn't have come to a worse time, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You couldn't have come to a worse time, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You couldn't possibly believe that after refusing my offer I'd just let you go!"] = "", -- A_Classic_Fairytale:journey
 	["You'd almost swear the water was rising!"] = "¡Pero si podría jurar que está subiendo el nivel del mar!",
 --      ["You'd better watch your steps..."] = "", -- A_Classic_Fairytale:journey
 --      ["You defended yourself against Captain Lime."] = "", -- A_Space_Adventure:fruit02
---      ["You defended yourself against the Fruit Assassins."] = "", -- A_Space_Adventure:fruit02
---      ["You did great, Hog Solo! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
+--      ["You defended yourself against %s."] = "", -- A_Space_Adventure:fruit02
+--      ["You did great, %s! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
 --      ["You did not make it in time, try again!"] = "", -- Basic_Training_-_Rope
 --      ["You don't deserve my sacrifice!"] = "", -- A_Classic_Fairytale:queen
 --      ["You drove Professor Hogevil away."] = "", -- A_Space_Adventure:moon01
@@ -2844,12 +2811,12 @@
 --      ["You got me!"] = "", -- A_Space_Adventure:moon02
 --      ["You had %.1fs remaining on the clock (+%d points)."] = "", -- TargetPractice
 --      ["You had %.2fs remaining on the clock (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle
---      ["You had %d additional flying saucers left."] = "", -- A_Space_Adventure:ice02
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: you might want to use some mines..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: You might want to use some mines ..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01
 --      ["You have activated Switch Hedgehog!"] = "", -- Basic_Training_-_Movement
 --      ["You have beaten the challenge!"] = "", -- ClimbHome
+--      ["You have beaten the team record, congratulations!"] = "", -- Utils
 --      ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab
 --      ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united
 --      ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01
@@ -2868,7 +2835,6 @@
 --      ["You have eliminated all visible enemy hedgehogs!"] = "", -- A_Space_Adventure:fruit01
 --      ["You have eliminated Professor Hogevil."] = "", -- A_Space_Adventure:moon01
 --      ["You have eliminated the evil minions."] = "", -- A_Space_Adventure:moon01
---      ["You have eliminated the whole evil team. You're pretty tough!"] = "", -- A_Space_Adventure:moon01
 --      ["You have escaped successfully."] = "", -- A_Space_Adventure:desert02
 --      ["You have failed to complete your task, young one!"] = "", -- A_Classic_Fairytale:journey
 --      ["You have failed to save the tribe!"] = "", -- A_Classic_Fairytale:backstab
@@ -2922,6 +2888,7 @@
 --      ["You have to travel again"] = "", -- A_Space_Adventure:cosmos
 --      ["You have to try again!"] = "", -- A_Space_Adventure:cosmos
 --      ["You have triggered the secret Do-Not-Rope-to-the-Moon Defense System."] = "", -- A_Space_Adventure:cosmos
+--      ["You have unlocked the target radar!"] = "", -- TargetPractice
 --      ["You have used %d flying saucers."] = "", -- A_Space_Adventure:ice02
 --      ["You have used %d RC planes."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["You have used only 1 RC plane. Outstanding!"] = "", -- User_Mission_-_RCPlane_Challenge
@@ -2940,10 +2907,9 @@
 --      ["You'll have only 2 watermelon bombs during the game."] = "", -- A_Space_Adventure:fruit03
 --      ["You'll have only one RC plane at the start of the mission."] = "", -- A_Space_Adventure:desert03
 --      ["You'll have to eliminate Captain Lime at the end."] = "", -- A_Space_Adventure:fruit02
---      ["You'll have to eliminate the Fruit Assassins at the end."] = "", -- A_Space_Adventure:fruit02
+--      ["You'll have to eliminate %s at the end."] = "", -- A_Space_Adventure:fruit02
 --      ["You'll lose if you die or if your time is up."] = "", -- A_Space_Adventure:moon02
 --      ["You'll see what I mean!"] = "", -- A_Classic_Fairytale:enemy
---      ["You lose!"] = "", -- Basic_Training_-_Sniper_Rifle, Big_Armory, Basic_Training_-_Bazooka, TargetPractice, ClimbHome
 --      ["You lost your target, try again!"] = "", -- TargetPractice
 --      ["You may find it handy."] = "", -- A_Space_Adventure:cosmos
 --      ["You may only attack from a rope!"] = "", -- WxW
@@ -2965,8 +2931,7 @@
 --      ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice
 --      ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice
 --      ["Your ammo is limited this time."] = "", -- Basic_Training_-_Bazooka
---      ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy
---      ["Your deaths will be avenged, Natives!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Your deaths will be avenged, %s!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Your death will not be in vain, Dense Cloud!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You're a coward!"] = "", -- A_Classic_Fairytale:queen
 --      ["You're...alive!? But we saw you die!"] = "", -- A_Classic_Fairytale:backstab
@@ -2994,21 +2959,21 @@
 --      ["Your next task is to collect some crates by using the rope!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Your personal best time so far: %.3f seconds"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["Your rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["You saved %d of 8 Hapless Hogs."] = "", -- User_Mission_-_That_Sinking_Feeling
+--      ["Your rope is gone! Try again!"] = "", -- Basic_Training_-_Rope
+--      ["You saved %d of 8 hegehogs."] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen
 --      ["You see the wind strength at the bottom right corner."] = "", -- Basic_Training_-_Bazooka
+--      ["You see the wind strength at the top."] = "", -- Basic_Training_-_Bazooka
 --      ["You should have known that we don't rely on meatbags!"] = "", -- A_Classic_Fairytale:queen
 --      ["You should know this more than anyone, Leaks!"] = "", -- A_Classic_Fairytale:queen
 --      ["You speak great truth, Hannibal. Here, take a sip!"] = "", -- A_Classic_Fairytale:epil
 --      ["You've been assaulting us, we have been just defending ourselves!"] = "", -- A_Classic_Fairytale:enemy
-	["You've failed. Try again."] = "Has fracasado. Inténtalo de nuevo.",
 	["You've reached the goal!| |Time: "] = "¡Has llegado a la meta!| |Tiempo: ",
 --      ["You will be avenged!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You will fail if you run out of ammo and there are still targets available."] = "", -- A_Space_Adventure:desert03
 --      ["You will gain some extra ammo from the crates the next time you play the \"Getting to the device\" mission."] = "", -- A_Space_Adventure:fruit03
 --      ["You will play every 3 turns."] = "", -- A_Space_Adventure:fruit01
 --      ["- You will recieve 2-4 weapons on each kill! (Even on own hogs)"] = "", -- Continental_supplies
---      ["You win!"] = "", -- Big_Armory
 --      ["You won't believe what happened to me!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Yuck! I bet they'll keep worshipping her even after I save the village!"] = "", -- A_Classic_Fairytale:family
 --      ["Yumme Gunpowder"] = "", -- 
@@ -3016,6 +2981,7 @@
 --      ["Zombie"] = "", -- 
 --      ["Zombi"] = "", -- portal
 	["'Zooka Team"] = "Bazuqueros",
---      ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
+--      ["Zoom: [Pinch] with 2 fingers"] = "", -- Basic_Training_-_Movement
+--      ["Zoom: [Rotate mouse wheel]"] = "", -- Basic_Training_-_Movement
 --      ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen
 }
--- a/share/hedgewars/Data/Locale/fr.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/fr.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -26,7 +26,6 @@
 --      ["Above-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Accuracy Bonus! +15 points"] = "", -- Space_Invasion
 --      ["Accuracy bonus: +%d points"] = "", -- Basic_Training_-_Sniper_Rifle
---      ["Ace"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge
 --      ["Achievement gotten: %s"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_That_Sinking_Feeling, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, Basic_Training_-_Rope, Tumbler
       ["A Classic Fairytale"] = "Un conte classique de fée",
 --      ["A crate critical to this mission has been destroyed."] = "", -- SimpleMission
@@ -46,7 +45,6 @@
       ["Again with the 'cannibals' thing!"] = "Encore avec votre 'cannibale' truc",
 --      ["A Hedgewars minigame"] = "", -- Capture_the_Flag
 --      ["A Hedgewars mini-game"] = "", -- Racer, Space_Invasion, TechRacer, Tumbler
-      ["a Hedgewars mini-game"] = "Un mini jeux d'Hedgewars", -- Space_Invasion, The_Specialists
 --      ["A Hedgewars tag game"] = "", -- Mutant
 --      ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome
 --      ["Aim at the ceiling and hold [Attack] pressed until the rope attaches."] = "", -- Basic_Training_-_Rope
@@ -141,13 +139,14 @@
 --      ["As you've seen, the dropped grenade roughly fell into your flying direction."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Athlete"] = "", -- Battalion
 --      ["Attack: Activate"] = "", -- Racer
---      ["Attack Captain Lime before he attacks back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack Captain Lime before he attacks back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack From Rope: %s"] = "", -- WxW
 --      ["Attack From Rope: You may only attack from a rope."] = "", -- WxW
 --      ["Attack rule: %s"] = "", -- WxW
 --      ["Attack: Select this continent"] = "", -- Continental_supplies
 --      ["Attack: [Space]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
---      ["Attack the assassins before they attack back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack: Tap the [Bomb]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
+--      ["Attack the assassins before they attack back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack: Throw ball"] = "", -- Knockball
 --      ["At the end of the game your health was %d."] = "", -- A_Space_Adventure:ice01
 --      ["At the start of the game each enemy hog has only the weapon that he is named after."] = "", -- A_Space_Adventure:death02
@@ -155,16 +154,18 @@
 --      ["Available weapon specials:"] = "", -- Continental_supplies
 --      ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion
---      ["Avoid the mines!"] = "", -- Basic_Training_-_Rope
 --      ["Axes"] = "", -- Bazooka_Battlefield
 --      ["Aye! Fellow! Let me exit this chamber of doom!"] = "", -- A_Classic_Fairytale:epil
 --      ["Back Breaker"] = "",
       ["Back in the village, after telling the villagers about the threat..."] = "De retour au village, après avoir averti les villageois de la menace...",
 --      ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil
 --      ["Back Jump: [Backspace] ×2"] = "", -- Basic_Training_-_Movement
+--      ["Back Jump: Double-tap the [Curvy Arrow]"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (1/2)"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (2/2)"] = "", -- Basic_Training_-_Movement
       ["Backstab"] = "Coup de poignard dans le dos",
+--      ["Backwards jump: Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Backwards jump: Tap the [Curvy Arrow] twice"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Bacon"] = "", -- 
 --      ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Badmad"] = "", -- portal
@@ -197,7 +198,6 @@
 --      ["Bazooka Battlefield"] = "", -- Bazooka_Battlefield
 --      ["Bazooka Master"] = "", -- Basic_Training_-_Bazooka
 --      ["Bazookas are influenced by wind."] = "", -- Basic_Training_-_Bazooka
---      ["Bazooka Team"] = "", -- Basic_Training_-_Bazooka
       ["Bazooka Training"] = "Entraînement au Bazooka",
 --      ["Bearded Beast"] = "", -- 
 --      ["Be careful, the future of Hogera is in your hands!"] = "", -- A_Space_Adventure:cosmos
@@ -231,7 +231,6 @@
 --      ["Bloodpie"] = "",
 --      ["Bloodrocutor"] = "",
       ["Bloodsucker"] = "Sangsue",
-      ["Bloody Rookies"] = "Nouvelles recrues", -- 01#Boot_Çamp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 --      ["Blue"] = "", -- 
       ["Blue Team"] = "Team Bleue", -- User_Mission_-_Dangerous_Ducklings
 --      ["Bob"] = "", -- A_Space_Adventure:cosmos
@@ -320,7 +319,9 @@
 --      ["Challenge objectives"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit03, A_Space_Adventure:moon02
 --      ["Challenge over!"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa, ClimbHome
+--      ["Change bounciness: Tap [B]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Content: [Left], [Right]"] = "", -- HedgeEditor
+--      ["Change detonation timer: Tap the [Clock]"] = "", -- Basic_Training_-_Grenade, A_Classic_Fairytale:shadow
 --      ["Change direction: [Left]/[Right]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Change Health: [Left], [Right]"] = "", -- HedgeEditor
@@ -340,6 +341,8 @@
 --      ["Chicken"] = "", -- 
 --      ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01
 --      ["Chikorita"] = "", -- 
+--      ["Choose location: Left click"] = "", -- A_Classic_Fairytale:shadow
+--      ["Choose location: Tap the [Target] button, then tap on the spot you want to choose"] = "", -- A_Classic_Fairytale:shadow
 --      ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Choose your continent wisely, as your decision will be permanent."] = "", -- Continental_supplies
       ["Choose your side! If you want to join the strange man, walk up to him.|Otherwise, walk away from him. If you decide to att...nevermind..."] = "Choisis ton côté ! Si tu veux rejoindre l'étranger, marche vers lui. |Dans le cas contraire, éloigne toi de lui. Si tu décide de l'att...non laisse tomber...",
@@ -348,7 +351,6 @@
       ["Cleaver"] = "Couperet", -- Construction_Mode
 --      ["CLEAVER PLACEMENT MODE"] = "", -- HedgeEditor
       ["Cleaver Placement Mode"] = "Mode de placement de couperet", -- Construction_Mode
-      ["Climber"] = "Escaladeur", -- ClimbHome
 --      ["Climb Home"] = "", -- ClimbHome
 --      ["Closing in"] = "", -- A_Classic_Fairytale:queen
 --      ["Clown"] = "", -- HedgeEditor
@@ -358,11 +360,13 @@
       ["Cluster Bomb Training"] = "Entrainement à la bombe à fragmentation", -- Basic_Training_-_Cluster_Bomb
       ["Collateral Damage"] = "Dommages collatéraux",
       ["Collateral Damage II"] = "Dommages collatéraux II",
+--      ["- Collect all the blue crates"] = "", -- HedgeEditor
 	  ["Collect all the crates, but remember, our time in this life is limited!"] = "Collecte toutes les caisses mais souviens toi, notre temps dans cette vie est limité !",
       ["Collect or destroy all the health crates."] = "Récupère ou détruit toutes les caisses de soin", -- User_Mission_-_RCPlane_Challenge
 --      ["Collect or destroy the final crate to finish the training."] = "", -- Basic_Training_-_Flying_Saucer
+--      ["- Collect the blue crate"] = "", -- HedgeEditor
 --      ["Collect the crate and attack!"] = "", -- WxW
-	  ["Collect the crate on the right.|Hint: Select the rope, [Up] or [Down] to aim, [Space] to fire, directional keys to move.|Ropes can be fired again in the air!"] = "Collecte les caisses à droite. |Astuce : sélectionne le grappin, [haut] ou [bas] pour viser, flèches directionnelles pour bouger. |Le grappin peut etre relancé en plein vol !",
+--      ["Collect the crate on the right."] = "", -- A_Classic_Fairytale:first_blood
 	  ["Collect the crates within the time limit!|If you fail, you'll have to try again."] = "Collecte les caisses dans le temps imparti ! |Si tu rates, tu devras réessayer.",
 --      ["Collect the first crate to begin!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Collect the freezer and get the device part from Thanta."] = "", -- A_Space_Adventure:ice01
@@ -430,7 +434,6 @@
       ["Crates Left:"] = "Caisses restantes:", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates per turn: %d"] = "", -- WxW
---      ["crate(s)"] = "", -- SpeedShoppa
 --      ["Crazy Gravity: Gravity randomly changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity
 --      ["Crazy Runner"] = "", -- A_Space_Adventure:moon02
 --      ["Cricket Time"] = "", -- Continental_supplies
@@ -463,10 +466,9 @@
 --      ["Deals 15 damage to all enemies in the circle."] = "", -- Continental_supplies
 --      ["Deer"] = "", -- 
 --      ["Defeat all enemies!"] = "", -- portal
+--      ["Defeat!"] = "", -- HedgeEditor
 --      ["Defeat Professor Hogevil!"] = "", -- A_Space_Adventure:death01
---      ["Defeat the cannibals"] = "", -- A_Classic_Fairytale:backstab
-      ["Defeat the cannibals!|"] = "Décime les cannibales",
---      ["Defeat the cannibals!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
+--      ["Defeat the cannibals!"] = "", -- A_Classic_Fairytale:shadow
       ["Defeat the cannibals!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "Bat les cannibales ! |Astuce Grenade : règles le compte à rebour avec [1-5], vises avec [haut]/[bas] et maintiens [Espace] pour la puissance",
       ["Defeat the cyborgs!"] = "Bats les cyborgs !",
 --      ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen
@@ -489,11 +491,11 @@
 --      ["Destroyer of planes"] = "", -- User_Mission_-_RCPlane_Challenge
       ["Destroy him, Leaks A Lot! He is responsible for the deaths of many of us!"] = "Détruis-le, Grosse Fuite ! Il est responsable de la mort de beaucoup des notres !",
 --      ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion
+--      ["- Destroy the enemy"] = "", -- HedgeEditor
+--      ["- Destroy the red target"] = "", -- HedgeEditor
+--      ["- Destroy the red targets"] = "", -- HedgeEditor
 --      ["Destroy the targets!"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
-	  ["Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."] = "Détruis les cibles ! |Astuce : sélectionne le Shoryuken et appuyez sur [Espace] |P.S. vous pouvez l'utilisez en plein vol",
-	  ["Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"] = "Détruis les cibles ! |Astuce : [haut], [bas] pour viser, [Espace] pour tirer",
 --      ["+%d flamer fuel!"] = "", -- Tumbler
---      ["%d Hapless Hogs left"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["+%d health"] = "", -- Mutant
 --      ["%d-Hit Combo! +%d points!"] = "", -- Space_Invasion
       ["Did anyone follow you?"] = "As-tu été suivi ? ",
@@ -514,7 +516,6 @@
 --      ["Disguise as a Rockhopper Penguin"] = "", -- Continental_supplies
 --      ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies
 --      ["Displacer"] = "", -- 
---      ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Diver"] = "", -- User_Mission_-_Diver
 --      ["%d ms"] = "", -- HedgeEditor
 --      ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen
@@ -601,10 +602,8 @@
 --      ["Elderbot"] = "",
 --      ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape
       ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Éliminez toutes les cibles avant d'être à cours de temps.|Vos munitions sont illimitées pour cette mission.", --Bazooka, Shotgun, SniperRifle
---      ["Eliminate the Blue Team before the time runs out."] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Eliminate the enemy before the time runs out."] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree
       ["Eliminate the enemy hogs to win."] = "Eliminez les hérissons ennemis pour gagner",
-      ["Eliminate the enemy specialists."] = "Eliminez les spécialists ennemis",
 --      ["Eliminate the enemy."] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh
 --      ["Eliminate Unit 3378."] = "", -- User_Mission_-_Teamwork
 --      ["Eliminate WatchBot 4000."] = "", -- User_Mission_-_Teamwork_2
@@ -629,13 +628,14 @@
       ["Exactly, man! That was my dream."] = "Exactement, mec ! C'était mon rêve.",
 --      ["Except me, of course! I just saved a whole planet!"] = "", -- A_Space_Adventure:final
 --      ["Experienced beginner"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Explore the tunnel with the other hedgehogs and search for the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Explore the tunnel with the other hedgehogs and search for the device."] = "", -- A_Space_Adventure:fruit02
 --      ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02
       ["Eye Chewer"] = "Mâcheur d'oeil",
 --      ["Fair Wind"] = "", -- 
 --      ["Fall Damage"] = "", -- Basic_Training_-_Movement
 --      ["Fallen Angel"] = "", -- Tentacle_Terror
       ["Family Reunion"] = "Réunion de famille ",
+--      ["Fastest escape: %d turns"] = "", -- A_Space_Adventure:desert02
 --      ["Fastest lap: %.3fs by %s"] = "", -- TrophyRace
       ["Fastest lap: "] = "Meilleur tour : ",
       ["Feeble Resistance"] = "Résistance Futile",
@@ -655,11 +655,12 @@
 --      ["Final result"] = "", -- Mutant
 --      ["Final Targets"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
 --      ["Final team scores:"] = "", -- Space_Invasion
+--      ["Find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Find a way to detonate all the explosives and stay alive!"] = "", -- A_Space_Adventure:final
       ["Find your tribe!|Cross the lake!"] = "Trouve ta tribue ! |Traverse le lac !",
 --      ["Finish this challenge as fast as possible to earn bonus points."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Finish waypoint placement"] = "", -- Racer
-      ["Finish your training|Hint: Animations can be skipped with the [Precise] key."] = "Finis ton entraînement ! |Astuce : Les animations peuvent être passées en appuyant sur la touche [Precise]",
+--      ["Finish your training."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Finite Ropes"] = "", -- Basic_Training_-_Rope
 --      ["Fire a mine: [Does what it says ~ Çant be dropped close to an enemy ~ 1 sec]"] = "", -- Continental_supplies
 --      ["Fire a rocket with napalm."] = "", -- Continental_supplies
@@ -688,6 +689,7 @@
 --      ["Flying Saucer Training"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Fly into space to fight off the invaders with barrels!"] = "", -- Space_Invasion
 --      ["Fly to the meteorite and detonate the explosives"] = "", -- A_Space_Adventure:cosmos
+--      ["Follow the path and destroy the next target."] = "", -- Basic_Training_-_Rope
 --      ["Forgetfulness: You will lose all your weapons each turn."] = "", -- Continental_supplies
 --      ["For the next crate, you have to do back jumps."] = "", -- Basic_Training_-_Movement
 --      ["Four Eyes"] = "", -- 
@@ -707,8 +709,6 @@
 --      ["“g=150”, where 150 is 150% of normal gravity."] = "", -- Gravity
 --      ["“g=50, g2=150, period=4000” for gravity changing|from 50 to 150 and back with period of 4000 ms."] = "", -- Gravity
 --      ["Galaxy Guardians"] = "", -- Big_Armory
---      ["Game Modifiers: "] = "",
-      ["GAME OVER!"] = "Fin du jeu ! ",
 --      ["Game over!"] = "", -- Space_Invasion
       ["Game Started!"] = "Début du jeu ! ",
       ["Game? Was this a game to you?!"] = "Jeu ? Etait-ce un jeu pour vous ?!",
@@ -718,8 +718,6 @@
 --      ["Gasp! A smuggler!"] = "", -- A_Space_Adventure:desert01
 --      ["Gasp!"] = "", -- A_Space_Adventure:desert01
 --      ["Gathering fruits all day long."] = "", -- A_Classic_Fairytale:queen
---      ["Gear information hidden"] = "", -- HedgeEditor
---      ["Gear information shown"] = "", -- HedgeEditor
 --      ["Gear Placement Tool"] = "", -- HedgeEditor
 --      ["General information:"] = "", -- Continental_supplies
       ["General information"] = "Informations générales", -- Continental_supplies
@@ -729,7 +727,7 @@
       ["Get Dense Cloud out of the pit!"] = "Sortez Nuage Dense de la fosse",
 --      ["Get him, Spike!"] = "", -- A_Space_Adventure:desert01
       ["Get on over there and take him out!"] = "Viens par ici et débarrasse-toi de lui ! ",
-	  ["Get on the head of the mole"] = "Va sur la tête de la taupe",
+--      ["Get on the head of the mole."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Get past the flower."] = "", -- A_Classic_Fairytale:journey
 --      ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01
 	  ["Get that crate!"] = "Prends cette caisse",
@@ -768,7 +766,6 @@
       ["GO! GO! GO!"] = "Allez! Allez! Allez!",
       ["Good birdy......"] = "Gentil oiseau ...",
 --      ["Good bye!"] = "", -- Basic_Training_-_Flying_Saucer
-      ["Good Dude"] = "Bravo !", -- User_Mission_-_The_Great_Escape
       ["Good idea, they'll never find us there!"] = "Bonne idée, ils ne nous trouverons jamais là bas !",
 --      ["Good job!"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Good job! Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -779,7 +776,7 @@
       ["Good so far!"] = "Pas mal jusqu'ici!",
       ["Good to go!"] = "C'est pret!",
 --      ["Good! You now control Cappy."] = "", -- Basic_Training_-_Movement
-	  ["Go on top of the flower"] = "Atteins le dessus de la fleur",
+--      ["Go on top of the flower."] = "", -- A_Classic_Fairytale:first_blood
       ["Go, quick!"] = "Va ! Vite !",
       ["Gorkij"] = "Gorkij",
       ["Go surf!"] = "Va faire du surf", -- WxW
@@ -802,7 +799,6 @@
       ["Great! You will be contacted soon for assistance."] = "Super ! Tu seras bientot contacté pour de l'aide.",
 --      ["Green"] = "", -- 
 --      ["Green Bananas"] = "", -- A_Space_Adventure:fruit01
---      ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Green double rings also give you a new flying saucer."] = "", -- A_Space_Adventure:ice02
 --      ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01
 --      ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01
@@ -812,11 +808,8 @@
       ["Greetings, cloudy one!"] = "Salutation, le nuageux !",
 --      ["Greetings from the Navy, %s (%s), for being a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["Greetings, %s!"] = "", -- A_Classic_Fairytale:dragon
---      ["Greg"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
---      ["Grenade Group"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard
 --      ["Grenades explode after 1 to 5 seconds (you decide)."] = "", -- Basic_Training_-_Grenade
 --      ["Grenades with high bounciness bounce a lot and behave chaotic."] = "", -- Basic_Training_-_Grenade
---      ["Grenade Team"] = "", -- Basic_Training_-_Grenade
       ["Grenade Training"] = "Entrainement à la grenade", -- Basic_Training_-_Grenade
 --      ["Grenadiers"] = "", -- Basic_Training_-_Grenade
 --      ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor
@@ -857,7 +850,6 @@
 --      ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion
 --      ["Health Modification Mode"] = "", -- HedgeEditor
 --      ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor
---      ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
 --      ["Heavenly Defense"] = "", -- Tentacle_Terror
 --      ["Heavy Çannfantry"] = "",
 --      ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united
@@ -871,6 +863,7 @@
 --      ["Hedgehog Projectile"] = "", -- Continental_supplies
 --      ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies
 --      ["Hedgehogs can not be deleted."] = "", -- HedgeEditor
+--      ["Hedgehogs left: %d"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Hedgehogs will be revived after their death."] = "", -- Mutant
 --      ["Hedgehogs will start in the first waypoint."] = "", -- Racer
 --      ["Hedgibal Lecter"] = "",
@@ -886,7 +879,6 @@
 --      ["Help Enabled"] = "", -- HedgeEditor
 --      ["Helpers: Each team starts with %d helper points"] = "", -- Battalion
 --      ["Helpers: Hogs will get 1 out of 2 helpers randomly each turn"] = "", -- Battalion
---      ["Help Hog Solo to find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
       ["Help me, Leaks!"] = "Aide moi, Fuite !",
       ["Help me, please!!!"] = "Aide moi, s'il te plaît !!!",
       ["Help me, please!"] = "Aide moi, s'il te plaît !",
@@ -901,20 +893,20 @@
 --      ["Here you will find the current mission instructions."] = "", -- Basic_Training_-_Movement
 --      ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Heroic Wind"] = "", -- Continental_supplies
-      ["Hero Team"] = "Equipe de héros", -- User_Mission_-_The_Great_Escape
 	  ["He's so brave..."] = "Il est si courageux",
 --      ["He was the lab assistant of Dr. Goodhogan, the inventor of the anti-gravity device."] = "", -- A_Space_Adventure:moon02
       ["He won't be selling us out anymore!"] = "Il ne nous vendra plus !",
 --      ["Hey, don't forget us! We still need to climb up!"] = "", -- A_Classic_Fairytale:family
       ["Hey guys!"] = "Salut les gars !",
       ["Hey, guys!"] = "Salut les gars",
---      ["Hey, Hog Solo! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey! I was supposed to collect it!"] = "", -- A_Space_Adventure:fruit02
+--      ["Hey, %s! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey, %s! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos
       ["Hey! This is cheating!"] = "Hé ! C'est de la triche !",
 --      ["Hidden"] = "", -- portal
 --      ["High Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["High Jump: [Backspace]"] = "", -- Basic_Training_-_Movement
+--      ["High Jump: Tap the [Curvy Arrow] shortly"] = "", -- Basic_Training_-_Movement
 --      ["--- Highland ---"] = "", -- Battalion
 --      ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander
 --      ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion
@@ -925,20 +917,24 @@
 --      ["Hill Guard"] = "", -- Bazooka_Battlefield
 --      ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01
 --      ["--- Hint ---"] = "", -- Battalion
-      ["Hint: Double Jump - Press [Backspace] twice"] = "Astuce : Double saut - appuyez deux fois sur [retour arrière]",
+--      ["Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
 --      ["Hint: Drilling holes should solve everything."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: Hold down [M] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: If this mission panel disappears, you can|see it again by hitting the Pause or Quit key."] = "", -- Basic_Training_-_Movement
 --      ["Hint: It might be a good idea to place a girder before starting to drill. Just saying."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: It might be easier if you vary the angle only slightly."] = "", -- Basic_Training_-_Bazooka
+--      ["Hint: Just select the parachute, it opens automatically when you fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion
 --      ["Hint: Launch the bazooka horizontally at full power."] = "", -- Basic_Training_-_Bazooka
---      ["Hint: Press [Esc] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Pause the game to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Select the blow torch, aim and press [Fire]. Press [Fire] again to stop."] = "", -- A_Classic_Fairytale:journey
 --      ["Hint: Select the low gravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey
+--      ["Hint: Select the rope, [Up] or [Down] to aim, [Attack] to fire, directional keys to move."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Select the Shoryuken and hit [Attack].|P.S.: You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: %s needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family
 --      ["Hint: The rope only bends around objects.|When it doesn't hit anything, it's always straight."] = "", -- Basic_Training_-_Rope
 --      ["Hint: To jump higher, wait a bit before you hit “High Jump” a second time."] = "", -- Basic_Training_-_Movement
+--      ["Hint: To place a girder, select it,|then use [Left] and [Right] to select angle and length,|then choose a location for the girder."] = "", -- A_Classic_Fairytale:shadow
 --      ["Hint: Use the quit key to see the team’s continent."] = "", -- Continental_supplies
 --      ["Hint: When you shorten the rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope
 --      ["Hint: You might want to stay out of sight and take all the crates ..."] = "", -- A_Classic_Fairytale:journey
@@ -972,24 +968,11 @@
 --      ["Hogminator"] = "",
 --      ["Hog nueve"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog octo"] = "", -- A_Space_Adventure:fruit03
---      ["Hogonauts"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Hog onze"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog Saturn"] = "", -- A_Space_Adventure:fruit03
       ["Hogs in sight!"] = "Hogs en vue !", -- Continental_supplies
 --      ["Hog Solo and GB"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hog Solo"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01, A_Space_Adventure:moon02
---      ["Hog Solo couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo escaped successfully!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo has to reach the last crates"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo has to refuel his saucer."] = "", -- A_Space_Adventure:moon01
---      ["Hog Solo lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
---      ["Hog Solo wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["- Hogs will be revived"] = "", -- Capture_the_Flag
 --      ["- Hogs will drop the flag when killed"] = "", -- Capture_the_Flag
 --      ["Hog two"] = "", -- A_Space_Adventure:fruit03
@@ -999,9 +982,7 @@
       ["Homing Bee"] = "Abeille téléguidée", -- Construction_Mode
 --      ["Honda"] = "", -- 
 --      ["Honest Lee"] = "",
---      ["Hook"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
 --      ["Hooks"] = "", -- 
-      ["Hooray!"] = "Hourra ! ",
 --      ["Hooray! I actually did it! Hogera is safe!"] = "", -- A_Space_Adventure:final
 --      ["Hooray! I've found it, now I have to get back to Captain Lime!"] = "", -- A_Space_Adventure:fruit02
 --      ["Hooray! You are a champion!"] = "", -- A_Space_Adventure:ice02
@@ -1017,7 +998,7 @@
 --      ["However, if you fail to do so, she dies a most violent death, just like your friend! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
       ["However, if you fail to do so, she dies a most violent death! Muahahaha!"] = "Cependant, si tu échoues, elle aura une mort encore plus violente ! Muahahaha!",
       ["However, my mates don't agree with me on letting you go..."] = "Mes amis ne sont pas d'accord pour vous laisser partit ...",
---      ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
+--      ["However, the army of %s is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
 --      ["How to Rope"] = "", -- Basic_Training_-_Rope
 --      ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen
 --      ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen
@@ -1037,7 +1018,6 @@
       ["I can't believe what I'm hearing!"] = "Je ne peux pas croire ce que j'entends !",
 --      ["I can't let you go further because …"] = "", -- A_Classic_Fairytale:queen
       ["I can't wait any more, I have to save myself!"] = "Je ne peux plus attendre, je dois me sauver !",
---      ["Ice"] = "", -- Basic_Training_-_Movement
 --      ["Ice Jake"] = "", -- A_Space_Adventure:ice01
       ["I could just teleport myself there..."] = "Je pourrais juste me téléporter là-bas...",
 --      ["Icy Girder: [3]"] = "", -- HedgeEditor
@@ -1097,7 +1077,6 @@
       ["I just found out that they have captured your princess!"] = "Je viens de m'apercevoir qu'ils ont capturé ta princesse !",
 --      ["I just want the strange device you found!"] = "", -- A_Space_Adventure:ice01
       ["I just wonder where Ramon and Spiky disappeared..."] = "Je me demande seulement où Ramon et Spiky ont disparu",
---      ["Ikeda"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["I know and I'm terribly sorry!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know, my hero!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know that your resources are low due to the battle but I'll send two of my best hogs to assist you."] = "", -- A_Space_Adventure:fruit02
@@ -1125,6 +1104,7 @@
 --      ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen
       ["I'm not sure about that!"] = "Je n'en suis pas si sûr !",
 --      ["IMPORTANT: To see the mission panel again, hold the mission panel key."] = "", -- Basic_Training_-_Movement
+--      ["IMPORTANT: To see the mission panel again, pause the game."] = "", -- Basic_Training_-_Movement
 	  ["Impressive...you are still dry as the corpse of a hawk after a week in the desert..."] = "Impressionnant...tu es aussi sec que le cadavre d'un faucon après une semaine dans le désert...",
 --      ["%i ms"] = "", -- Gravity
 --      ["I'm so glad this is finally over!"] = "", -- A_Space_Adventure:final
@@ -1283,7 +1263,6 @@
 --      ["Kill the traitor, %s, or spare his life!"] = "", -- A_Classic_Fairytale:backstab
 --      ["--- King ---"] = "", -- Battalion
 --      ["King"] = "", -- Battalion
---      ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing
 --      ["--- King Mode ---"] = "", -- Battalion
 --      ["Knight"] = "", -- Battalion
 --      ["Knives"] = "", -- 
@@ -1302,7 +1281,7 @@
 --      ["Launch some bazookas to destroy the targets!"] = "", -- Basic_Training_-_Bazooka
 --      ["Leaderbot"] = "",
       ["Leader"] = "Chef",
---      ["Lead the Green Bananas to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
+--      ["Lead your allies to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
 --      ["Leaks A Lot"] = "",
       ["Leaks A Lot, depressed for killing his loved one, failed to save the village..."] = "Grosse Fuite, déprimé d'avoir tué l'élue de son coeur, échoua à sauver le village...",
       ["Leaks A Lot gave his life for his tribe! He should have survived!"] = "Grosse Fuite à donné sa vie pour sa tribu ! Il aurait dû survivre !",
@@ -1317,7 +1296,6 @@
 --      ["Left/right: Choose crate contents"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode
---      ["Left Tong"] = "", -- Bazooka_Battlefield
 --      ["Legs"] = "", -- 
 --      ["Less tools, more fun"] = "", -- Battalion
 --      ["Lestat"] = "", -- portal
@@ -1347,18 +1325,19 @@
 --      ["Lively Lifeguard"] = "",
 --      ["Lonely Cries"] = "", -- Continental_supplies
 --      ["Lonely Cries: [Rise the water if no hog is in the circle and deal 6 damage to all enemy hogs.]"] = "", -- Continental_supplies
-      ["Lonely Hog"] = "Hog tout seul", -- ClimbHome
 --      ["Long Jump: [Enter]"] = "", -- Basic_Training_-_Movement
+--      ["Long Jump: Tap the [Curvy Arrow] button for long"] = "", -- Basic_Training_-_Movement, A_Classic_Fairytale:first_blood
 --      ["Long Live The Queen"] = "", -- A_Classic_Fairytale:queen
 --      ["Look around: [Mouse movement]"] = "", -- Basic_Training_-_Movement
+--      ["Look around: [Tap or swipe on the screen]"] = "", -- Basic_Training_-_Movement
 --      ["Look, boss! There is the target!"] = "", -- A_Space_Adventure:moon01
       ["Look, I had no choice!"] = "Écoute, je n'avais pas le choix !",
       ["Look out! There's more of them!"] = "Regarde, il y en a encore plus !",
       ["Look out! We're surrounded by cannibals!"] = "Regarde ! Nous sommes entourés par les cannibales !",
       ["Looks like the whole world is falling apart!"] = "On dirait que le monde entier tombe en morceaux !",
+--      ["Look to the left and do a backwards jump towards the mushroom."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Loon"] = "", -- The_Specialists
 --      ["Loopy"] = "", -- 
---      ["Lord Evil"] = "", -- Tentacle_Terror
 --      ["Losing Condition: Destroy"] = "", -- HedgeEditor
 --      ["Low Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander
@@ -1378,7 +1357,6 @@
 --      ["Mario"] = "", -- 
 --      ["Mark gears for win/lose conditions"] = "", -- HedgeEditor
 --      ["Mark/unmark gear: [Left Click]"] = "", -- HedgeEditor
---      ["Mark"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
       ["- Massive weapon bonus on first turn"] = "- Gros bonus d'arme au premier tour !", -- Continental_supplies
 --      ["Max Citrus"] = "", -- A_Space_Adventure:fruit01
 --      ["Maybe you should try an easier map next time."] = "", -- Racer
@@ -1393,7 +1371,6 @@
 --      ["Mega kill!"] = "", -- Mutant
 --      ["Meiwes"] = "",
 --      ["mikade"] = "", -- 
---      ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer
 --      ["Mindy"] = "",
 --      ["Mine Deployer"] = "",
 --      ["Mine Placement Mode"] = "", -- Construction_Mode
@@ -1412,12 +1389,12 @@
 --      ["Minion"] = "", -- A_Space_Adventure:moon01
 --      ["Minions"] = "", -- A_Space_Adventure:moon01
 --      ["Mission failed!"] = "", -- Big_Armory
-      ["MISSION FAILED"] = "Mission échouée", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Mission failure in %d s"] = "", -- Big_Armory
+--      ["Mission"] = "", -- HedgeEditor
 --      ["Mission lost!"] = "", -- Basic_Training_-_Grenade
 --      ["Mission Panel"] = "", -- Basic_Training_-_Movement
 --      ["Mission panel: [M]"] = "", -- Basic_Training_-_Movement
-      ["MISSION SUCCESSFUL"] = "Mission réussie", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+--      ["Mission succeeded!"] = "", -- portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, SimpleMission, HedgeEditor
 --      ["Mission won!"] = "", -- Basic_Training_-_Grenade
 --      ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02
 --      ["Mixed %d"] = "", -- WxW
@@ -1433,7 +1410,6 @@
 --      ["Monster kill!"] = "", -- Mutant
 --      ["Monsters"] = "", -- 
 --      ["Mooney"] = "", -- 
-      ["More Natives"] = "Plus d'indigènes",
 --      ["Morris"] = "", -- 
 --      ["Most mines are not active."] = "", -- A_Space_Adventure:desert02
 --      ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01
@@ -1453,13 +1429,11 @@
 --      ["Nade Boy"] = "", -- Basic_Training_-_Grenade
 --      ["Nah, probably everyone was just stupid."] = "", -- A_Space_Adventure:final
 --      ["Name"] = "",
-      ["Nameless Heroes"] = "Héros sans noms",
 --      ["Nancy Screw"] = "",
 --      ["Napalm"] = "", -- Construction_Mode
 --      ["Napalm Rocket"] = "", -- Continental_supplies
 --      ["Napalm rocket: [Fire a bomb with napalm!]"] = "", -- Continental_supplies
 --      ["Naranja Jed"] = "", -- A_Space_Adventure:fruit01
-      ["Natives"] = "Indigènes",
 --      ["Naughty Ninja"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Near a PAotH base on the moon ..."] = "", -- A_Space_Adventure:moon01
 --      ["Near Secret Base 17 of PAotH in the rural Hogland ..."] = "", -- A_Space_Adventure:cosmos
@@ -1554,11 +1528,8 @@
 --      ["Oh, my! I forgot something!"] = "", -- A_Classic_Fairytale:queen
       ["Oh, my!"] = "Oh mon dieu !",
       ["Oh, my! This is even more entertaining than I've expected!"] = "Oh mon dieu ! C'est encore plus amusant que ce que je pensais !",
-      ["Oh no! Just try again!"] = "Eh non ! Essayez encore ! ", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Oh no, not %s!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
---      ["Oh no, the Green Bananas have betrayed Hog Solo and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
-      ["Oh no! Time's up! Just try again."] = "Eh non ! Temps écoulé ! Essayez encore ! ", --Bazooka, Shotgun, SniperRifle
---      ["Oh no! You failed! Just try again."] = "", -- Basic_Training_-_Cluster_Bomb
+--      ["Oh no, the companions have betrayed %s and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
 --      ["Oh no! You have died. Try again!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Oh! Please spare me. You can take all my treasures!"] = "", -- A_Space_Adventure:ice01
       ["Oh, silly me! I forgot that I'm the shaman."] = "Oh suis-je bête ! J'ai oublié que j'étais le shaman.",
@@ -1580,9 +1551,9 @@
 --      ["One shall not judge one by one's appearance!"] = "", -- A_Classic_Fairytale:epil
 	  ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "L'une des deux tribus était pacifique, passant son temps à chasser et à s'entraîner, appréciant les petits plaisirs de la vie",
 --      ["Oneye"] = "", -- portal
---      ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant
 --      ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant
+--      ["Only %s can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard
 --      ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01
@@ -1594,6 +1565,7 @@
 --      ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01
 --      ["Oops! You have selected the wrong hedgehog! Just try again."] = "", -- Basic_Training_-_Movement
 --      ["Open ammo menu: [Right click]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
+--      ["Open ammo menu: Tap the [Suitcase]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
 	  ["Open that crate and we will continue!"] = "Ouvre cette caisse et nous pourrons continuer",
       ["Opposing Team: "] = "Équipe opposée",
 --      ["Orange"] = "", -- 
@@ -1613,15 +1585,14 @@
 --      ["PAotH has sent explosives but unfortunately the trigger mechanism seems to be faulty!"] = "", -- A_Space_Adventure:cosmos
 --      ["Parachute"] = "", -- Continental_supplies
 --      ["Patches"] = "", -- 
---      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02
 --      ["Pause: [P]"] = "", -- Basic_Training_-_Movement
+--      ["Pause: Tap the [Pause] button"] = "", -- Basic_Training_-_Movement
 --      ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW
 --      ["Penguin Roar"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hog’s health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 	  ["Perfect! Now try to get the next crate without hurting yourself!"] = "Parfait, maintenant essaies d'avoir la prochaine caisse sans te blesser !",
-      ["Per-Hog Ammo"] = "Munitions par hérissons",
 --      ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh
 --      ["Personal best: %.3f seconds"] = "", -- A_Space_Adventure:ice02
 --      ["Per team weapons"] = "", -- Continental_supplies
@@ -1630,7 +1601,6 @@
 --      ["Physicist"] = "", -- HedgeEditor
 --      ["Piano Strike"] = "", -- Construction_Mode
 --      ["Pikachu"] = "", -- 
---      ["Pincer Knights"] = "", -- Bazooka_Battlefield
 --      ["Pings left: %d"] = "", -- Space_Invasion
 --      ["Pink"] = "", -- 
 --      ["Pirates"] = "", -- 
@@ -1683,8 +1653,6 @@
 --      ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion
 --      ["--- Points ---"] = "", -- Battalion
 --      ["--- Points Mode ---"] = "", -- Battalion
-      ["points"] = "points", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
---      ["point(s)"] = "", -- TargetPractice, Mutant
 --      ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02
 --      ["Poisonous, deals no damage."] = "", -- Continental_supplies
       ["Poison"] = "Poison",
@@ -1704,37 +1672,37 @@
 --      ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to fight"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos
-      ["Prepare yourself"] = "Prépare toi",
+--      ["Prepare yourself, %s!"] = "", -- The_Specialists
 --      ["Press [Attack] (space bar by default) to start,|repeadedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] (space bar by default) to start,|repeatedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] to begin."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Attack] to confirm."] = "", -- Continental_supplies
 --      ["Press [Attack] to select this continent!"] = "", -- Continental_supplies
 --      ["Press [Left] and [Right] to change the difficulty."] = "", -- A_Classic_Fairytale:first_blood
-	  ["Press [Left] or [Right] to move around, [Enter] to jump"] = "Appuyez [Gauche] ou [Droite] pour vous déplacer, [Entrée] pour sauter",
+--      ["Press [Left] or [Right] to move around, [Long Jump] to jump forwards."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW
 --      ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW
+--      ["Press [M] to see the mission texts"] = "", -- Basic_Training_-_Movement
       ["Press [Precise] to skip intro"] = "appuie sur [precise] pour passer l'intro",
 --      ["Press [Up] and [Down] to move between menu items.|Press [Attack], [Left], or [Right] to toggle."] = "", -- WxW
 --      ["Prestigious Pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Princess"] = "", -- A_Classic_Fairytale:family, A_Classic_Fairytale:journey
 --      ["Princess Peach"] = "", -- 
---      ["Private Nolak"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["Problems, dude? Chillax!"] = "", -- A_Classic_Fairytale:epil
 --      ["Professional pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professional stunt pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professor"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
 --      ["Professor Hogevil, then known as James Hogus, worked for PAotH back in my time."] = "", -- A_Space_Adventure:moon02
+--      ["Professor's Team"] = "", -- A_Space_Adventure:death01
 --      ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
---      ["Pro Killers"] = "", -- Big_Armory
 --      ["Protect the King: When the king dies, so does the team"] = "", -- Battalion
---      ["Protect yourselves!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
       ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "Protège toi ! |Astuce Grenade : Règle le compte à rebour avec [1-5], vise avec [haut]/[bas] et maintiens [Espace] pour la puissance",
 --      ["Purple"] = "", -- 
 --      ["Pyro"] = "", -- HedgeEditor, The_Specialists
 --      ["Pyromancer"] = "", -- Battalion
 --      ["Quit: [Esc]"] = "", -- Basic_Training_-_Movement
 --      ["Race complexity limit reached"] = "", -- Racer, TechRacer
+--      ["Race failed!"] = "", -- A_Space_Adventure:moon02
 --      ["Racer"] = "", -- Racer
 --      ["Racer tool"] = "", -- Racer
 --      ["Race"] = "", -- TrophyRace
@@ -1770,23 +1738,19 @@
 --      ["Replenishment: Weapons are restocked on turn start of a new hog"] = "", -- Highlander
 --      ["Repositioning Mode"] = "", -- HedgeEditor
 --      ["REPOSITIONING MODE"] = "", -- HedgeEditor
---      ["rescues"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Rescue the imprisoned PAotH team and get the fuel!"] = "", -- A_Space_Adventure:moon01
 --      ["Respawner"] = "", -- Construction_Mode
 --      ["Respawner: Resurrects dead hogs."] = "", -- Construction_Mode
 --      ["Resurrector"] = "", -- Construction_Mode
 --      ["Retract/Extend rope: [Up]/[Down]"] = "", -- Basic_Training_-_Rope
 --      ["- Return the enemy flag to your base to score"] = "", -- Capture_the_Flag
-      [" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = "Ramenez le drapeau ennemi dans votre base pour marquer | -La première équipe à 3 captures gagne | - Vous marquez uniquement si votre drapeau est dans votre base | - Les hérissons vont lâcher le drapeau s'ils sont tués ou noyés | - Les drapeaux lâchés peuvent être ramenés ou recapturés | - Les hérissons réapparaissent quand ils sont tués",
 --      ["Return to Leaks A Lot!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Return to the mission menu by pressing the \"Go back\" button."] = "", -- A_Space_Adventure:cosmos
 --      ["Return to the Surface"] = "", -- A_Space_Adventure:fruit02
 --      ["Return to the training menu by pressing the “Go back” button."] = "", -- Basic_Training_-_Movement
---      ["Rhombus"] = "", -- Basic_Training_-_Movement
 --      ["Rider"] = "", -- portal
 --      ["Rifleman"] = "", -- Battalion
 --      ["Righteous Beard"] = "Righteous Beard",
---      ["Right Tong"] = "", -- Bazooka_Battlefield
 --      ["Ripe"] = "", -- 
 --      ["Rise the water if nobody else is in the circle and deal 6 damage to all enemy hogs."] = "", -- Continental_supplies
 --      ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01
@@ -1795,8 +1759,8 @@
 --      ["Roof"] = "", -- WxW
 --      ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Rope Master"] = "", -- Basic_Training_-_Rope
---      ["Roper"] = "", -- SpeedShoppa
 --      ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
+--      ["Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Rope Team"] = "", -- Basic_Training_-_Rope
 --      ["Rope Training"] = "", -- Basic_Training_-_Rope
 --      ["Rope Weapons"] = "", -- Basic_Training_-_Rope
@@ -1810,7 +1774,6 @@
 --      ["Round limit:"] = "", -- TechRacer
 --      ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer
 --      ["Round's slowest lap: %.3fs by %s"] = "", -- TrophyRace
---      ["Rounds until Sudden Death: %d"] = "", -- Battalion
 --      ["RS1"] = "", -- A_Space_Adventure:fruit03
 --      ["RS2"] = "", -- A_Space_Adventure:fruit03
 --      ["Rubber"] = "", -- Construction_Mode, HedgeEditor
@@ -1836,10 +1799,17 @@
       ["Salvation was one step closer now..."] = "Le salut était tout proche...",
 --      ["Sam"] = "", -- A_Space_Adventure:cosmos
 --      ["Sandals?! I thought you left your ring!"] = "", -- A_Classic_Fairytale:queen
+--      ["%s and GB"] = "", -- A_Space_Adventure:fruit02
 --      ["%s and %s enter the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sandstorm"] = "", -- A_Space_Adventure:desert01
 --      ["Sandy"] = "", -- A_Space_Adventure:desert01
---      ["Save as many hapless hogs as possible!"] = "",
+--      ["%s arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
+--      ["Save as many hogs as possible!"] = "", -- User_Mission_-_That_Sinking_Feeling
       ["Save Fell From Heaven!"] = "Sauve Tombée de l'Enfer ! ",
 --      ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow
 --      ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor
@@ -1851,9 +1821,9 @@
 --      ["Scallywag"] = "", -- 
 --      ["Scalp Muncher"] = "",
 --      ["Scenario"] = "", -- Big_Armory, portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape
---      ["Scenario failed!"] = "", -- SimpleMission
 --      ["Scientist"] = "", -- Battalion
 --      ["%s climbed home in %d seconds!"] = "", -- ClimbHome
+--      ["%s (contd.)"] = "", -- A_Classic_Fairytale:epil
 --      ["Score: %d"] = "", -- Space_Invasion
 --      ["Score goal: %d"] = "", -- Control
 --      ["Score graph"] = "", -- Mutant, Space_Invasion
@@ -1863,6 +1833,7 @@
 --      ["Scores"] = "", -- Mutant
 --      ["Scores:"] = "", -- Mutant
 --      ["Scoring: "] = "", -- Mutant
+--      ["%s couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
 --      ["Script parameter examples:"] = "", -- Gravity
 --      ["%s (+%d)"] = "", -- Battalion
 --      ["%s: %d"] = "", -- Capture_the_Flag, Control
@@ -1875,10 +1846,9 @@
 --      ["%s died … and lives again!"] = "", -- Construction_Mode
 --      ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome
 --      ["%s, %d sec"] = "", -- Continental_supplies
---      ["Search for the device with the help of the other hedgehogs "] = "", -- A_Space_Adventure:fruit02
+--      ["Search for the device with the help of the other hedgehogs."] = "", -- A_Space_Adventure:fruit02
 --      ["Searching in the dust"] = "", -- A_Space_Adventure:desert01
 --      ["Searching the stars!"] = "", -- A_Space_Adventure:cosmos
---      ["seconds"] = "", -- ClimbHome
 --      ["Seduction"] = "", -- Continental_supplies
 --      ["Seems like every time you take a \"walk\", the enemy finds us!"] = "", -- A_Classic_Fairytale:backstab
 	  ["See that crate farther on the right?"] = "Tu vois cette caisse plus loin sur la droite ? ",
@@ -1905,6 +1875,7 @@
 --      ["Select your continent with [Up]/[Down] or by selecting a representative weapon."] = "", -- Continental_supplies
 --      ["%s enters the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sergey"] = "", -- 
+--      ["%s escaped successfully!"] = "", -- A_Space_Adventure:fruit01
 --      ["Set bounciness: [Left Shift] + [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set detonation timer: [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set Health: [Left Click]"] = "", -- HedgeEditor
@@ -1928,10 +1899,12 @@
 --      ["%s has been killed before taking enough damage first."] = "", -- SimpleMission
 --      ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has been rescued from death"] = "", -- Construction_Mode
+--      ["%s has dropped the flag!"] = "", -- CTF_Blizzard
 --      ["%s has fallen victim to gravity."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has mutated! +2 points"] = "", -- Mutant
 --      ["%s has passed the best height of %s!"] = "", -- ClimbHome
 --      ["%s has scored!"] = "", -- Capture_the_Flag
+--      ["%s has to refuel the saucer."] = "", -- A_Space_Adventure:moon01
 --      ["%s hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil
 --      ["sheepluva"] = "", -- 
@@ -1948,8 +1921,6 @@
 --      ["Shinobi"] = "", -- 
 --      ["%s hit the ground."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Shoppa Love"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
---      ["Shoppa Union"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes, Challenge_-_Speed_Shoppa_-_ShoppaKing
---      ["Shoppers"] = "", -- SpeedShoppa
 --      ["Shotgun"] = "", -- Continental_supplies
 --      ["Sigh."] = "", -- A_Classic_Fairytale:epil
 --      ["Silly"] = "",
@@ -1962,11 +1933,11 @@
 --      ["%s is now as poor as a church mouse"] = "", -- Construction_Mode
 --      ["%s is now a zombie hedgehog"] = "", -- Construction_Mode
 --      ["%s is suddenly low on ammo"] = "", -- Construction_Mode
---      ["Skip your turn to try again."] = "", -- Basic_Training_-_Rope
 --      ["Skulls"] = "", -- Bazooka_Battlefield
 --      ["Slimer"] = "", -- 
       ["Slippery"] = "Glissant",
 --      ["%s lost all the weapons"] = "", -- Construction_Mode
+--      ["%s lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
 --      ["Slot %d: %s"] = "", -- Frenzy
 --      ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy
 --      ["Slowpoke"] = "", -- 
@@ -1980,6 +1951,7 @@
 --      ["Smith 0.99f"] = "",
 --      ["Smith 1.0"] = "",
 --      ["Smugglers"] = "", -- A_Space_Adventure:desert01
+--      ["%s must collect the final crates."] = "", -- A_Space_Adventure:fruit02
 --      ["%s must skip this turn for rule violation."] = "", -- WxW
 --      ["Sneaks"] = "", -- Bazooka_Battlefield
 --      ["%s never got the ninja diploma."] = "", -- ClimbHome
@@ -1988,10 +1960,8 @@
 --      ["Sniper"] = "", -- HedgeEditor, The_Specialists
 --      ["Sniper Rifle"] = "", -- Continental_supplies
       ["Sniper Training"] = "Entraînement au fusil de sniper",
-      ["Sniperz"] = "Snipers",
 --      ["So, as promised I have brought you where I think that the device you are looking for is hidden."] = "", -- A_Space_Adventure:fruit02
 --      ["So far, you had infinite ropes, but in the|real world, ropes are usually limited."] = "", -- Basic_Training_-_Rope
---      ["So Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos
 	  ["So humiliating..."] = "Si humiliant...",
 --      ["So, I believe that it's a good place to start."] = "", -- A_Space_Adventure:desert01
 --      ["So, I kindly ask for your help."] = "", -- A_Space_Adventure:fruit01
@@ -2001,11 +1971,12 @@
 --      ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03
 --      ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen
 --      ["Some weapons can be dropped from the rope."] = "", -- Basic_Training_-_Rope
---      ["Somewhere else on the planet of fruits, Captain Lime helps Hog Solo"] = "", -- A_Space_Adventure:fruit02
---      ["Somewhere else on the planet of fruits Hog Solo gets closer to the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, Captain Lime helps %s"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, %s gets closer to the device"] = "", -- A_Space_Adventure:fruit02
 --      ["Somewhere on the Planet of Fruits a terrible war is about to begin ..."] = "", -- A_Space_Adventure:fruit01
 --      ["Somewhere on the uninhabitable Death Planet ..."] = "", -- A_Space_Adventure:death01
 --      ["So, now I got the last part and I have your friends captured."] = "", -- A_Space_Adventure:death01
+--      ["So, %s, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So the princess was never heard of again ..."] = "", -- A_Classic_Fairytale:family
 --      ["So, uhmm, how did you manage to teleport them so far?"] = "", -- A_Classic_Fairytale:epil
 --      ["Sour"] = "", -- 
@@ -2106,8 +2077,6 @@
 --      ["Structure Placement Mode"] = "", -- Construction_Mode
 --      ["Structure Placer"] = "", -- Construction_Mode
 --      ["Stupid, stupid Hogerians!"] = "", -- A_Space_Adventure:final
---      ["Subject 1"] = "", -- portal
---      ["Subjects"] = "", -- portal
 --      ["Subtract %d"] = "", -- HedgeEditor
 --      ["--- Sudden Death ---"] = "", -- Battalion
 --      ["Summer Squash"] = "", -- A_Space_Adventure:fruit01
@@ -2124,7 +2093,7 @@
 --      ["Surfer! +15 points!"] = "", -- Space_Invasion
 --      ["Surfer!"] = "", -- WxW
 --      ["Surprise supplies: Get 1-3 random weapons each turn."] = "", -- Continental_supplies
-      ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "Survis ! Les cinématique peuvent être passées avec la touche [Precise]. ",
+--      ["Survive!"] = "", -- A_Classic_Fairytale:shadow
 --      ["%s violated the “All But Last” rule and will be penalized."] = "", -- WxW
 --      ["%s violated the “Kill The Leader” rule and will be penalized."] = "", -- WxW
 --      ["Swap place with a random enemy in the circle."] = "", -- Continental_supplies
@@ -2143,6 +2112,7 @@
 --      ["%s! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
 	  ["Swing, Leaks A Lot, on the wings of the wind!"] = "Balance toi Grosse Fuite, sur les ailes du vent",
 --      ["Swing: [Left]/[Right]"] = "", -- Basic_Training_-_Rope
+--      ["%s wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome
 --      ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer
 --      ["switch"] = "", -- Continental_supplies
@@ -2156,6 +2126,7 @@
 --      ["Switch Hog"] = "", -- Construction_Mode
 --      ["Switch: Select weapon special"] = "", -- Continental_supplies
 --      ["Switch: Toggle crate radar"] = "", -- WxW
+--      ["%s won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Swords"] = "", -- Bazooka_Battlefield
 --      ["Syntax Errol"] = "",
 --      ["%s, you may choose the rules."] = "", -- WxW
@@ -2164,6 +2135,8 @@
 --      ["Tails"] = "", -- 
       ["Talk about mixed signals..."] = "Parlons des signaux mélangés",
 --      ["Tall Potato"] = "", -- A_Space_Adventure:fruit01
+--      ["Tap [Pause] to see the mission texts"] = "", -- Basic_Training_-_Movement
+--      ["Tap the “rotating arrow” button on the left|until you have selected Cappy, the hedgehog with the cap!"] = "", -- Basic_Training_-_Movement
 --      ["Target"] = "", -- HedgeEditor
 --      ["Target Placement Mode"] = "", -- Construction_Mode
 --      ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor
@@ -2179,15 +2152,18 @@
 --      ["Tatters"] = "", -- 
       ["Team %d: "] = "Équipe %d : ",
 --      ["Team %d"] = "", -- SimpleMission
+--      ["Team highscore: %d"] = "", -- Utils
 --      ["Team Identity Mode"] = "", -- HedgeEditor
 --      ["TEAM IDENTITY MODE"] = "", -- HedgeEditor
---      ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
+--      ["Team lowscore: %d"] = "", -- Utils
 --      ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion
+--      ["Team's best time: %.3fs"] = "", -- Utils
 --      ["Team Scores:"] = "", -- Control
 --      ["Team scores:"] = "", -- Space_Invasion
+--      ["Team's longest time: %.3fs"] = "", -- Utils
+--      ["Team's top accuracy: %d%"] = "", -- Utils
 --      ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2
 --      ["Teamwork"] = "", -- User_Mission_-_Teamwork
---      ["Team Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
 --      ["TechRacer"] = "", -- TechRacer
 --      ["Teleporation Node"] = "", -- Construction_Mode
 --      ["Teleportation Mode"] = "", -- Construction_Mode
@@ -2279,11 +2255,12 @@
 --      ["The forgotten continent"] = "", -- Continental_supplies
 	  ["The giant umbrella from the last crate should help break the fall."] = "La toile géante de la dernière caisse devrait aider à arrêter la chute.",
 --      ["The Great Escape"] = "", -- User_Mission_-_The_Great_Escape
---      ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01
+--      ["- The green target must survive"] = "", -- HedgeEditor
+--      ["- The green targets must survive"] = "", -- HedgeEditor
       ["The guardian"] = "Le gardien",
 --      ["The hardships of the war turned %s (%s) into a killing machine: %d invaders destroyed in one round!"] = "", -- Space_Invasion
+--      ["The health of your current hedgehog|is shown at the top right corner."] = "", -- Basic_Training_-_Movement
 --      ["The hedgehog with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant
---      ["The Hogies"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["The Hospital"] = "", -- 
       ["The Individualist"] = "L'individualiste",
       ["Their buildings were very primitive back then, even for an uncivilised island."] = "Leurs bâtiments étaient très primitif à l'époque, même pour une ile non civilisée.",
@@ -2301,7 +2278,6 @@
 --      ["The Mutant has super-weapons and a lot of health."] = "", -- Mutant
 --      ["The Mutant loses health quickly, but gains health by killing."] = "", -- Mutant
 --      ["The Mutant loses health quickly if he doesn't keep scoring kills."] = "", -- Mutant
-      ["The Nameless One"] = "Le sans nom",
 --      ["The Navy greets %s for managing to get in a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["The next 4 times you play the \"The last encounter\" mission you'll get 20 more hit points and a laser sight."] = "", -- A_Space_Adventure:death02
 --      ["The next crate is an utility crate."] = "", -- Basic_Training_-_Movement
@@ -2315,6 +2291,7 @@
 --      ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil
 --      ["The oppression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
 --      ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
+--      ["The other hog has died, he should have survived!"] = "", -- A_Space_Adventure:moon02
 	  ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "L'autre était une tribu de cannibales, ils passaient leur temps à manger les organes d'autres hérissons...",
 --      ["The Police"] = "", -- 
 --      ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -2339,7 +2316,7 @@
       ["The Showdown"] = "La confrontation",
 	  ["The Slaughter"] = "Le massacre",
 --      ["The Society of Perfectionists greets %s (%s): No misses and %d hits in its best round."] = "", -- Space_Invasion
---      ["THE SPECIALISTS"] = "",
+--      ["The Specialists: Each hedgehog starts with its own weapon set"] = "", -- The_Specialists
 --      ["The spinning arrows above your hedgehog show|which hedgehog is selected right now."] = "", -- Basic_Training_-_Movement
       ["The spirits of the ancerstors are surely pleased, Leaks A Lot."] = "Les esprits des ancêtres sont sûrement ravis, Grosse Fuite.",
 --      ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
@@ -2388,7 +2365,6 @@
 --      ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["This also increases the effectiveness of Medicine."] = "", -- Continental_supplies
 --      ["This game wasn’t really exciting."] = "", -- Space_Invasion
---      ["This Hog Solo is so naive! When he returns I'll shoot him and keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This is a new personal best, congratulations!"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert02, A_Space_Adventure:fruit03
 --      ["This is a new personal best time, congratulations!"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["This is Cappy."] = "", -- Basic_Training_-_Movement
@@ -2406,6 +2382,7 @@
       ["This rain is really something..."] = "Cette pluie, c'est vraiment quelque chose !",
 --      ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome
 --      ["This seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01
+--      ["This %s is so naive! I'm going to shoot this fool so I can keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This was an awesome performance! But this challenge can be finished with even just one RC plane. Can you figure out how?"] = "", -- User_Mission_-_RCPlane_Challenge
       ["This will be fun!"] = "Ce sera amusant !",
 --      ["This will be useful when I need a new platform or if I want to rise."] = "", -- portal
@@ -2446,11 +2423,11 @@
 --      ["To begin with the training, hit the attack key!"] = "", -- Basic_Training_-_Movement
 --      ["To begin with the training, select the bazooka from the ammo menu!"] = "", -- Basic_Training_-_Bazooka
 --      ["To begin with the training, select the grenade from the ammo menu!"] = "", -- Basic_Training_-_Grenade
+--      ["To begin with the training, tap the attack button!"] = "", -- Basic_Training_-_Movement
 --      ["To finish hedgehog selection, just do anything|with him, like walking."] = "", -- Basic_Training_-_Movement
 --      ["To get over the next obstacles, keep some distance from the wall before you back jump."] = "", -- Basic_Training_-_Movement
 --      ["To get over the water, you have to do multiple|rope shots and swings."] = "", -- Basic_Training_-_Rope
 --      ["Toggle Editing Weapons and Tools: [Precise]+[2]"] = "", -- HedgeEditor
---      ["Toggle Gear Information: [Precise]+[3]"] = "", -- HedgeEditor
 --      ["Toggle Help: [Precise]+[1]"] = "", -- HedgeEditor
 --      ["Toggle Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Toggle Shield: [Long jump]"] = "", -- Space_Invasion
@@ -2460,14 +2437,14 @@
 --      ["Too bad! Then you should really leave!"] = "", -- A_Space_Adventure:fruit01
 --      ["Too slow! Try again ..."] = "", -- A_Space_Adventure:moon02
 --      ["Top-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge
-      ["To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"] = "Pour placer une poutre, sélectionne-la, et utilise [gauche] et [droite] pour choisir l'angle et la taille, ensuite place la avec [Clic gauche]",
 --      ["To reach higher ground, walk to a ledge, look to the left, then do a back jump."] = "", -- Basic_Training_-_Movement
       ["Torn Muscle"] = "Muscle déchiré",
       ["To the caves..."] = "Aux cavernes...",
 --      ["Touch all waypoints as fast as you can!"] = "", -- Racer
---      ["To win the game, Hog Solo has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
+--      ["- Touch the sparkles near your base to teleport"] = "", -- CTF_Blizzard
+--      ["To win the game, %s has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
 --      ["To win the game you had to collect the 2 crates with no specific order."] = "", -- A_Space_Adventure:desert01
---      ["To win the game you have to eliminate all your enemies."] = "", -- A_Space_Adventure:death01
+--      ["To win the game you have to eliminate Professor Hogevil."] = "", -- A_Space_Adventure:death01
 --      ["To win the game you have to find the right crate."] = "", -- A_Space_Adventure:desert01
 --      ["To win the game you have to go next to Thanta."] = "", -- A_Space_Adventure:ice01
 --      ["To win the game you have to go to the surface."] = "", -- A_Space_Adventure:desert02
@@ -2475,13 +2452,10 @@
 --      ["To win the game you have to stand next to Thanta."] = "", -- A_Space_Adventure:ice01
       ["Toxic Team"] = "Équipe toxique", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Track completed!"] = "", -- Racer, TechRacer
---      ["Trainee"] = "", -- TargetPractice
 --      ["Training"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Training complete!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Training Team"] = "", -- TargetPractice
 --      ["Traitors don't get to shout around here!"] = "", -- A_Classic_Fairytale:epil
       ["Traitors"] = "Traîtres",
---      ["Trapped"] = "", -- Basic_Training_-_Movement
 --      ["Trapper"] = "", -- HedgeEditor
 --      ["Travel carefully as your fuel is limited"] = "", -- A_Space_Adventure:cosmos
 --      ["Travel to all the neighbor planets and collect all the pieces"] = "", -- A_Space_Adventure:cosmos
@@ -2498,7 +2472,6 @@
 --      ["Try to land softly, as you can still take fall damage!"] = "", -- Basic_Training_-_Flying_Saucer
       ["Try to protect the chief! You won't lose if he dies, but it is advised that he survives."] = "Essaie de protéger le chef ! Tu ne perdras pas s'il meurt, mais il serait avisé qu'il survive",
 --      ["Try to reach and destroy the next target quickly."] = "", -- Basic_Training_-_Rope
---      ["T_T"] = "",
 --      ["Tumbler"] = "", -- Tumbler
 --      ["Turn around: [Left Shift] + [Left]/[Right]"] = "", -- Basic_Training_-_Movement
 --      ["Turning Around"] = "", -- Basic_Training_-_Movement
@@ -2517,7 +2490,6 @@
       ["Uhmm...ok no."] = "Humm... ok non.",
 --      ["Ukemi"] = "", -- 
 --      ["Ultra kill!"] = "", -- Mutant
---      ["Ultrasoldier"] = "", -- Big_Armory
 --      ["unC0Rr"] = "", -- 
       ["Under Construction"] = "En construction",
 --      ["Under normal circumstances we could easily defeat them but we have kindly sent most of our men to the Kingdom of Sand to help with the annual dusting of the king's palace."] = "", -- A_Space_Adventure:fruit01
@@ -2542,7 +2514,6 @@
       ["United We Stand"] = "Nous restons unis",
 --      ["Unlike bazookas, grenades are not influenced by wind."] = "", -- Basic_Training_-_Grenade
 --      ["Unlimited Attacks: Attacks don't end your turn"] = "", -- User_Mission_-_Diver, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree
-      ["Unlimited Attacks"] = "Attaques illimitées",
 --      ["Unlucky Sods"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Unstoppable!"] = "",
 --      ["Unsuspecting Louts"] = "", -- User_Mission_-_Rope_Knock_Challenge
@@ -2557,13 +2528,14 @@
       ["Use it with precaution!"] = "À utiliser avec précaution",
 --      ["User Challenge"] = "",
 --      ["!"] = "", -- User_Mission_-_Dangerous_Ducklings
+--      ["User Mission"] = "", -- HedgeEditor
 --      ["Use the attack key twice to change the flying saucer while being in air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the attack key twice to change the flying saucer while floating in mid-air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the bazooka and the flying saucer to get the freezer."] = "", -- A_Space_Adventure:ice01
 --      ["Use the flying saucer from the crate to fly to the moon."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly the other planets."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly to the other planets."] = "", -- A_Space_Adventure:cosmos
-	  ["Use the parachute ([Space] while in air) to get the next crate"] = "Utilisez le parachute ([Espace] en vol) pour atteindre la prochaine caisse ",
+--      ["Use the parachute to get the next crate."] = "", -- A_Classic_Fairytale:first_blood
       ["Use the portal gun to get to the next crate, then use the new gun to get to the final destination!|"] = "Utilisez le fusil à portail pour atteindre la prochaine caisse, puis utilisez le nouveau fusil pour atteindre la destination finale",
 --      ["Use the RC plane and destroy the all the targets."] = "", -- A_Space_Adventure:desert03
 --      ["Use the rope in order to catch the blue hedgehog"] = "", -- A_Space_Adventure:moon02
@@ -2597,7 +2569,6 @@
 --      ["Victory Condition: Collect"] = "", -- HedgeEditor
 --      ["Victory Condition: Destroy"] = "", -- HedgeEditor
 --      ["Victory for %s!"] = "", -- Capture_the_Flag
-      ["Victory for the "] = "Victoire pour ", -- CTF_Blizzard, Çapture_the_Flag
 	  ["Violence is not the answer to your problems!"] = "La violence n'est pas la réponse à tes problèmes !",
 --      ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos
 --      ["Vladimir"] = "", -- 
@@ -2616,9 +2587,6 @@
 --      ["Walls left: %d"] = "", -- WxW
 --      ["Wall to wall"] = "", -- WxW
 --      ["Waluigi"] = "", -- 
---      ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Wannabe Ropers"] = "", -- Basic_Training_-_Rope
---      ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Wario"] = "", -- 
 --      ["Warming Up"] = "", -- Basic_Training_-_Grenade
 --      ["Warning: Fire cake detected"] = "", -- ClimbHome
@@ -2647,7 +2615,6 @@
 --      ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion
 --      ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion
 --      ["Weapon specials: Some weapons have special modes (see weapon description)."] = "", -- Continental_supplies
-      ["Weapons Reset"] = "Armes réinitialisées",
 --      ["Weapons reset: The weapons are reset after each turn."] = "", -- WxW
       ["We are indeed."] = "Nous le sommes, en effet.",
       ["We can't defeat them!"] = "Nous ne pouvons pas les battre !",
@@ -2664,9 +2631,9 @@
 --      ["We have to hurry! Are you armed?"] = "", -- A_Space_Adventure:moon01
       ["We have to protect the village!"] = "Nous devons protéger le village !",
       ["We have to unite and defeat those cylergs!"] = "Nous devons nous unir et battre ces cyborgs !",
---      ["Welcome Hog Solo, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome home! Please take a seat"] = "", -- ClimbHome
       ["Welcome, Leaks A Lot!"] = "Bienvenue, Grosse Fuite !",
+--      ["Welcome, %s, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome to the Death Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
@@ -2833,16 +2800,16 @@
 --      ["You can’t open a portal on the blue surface."] = "", -- portal
 --      ["You can use the other 2 hogs to assist you."] = "", -- A_Space_Adventure:fruit02
 --      ["You can use the rope to reach new places."] = "", -- Basic_Training_-_Rope
---      ["You choose well, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You choose well, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You completed the mission in %.3f seconds."] = "", -- A_Space_Adventure:ice02
 --      ["You completed the mission in %d rounds."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03
---      ["You couldn't have come to a worse time, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You couldn't have come to a worse time, %s!"] = "", -- A_Space_Adventure:fruit01
       ["You couldn't possibly believe that after refusing my offer I'd just let you go!"] = "Tu ne pouvais pas croire qu'après avoir refusé mon offre, je te laisserais partir comme ça !",
 --      ["You'd almost swear the water was rising!"] = "",
       ["You'd better watch your steps..."] = "Tu ferais mieux de regarder où tu marches....",
 --      ["You defended yourself against Captain Lime."] = "", -- A_Space_Adventure:fruit02
---      ["You defended yourself against the Fruit Assassins."] = "", -- A_Space_Adventure:fruit02
---      ["You did great, Hog Solo! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
+--      ["You defended yourself against %s."] = "", -- A_Space_Adventure:fruit02
+--      ["You did great, %s! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
 --      ["You did not make it in time, try again!"] = "", -- Basic_Training_-_Rope
 --      ["You don't deserve my sacrifice!"] = "", -- A_Classic_Fairytale:queen
 --      ["You drove Professor Hogevil away."] = "", -- A_Space_Adventure:moon01
@@ -2858,13 +2825,13 @@
 --      ["You got me!"] = "", -- A_Space_Adventure:moon02
 --      ["You had %.1fs remaining on the clock (+%d points)."] = "", -- TargetPractice
 --      ["You had %.2fs remaining on the clock (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle
---      ["You had %d additional flying saucers left."] = "", -- A_Space_Adventure:ice02
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: you might want to use some mines..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: You might want to use some mines ..."] = "", -- A_Classic_Fairytale:backstab
       ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|	  Hint: you might want to use some mines..."] = "Tu as 7 tours avant la prochaine vague. |Assures toi que les prochains arrivant soient bien accueillis ! |Si le hérisson meurt, la cause est perdue. | Conseil : Tu pourrais vouloir utiliser des mines ...",
 --      ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01
 --      ["You have activated Switch Hedgehog!"] = "", -- Basic_Training_-_Movement
 --      ["You have beaten the challenge!"] = "", -- ClimbHome
+--      ["You have beaten the team record, congratulations!"] = "", -- Utils
       ["You have been giving us out to the enemy, haven't you!"] = "Tu nous as vendu aux ennemis, n'est ce pas ?!",
       ["You have chosen the perfect moment to leave."] = "Tu as choisis le moment parfait pour partir.",
 --      ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01
@@ -2883,7 +2850,6 @@
 --      ["You have eliminated all visible enemy hedgehogs!"] = "", -- A_Space_Adventure:fruit01
 --      ["You have eliminated Professor Hogevil."] = "", -- A_Space_Adventure:moon01
 --      ["You have eliminated the evil minions."] = "", -- A_Space_Adventure:moon01
---      ["You have eliminated the whole evil team. You're pretty tough!"] = "", -- A_Space_Adventure:moon01
 --      ["You have escaped successfully."] = "", -- A_Space_Adventure:desert02
       ["You have failed to complete your task, young one!"] = "Tu as échoué à compléter ta tâche, disciple !",
       ["You have failed to save the tribe!"] = "Tu n'as pas su sauver la tribu !",
@@ -2937,6 +2903,7 @@
 --      ["You have to travel again"] = "", -- A_Space_Adventure:cosmos
 --      ["You have to try again!"] = "", -- A_Space_Adventure:cosmos
 --      ["You have triggered the secret Do-Not-Rope-to-the-Moon Defense System."] = "", -- A_Space_Adventure:cosmos
+--      ["You have unlocked the target radar!"] = "", -- TargetPractice
 --      ["You have used %d flying saucers."] = "", -- A_Space_Adventure:ice02
 --      ["You have used %d RC planes."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["You have used only 1 RC plane. Outstanding!"] = "", -- User_Mission_-_RCPlane_Challenge
@@ -2955,10 +2922,9 @@
 --      ["You'll have only 2 watermelon bombs during the game."] = "", -- A_Space_Adventure:fruit03
 --      ["You'll have only one RC plane at the start of the mission."] = "", -- A_Space_Adventure:desert03
 --      ["You'll have to eliminate Captain Lime at the end."] = "", -- A_Space_Adventure:fruit02
---      ["You'll have to eliminate the Fruit Assassins at the end."] = "", -- A_Space_Adventure:fruit02
+--      ["You'll have to eliminate %s at the end."] = "", -- A_Space_Adventure:fruit02
 --      ["You'll lose if you die or if your time is up."] = "", -- A_Space_Adventure:moon02
       ["You'll see what I mean!"] = "Vous allez comprendre ce que je veux dire !",
---      ["You lose!"] = "", -- Basic_Training_-_Sniper_Rifle, Big_Armory, Basic_Training_-_Bazooka, TargetPractice, ClimbHome
 --      ["You lost your target, try again!"] = "", -- TargetPractice
 --      ["You may find it handy."] = "", -- A_Space_Adventure:cosmos
 --      ["You may only attack from a rope!"] = "", -- WxW
@@ -2980,8 +2946,7 @@
 --      ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice
 --      ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice
 --      ["Your ammo is limited this time."] = "", -- Basic_Training_-_Bazooka
---      ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy
---      ["Your deaths will be avenged, Natives!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Your deaths will be avenged, %s!"] = "", -- A_Classic_Fairytale:enemy
       ["Your death will not be in vain, Dense Cloud!"] = "Tu ne seras pas mort en vain, Nuage Dense !",
 --      ["You're a coward!"] = "", -- A_Classic_Fairytale:queen
       ["You're...alive!? But we saw you die!"] = "Tu es...vivant ? Mais nous t'avons vu mourrir !",
@@ -3009,21 +2974,21 @@
 --      ["Your next task is to collect some crates by using the rope!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Your personal best time so far: %.3f seconds"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["Your rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["You saved %d of 8 Hapless Hogs."] = "", -- User_Mission_-_That_Sinking_Feeling
+--      ["Your rope is gone! Try again!"] = "", -- Basic_Training_-_Rope
+--      ["You saved %d of 8 hegehogs."] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen
 --      ["You see the wind strength at the bottom right corner."] = "", -- Basic_Training_-_Bazooka
+--      ["You see the wind strength at the top."] = "", -- Basic_Training_-_Bazooka
 --      ["You should have known that we don't rely on meatbags!"] = "", -- A_Classic_Fairytale:queen
 --      ["You should know this more than anyone, Leaks!"] = "", -- A_Classic_Fairytale:queen
 --      ["You speak great truth, Hannibal. Here, take a sip!"] = "", -- A_Classic_Fairytale:epil
       ["You've been assaulting us, we have been just defending ourselves!"] = "vous nous avez assiégé, nous nous sommes justes défendus !",
-      ["You've failed. Try again."] = "Vous avez échoué. Essayez encore.",
       ["You've reached the goal!| |Time: "] = "Vous avez atteint le but !| |Temps : ",
       ["You will be avenged!"] = "Tu seras vengé !",
 --      ["You will fail if you run out of ammo and there are still targets available."] = "", -- A_Space_Adventure:desert03
 --      ["You will gain some extra ammo from the crates the next time you play the \"Getting to the device\" mission."] = "", -- A_Space_Adventure:fruit03
 --      ["You will play every 3 turns."] = "", -- A_Space_Adventure:fruit01
 --      ["- You will recieve 2-4 weapons on each kill! (Even on own hogs)"] = "", -- Continental_supplies
---      ["You win!"] = "", -- Big_Armory
       ["You won't believe what happened to me!"] = "Vous ne croirez pas ce qui m'est arrivé !",
       ["Yuck! I bet they'll keep worshipping her even after I save the village!"] = "Beurck ! je parie qu'ils continueront à l'adorer même après que j'aie sauvé le village !",
 --      ["Yumme Gunpowder"] = "", -- 
@@ -3031,6 +2996,7 @@
 --      ["Zombie"] = "", -- 
 --      ["Zombi"] = "", -- portal
 --      ["'Zooka Team"] = "",
---      ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
+--      ["Zoom: [Pinch] with 2 fingers"] = "", -- Basic_Training_-_Movement
+--      ["Zoom: [Rotate mouse wheel]"] = "", -- Basic_Training_-_Movement
 --      ["Zork"] = "",
 }
--- a/share/hedgewars/Data/Locale/gd.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/gd.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -1,5 +1,6 @@
 ; Scottish Gaelic locale
 
+; Weapon names
 00:00=Durcan-spreadhaidh
 00:01=Boma sgapaidh
 00:02=Bazooka
@@ -13,6 +14,7 @@
 00:10=Dineamait
 00:11=Bata ball-beusa
 00:12=Shoryuken
+; Short for “second” (unit of time)
 00:13=diog
 00:14=Paraisiut
 00:15=Ionnsaigh adhair
@@ -62,6 +64,7 @@
 00:59=Snàigear
 00:60=Meanbh-ghunna
 
+; Game messages and HUD texts
 01:00=’Ga luchdadh …
 01:01=Cuairt co-ionnann
 01:02=bhuannaich %1!
@@ -72,11 +75,12 @@
 01:07=%1 air fhàgail
 01:08=Connadh: %1%
 01:09=’Ga shioncronachadh…
-01:10=Cha chuir an acainn seo crìoch air a’ chuairt agad!
+01:10=Cha chuir seo crìoch air a’ chuairt agad!
 01:11=Chan eil an t-arm no acainn seo ri làimh fhathast!
 01:12=A’ chuairt mu dheireadh ron bhàs obann!
 01:13=%1 c(h)uairt(ean) gun bhàs obann!
 01:14=Ullaichibh, %1!
+; Bounciness adjectives
 01:15=Beagan
 01:16=Ìosal
 01:17=Àbhaisteach
@@ -115,6 +119,8 @@
 01:46=[Clan] %1: %2
 ; Hedgehog chat. %1 = hog name, %2 = message
 01:47=[%1]: %2
+; Symbol for unknown mine timer
+01:48=?
 
 ; Event messages
 ; Normal hog (%1) died (0 health)
@@ -426,6 +432,8 @@
 02:07=Barrachd acainnean
 02:07=Tha coltas feumail air seo
 02:07=Seo acainnean dhan innleadair
+02:07=Cruinnich na h-acainnean uile!
+02:07=Seo acainnean dhut!
 
 ; Hog (%1) skips his turn
 02:08=Abair thusa gu bheil %1 ràsanach…
@@ -500,6 +508,16 @@
 02:09=Tha mi cinnteach nach fhaca duine beò sin, %1
 02:09=Tha %1 feumach air barrachd oideachaidh
 02:09=Tha e follaiseach gun deach rudeigin cearr leis an arm aig %1
+02:09=Tha %1 ’ga ionnsachadh fhathast
+02:09=Ìochd!
+02:09=Tha %1 dèidheil air pian
+02:09=Tha %1 a’ cur an nàmhaid am breisleach
+02:09=Tha rudeigin cearr air %1
+02:09=Gun rachadh e na b’ fearr leat an ath-thuras, %1!
+02:09=Tha %1 a’ sabaid ’na aghaidh fhèin
+02:09=Tha %1 fo mhisg
+02:09=Ach carson, %1?
+02:09=Bha droch-thubaist air %1
 
 ; Home run: Hog (%1) uses baseball bat to throw other hog far out of the left/right map bounds
 02:10=A’ seòladh nan neul!
@@ -520,6 +538,11 @@
 02:11=Tha %1 ro thrang airson cluiche
 02:11=Chaidh %1 air chall!
 02:11=Feumaidh %1 falbh
+02:11=Dh’fhalbh %1 leis a’ ghaoith
+02:11=Tha %1 a’ teicheadh
+02:11=Tha %1 feumach air saor-làithean
+02:11=Tha obair-dhachaigh ri dèanamh aig %1
+02:11=Tha a’ chabhag air %1
 
 ; Hog (%1) was poisoned
 02:12=Tha %1 bochd
@@ -611,7 +634,7 @@
 02:17=Cha riaghlaidh %1 tuilleadh
 02:17=Fhuair %1 bàs mar a fhuair an rìoghachd
 
-; Weapon Categories
+; Weapon categories/subcaptions
 03:00=Durcan-spreadhaidh le tìmear
 03:01=Durcan-spreadhaidh le tìmear
 03:02=Arm tilgeil
@@ -675,7 +698,7 @@
 03:59=Arm neo-choileanta
 03:60=An t-arm losgaidh as fhearr
 
-; Weapon Descriptions (use | as line breaks)
+; Weapon descriptions (use | as line breaks)
 04:00=Thoir ionnsaigh air na nàimhdean agad le durcan-spreadhaidh simplidh.|Spreadhaidh e nuair a ruigeas an tìmear aige neoni.|1-5: Suidhich tìmear an durcain|Amas pongail + 1-5: Suidhich neart a’ bhocaidh|Ionnsaigh: Cum sìos gus a thilgeil le barrachd neart
 04:01=Thoir ionnsaigh air na nàimhdean agad le boma sgapaidh.|Thèid a sgapadh ’na bomaichean beaga nuair a ruigeas|an tìmear aige neoni.|1-5: Suidhich tìmear a’ bhoma|Amas pongail + 1-5: Suidhich neart a’ bhocaidh|Ionnsaigh: Cum sìos gus a thilgeil le barrachd neart
 04:02=Thoir ionnsaigh air do nàimhdean le pròiseactal-tilgidh|air an dig buaidh na gaoithe ma dh’fhaoidte.|Ionnsaigh: Cum sìos gus a thilgeil le barrachd neart
@@ -719,7 +742,7 @@
 04:40=Cuir teine air an làr leis a’ bhotal seo a tha làn lionna|a loisgeas (an ceann greis).|Ionnsaigh: Cum sìos gus a thilgeil le barrachd neart
 04:41=Seo dearbhadh gu bheil an nàdar as cumhachdaiche na an soitheach-itealaich.|Giùlainidh an t-eunan do ghràineag mu thimcheall agus leigidh e uighean air|na nàimhdean gus am puinnseanachadh!|Bi luath on a chaitheas an t-eunan ùine na cuairte agad!|Ionnsaigh: Gnìomhaich is leig às uighean|Suas/Clì/Deas: Clap sgiathan ’na chomhair sin
 04:42=Bheir an t-inneal tele-phortaidh so-ghiùlan seo nithean on dàrna|ionad dhan ionad eile sa bhad – thu fhèin, nàmhaid no airm.|Cleachd gu glic e ach an dèid an latha leat!|Aithris-àichidh\: Chan obraich e air bann rubair.|Ionnsaigh: Tilg doras|Dèan suids: Atharraich dath an dorais
-04:43=Cuir an t-iongnadh air càch le do chuid ciùil!|Tuit clàrsach mòr o na speuran|a mhilleas gad rud ’na rathad ach thoir an aire:|Thèid do ghràineag ’na h-ìobairt gus an clàrsach a ghairm.|Cùrsair: Tagh raon amais|F1-F9: Seinn air a’ chlàrsach
+04:43=Cuir an t-iongnadh air càch le do chuid ciùil!|Tuit clàrsach mòr o na speuran|a mhilleas gad rud ’na rathad ach thoir an aire\:|Thèid do ghràineag ’na h-ìobairt gus an clàrsach a ghairm.|Cùrsair: Tagh raon amais|F1-F9: Seinn air a’ chlàrsach
 04:44=Chan e càise a th’ ann ach cogadh bith-eòlach! Cha dèan e mòran|dochainn nuair a ruigeas an tìmear neoni ach thèid gràineag|sam bith a bheir fàileadh às a phuinnseanachadh!|1-5: Suidhich an tìmear|Amas pongail + 1-5: Suidhich neart a’ bhocaidh|Ionnsaigh: Cum sìos gus a thilgeil le barrachd neart
 04:45=Gheibh thu buannachd às an eòlas-nàdair mu dheireadh thall!|Cuir gu dol tonn sìneis marbhtach a loisgeas tron tìr.|Thoir an aire on a tha putadh làidir aig an arm seo.|Ionnsaigh: Loisg
 04:46=Còmhdaich do nàimhdean le lasair theth.|Bheir i tiomachadh air an cridheachan!|Ionnsaigh: Gnìomhaich|Suas/Sìos: Lean ort ’ga amas|Clì/Deas: Gleus neart an steallaidh
@@ -791,3 +814,5 @@
 06:24=/shrug: Crathaidh gràineag a gualainn
 06:25=/wave: Smèididh gràineag
 06:26=Àithne nach aithne dhuinn no paramadairean mì-dhligheach. Can “/help” sa chabadaich airson nan àitheantan a shealltainn.
+06:27=/help room: Seall àitheantan cabadaich an t-seòmair
+06:28=Chan eil thu air loidhne!
--- a/share/hedgewars/Data/Locale/hedgewars_ar.ts	Mon Jan 14 15:11:15 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4306 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="fr">
-<context>
-    <name>About</name>
-    <message>
-        <source>Unknown Compiler</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Hedgewars %1</source>
-        <extracomment>%1 contains Hedgewars&apos; version number</extracomment>
-        <translation type="unfinished">Hedgewars %1</translation>
-    </message>
-    <message>
-        <source>Revision %1 (%2)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Visit our homepage: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>This program is distributed under the %1.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>GNU GPL v2</source>
-        <extracomment>Short for “GNU General Public License version 2”</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Dependency versions:</source>
-        <extracomment>For the version numbers of Hedgewars&apos; software dependencies</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>&lt;a href=&quot;https://gcc.gnu.org&quot;&gt;GCC&lt;/a&gt;: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2&lt;/a&gt;: %1.%2.%3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_mixer&lt;/a&gt;: %1.%2.%3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_net&lt;/a&gt;: %1.%2.%3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_image&lt;/a&gt;: %1.%2.%3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_ttf&lt;/a&gt;: %1.%2.%3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>&lt;a href=&quot;https://www.qt.io/developers/&quot;&gt;Qt&lt;/a&gt;: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>&lt;a href=&quot;https://libav.org&quot;&gt;libavcodec&lt;/a&gt;: %1.%2.%3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>&lt;a href=&quot;https://libav.org&quot;&gt;libavformat&lt;/a&gt;: %1.%2.%3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>&lt;a href=&quot;https://libav.org&quot;&gt;libavutil&lt;/a&gt;: %1.%2.%3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>AbstractPage</name>
-    <message>
-        <source>Go back</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>BanDialog</name>
-    <message>
-        <source>IP</source>
-        <translation type="unfinished">IP</translation>
-    </message>
-    <message>
-        <source>Nick</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>IP/Nick</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Reason</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Duration</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Ok</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Cancel</source>
-        <translation type="unfinished">الغاء</translation>
-    </message>
-    <message>
-        <source>you know why</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Warning</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>permanent</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Ban player</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Please specify an IP address.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Please specify a nickname.</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>DataManager</name>
-    <message>
-        <source>Use Default</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>FeedbackDialog</name>
-    <message>
-        <source>View</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Cancel</source>
-        <translation type="unfinished">الغاء</translation>
-    </message>
-    <message>
-        <source>Send Feedback</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>We are always happy about suggestions, ideas, or bug reports.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Send us feedback!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>If you found a bug, you can see if it&apos;s already been reported here: </source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Your email address is optional, but necessary if you want us to get back at you.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Feedback</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>This is optional, but this information might help us to resolve bugs and other technical problems.</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>FreqSpinBox</name>
-    <message>
-        <source>Never</source>
-        <translation>ابدا</translation>
-    </message>
-    <message numerus="yes">
-        <source>Every %1 turn</source>
-        <translation type="unfinished">
-            <numerusform>كل %1 دور
-        </numerusform>
-            <numerusform></numerusform>
-        </translation>
-    </message>
-</context>
-<context>
-    <name>GameCFGWidget</name>
-    <message>
-        <source>Edit weapons</source>
-        <translation>تغيير سلاح</translation>
-    </message>
-    <message>
-        <source>Edit schemes</source>
-        <translation>Edit schemes</translation>
-    </message>
-    <message>
-        <source>Game scheme will auto-select a weapon</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Map</source>
-        <translation type="unfinished">خارطة</translation>
-    </message>
-    <message>
-        <source>Game options</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>GameSchemeModel</name>
-    <message>
-        <source>new</source>
-        <translation type="obsolete">جديد</translation>
-    </message>
-    <message>
-        <source>New</source>
-        <translation type="unfinished">جديد</translation>
-    </message>
-    <message>
-        <source>Copy of %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>New (%1)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Copy of %1 (%2)</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>GameUIConfig</name>
-    <message>
-        <source>Guest</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>HWApplication</name>
-    <message numerus="yes">
-        <source>%1 minutes</source>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-            <numerusform></numerusform>
-        </translation>
-    </message>
-    <message numerus="yes">
-        <source>%1 hour</source>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-            <numerusform></numerusform>
-        </translation>
-    </message>
-    <message numerus="yes">
-        <source>%1 hours</source>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-            <numerusform></numerusform>
-        </translation>
-    </message>
-    <message numerus="yes">
-        <source>%1 day</source>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-            <numerusform></numerusform>
-        </translation>
-    </message>
-    <message numerus="yes">
-        <source>%1 days</source>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-            <numerusform></numerusform>
-        </translation>
-    </message>
-    <message>
-        <source>Scheme &apos;%1&apos; not supported</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Cannot create directory %1</source>
-        <translation type="unfinished">Cannot create directory %1</translation>
-    </message>
-    <message>
-        <source>Failed to open data directory:
-%1
-
-Please check your installation!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Usage</source>
-        <comment>command-line</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>OPTION</source>
-        <comment>command-line</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>CONNECTSTRING</source>
-        <comment>command-line</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Options</source>
-        <comment>command-line</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Display this help</source>
-        <comment>command-line</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Custom path for configuration data and user data</source>
-        <comment>command-line</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Custom path to the game data folder</source>
-        <comment>command-line</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Hedgewars can use a %1 (e.g. &quot;%2&quot;) to connect on start.</source>
-        <comment>command-line</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Malformed option argument: %1</source>
-        <comment>command-line</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Unknown option argument: %1</source>
-        <comment>command-line</comment>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>HWAskQuitDialog</name>
-    <message>
-        <source>Do you really want to quit?</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>HWChatWidget</name>
-    <message>
-        <source>%1 has been removed from your ignore list</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>%1 has been added to your ignore list</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>%1 has been removed from your friends list</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>%1 has been added to your friends list</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Stylesheet imported from %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Enter %1 if you want to use the current StyleSheet in future, enter %2 to reset!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Couldn&apos;t read %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>StyleSheet discarded</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>StyleSheet saved to %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Failed to save StyleSheet to %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>%1 has joined</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>%1 has left</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>%1 has left (%2)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Chat log</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Enter chat messages here and send them with [Enter]</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>List of players</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>HWForm</name>
-    <message>
-        <source>Cannot save record to file %1</source>
-        <translation>لم اتمكن من حقظ الملف %1</translation>
-    </message>
-    <message>
-        <source>Hedgewars Demo File</source>
-        <comment>File Types</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Hedgewars Save File</source>
-        <comment>File Types</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Demo name</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Demo name:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Game aborted</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Nickname</source>
-        <translation type="unfinished">اسم اللاعب</translation>
-    </message>
-    <message>
-        <source>No nickname supplied.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Someone already uses your nickname %1 on the server.
-Please pick another nickname:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>%1&apos;s Team</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Hedgewars - Nick registered</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>This nick is registered, and you haven&apos;t specified a password.
-
-If this nick isn&apos;t yours, please register your own nick at www.hedgewars.org
-
-Password:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Your nickname is not registered.
-To prevent someone else from using it,
-please register it at www.hedgewars.org</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>
-
-Your password wasn&apos;t saved either.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Hedgewars - Empty nickname</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Hedgewars - Wrong password</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>You entered a wrong password.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Try Again</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Hedgewars - Connection error</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>You reconnected too fast.
-Please wait a few seconds and try again.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Guest</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Room password</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>The room is protected with password.
-Please, enter the password:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Team 1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Team %1</source>
-        <extracomment>Default team name</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Computer %1</source>
-        <extracomment>Default computer team name</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Unknown network error (possibly missing SSL library).</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>This feature requires an Internet connection, but you don&apos;t appear to be online (error code: %1).</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Internal error: Reply object is invalid.</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>HWGame</name>
-    <message>
-        <source>en.txt</source>
-        <extracomment>IMPORTANT: This text has a special meaning, do not translate it directly. This is the file name of translation files for the game engine, found in Data/Locale/. Usually, you replace “en” with the ISO-639-1 language code of your language.</extracomment>
-        <translation type="unfinished">ar.txt</translation>
-    </message>
-    <message>
-        <source>Cannot open demofile %1</source>
-        <translation>لم اتمكن من حفظ ملف اللعب %1</translation>
-    </message>
-    <message>
-        <source>A fatal ERROR occured! The game engine had to stop.
-
-We are very sorry for the inconvenience. :-(
-
-If this keeps happening, please click the &apos;Feedback&apos; button in the main menu!
-
-Last engine message:
-%1</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>HWHostPortDialog</name>
-    <message>
-        <source>Connect to server</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>HWMapContainer</name>
-    <message>
-        <source>All</source>
-        <translation>كل</translation>
-    </message>
-    <message>
-        <source>Small</source>
-        <translation>صغير</translation>
-    </message>
-    <message>
-        <source>Medium</source>
-        <translation>متوسط</translation>
-    </message>
-    <message>
-        <source>Large</source>
-        <translation>كبير</translation>
-    </message>
-    <message>
-        <source>Cavern</source>
-        <translation>كهف</translation>
-    </message>
-    <message>
-        <source>Wacky</source>
-        <translation>تعبان</translation>
-    </message>
-    <message>
-        <source>Small tunnels</source>
-        <translation type="unfinished">انقاق صغيرة</translation>
-    </message>
-    <message>
-        <source>Medium tunnels</source>
-        <translation type="unfinished">انفاق متوسطة</translation>
-    </message>
-    <message>
-        <source>Seed</source>
-        <extracomment>Refers to the &quot;random seed&quot;; the source of randomness in the game</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Map type:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Image map</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Mission map</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Hand-drawn</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Randomly generated</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Random maze</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Random</source>
-        <translation type="unfinished">عشوائي</translation>
-    </message>
-    <message>
-        <source>Map preview:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Load map drawing</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Edit map drawing</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Small islands</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Medium islands</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Large islands</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Map size:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Maze style:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Mission:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Map:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Load drawn map</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Drawn Maps</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>All files</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Large tunnels</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Theme: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Random perlin</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Style:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Forts</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>View and edit the seed, the source of randomness in the game</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Randomize the theme</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Choose a theme</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Randomize the map, theme and seed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Randomize the theme and seed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Randomize the seed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Click to randomize the map, theme and seed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Click to randomize the theme and seed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Adjust the complexity of the generated map</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Adjust the distance between forts</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Click to edit</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>HWNetServersModel</name>
-    <message>
-        <source>Title</source>
-        <translation>عنوان</translation>
-    </message>
-    <message>
-        <source>IP</source>
-        <extracomment>short for &quot;IP address&quot; (Internet Protocol), part of server address</extracomment>
-        <translation>IP</translation>
-    </message>
-    <message>
-        <source>Port</source>
-        <extracomment>short for &quot;port number&quot;, part of server address</extracomment>
-        <translation>Port</translation>
-    </message>
-</context>
-<context>
-    <name>HWNewNet</name>
-    <message>
-        <source>The host was not found. Please check the host name and port settings.</source>
-        <translation type="unfinished">الحاسوب لم يوجد. تأكد من الاعدادات</translation>
-    </message>
-    <message>
-        <source>Connection refused</source>
-        <translation type="vanished">الاتصال رفض</translation>
-    </message>
-    <message>
-        <source>Room destroyed</source>
-        <translation>الغرفة اغلقت</translation>
-    </message>
-    <message>
-        <source>Quit reason: </source>
-        <translation type="obsolete">سبب الخروج</translation>
-    </message>
-    <message>
-        <source>You got kicked</source>
-        <translation>تم طردك</translation>
-    </message>
-    <message>
-        <source>%1 *** %2 has joined the room</source>
-        <translation>%1 *** %2 انضم للغرفة</translation>
-    </message>
-    <message>
-        <source>%1 *** %2 has joined</source>
-        <translation type="obsolete">%1 *** %2 انضم</translation>
-    </message>
-    <message>
-        <source>%1 *** %2 has left (%3)</source>
-        <translation>%1 *** %2 خرج (%3)</translation>
-    </message>
-    <message>
-        <source>%1 *** %2 has left</source>
-        <translation>%1 *** %2 خرج</translation>
-    </message>
-    <message>
-        <source>Remote host has closed connection</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>The server is too old. Disconnecting now.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Server authentication error</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Reason:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>The connection was refused by the official server or timed out. Something seems to be wrong with the official server at the moment. This might be a temporary problem. Please try again later.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>The connection was refused by the host or timed out. This might have one of the following reasons:
-- The Hedgewars Server program does currently not run on the host
-- The specified port number is incorrect
-- There is a temporary network problem
-
-Please check the host name and port settings and/or try again later.</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>HWPasswordDialog</name>
-    <message>
-        <source>Login</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>To connect to the server, please log in.
-
-If you don&apos;t have an account on www.hedgewars.org,
-just enter your nickname.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Nickname:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Password:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>New Account</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>HatButton</name>
-    <message>
-        <source>Change hat (%1)</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>HatPrompt</name>
-    <message>
-        <source>Cancel</source>
-        <translation type="unfinished">الغاء</translation>
-    </message>
-    <message>
-        <source>Use selected hat</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Search for a hat:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Choose a hat</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>KB</name>
-    <message>
-        <source>SDL_ttf returned error while rendering text, most propably it is related to the bug in freetype2. It&apos;s recommended to update your freetype lib.</source>
-        <translation type="obsolete">SDL_ttf returned error while rendering text, most propably it is related to the bug in freetype2. It&apos;s recommended to update your freetype lib.</translation>
-    </message>
-</context>
-<context>
-    <name>KeyBinder</name>
-    <message>
-        <source>Category</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>LibavInteraction</name>
-    <message>
-        <source>Audio: </source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>unknown</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Duration: %1min %2s</source>
-        <extracomment>Duration in minutes and seconds (SI units)</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Video: %1x%2, %3 FPS, %4</source>
-        <extracomment>Video metadata. %1 = video width, %2 = video height, %3 = frames per second = %4 = decoder name</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Video: %1x%2, %3</source>
-        <extracomment>Video metadata. %1 = video width, %2 = video height, %3 = decoder name</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Player: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Theme: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Map: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Record: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>MapModel</name>
-    <message>
-        <source>No description available.</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>MinesTimeSpinBox</name>
-    <message>
-        <source>Random</source>
-        <translation type="unfinished">عشوائي</translation>
-    </message>
-    <message numerus="yes">
-        <source>%1 seconds</source>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-            <numerusform></numerusform>
-        </translation>
-    </message>
-</context>
-<context>
-    <name>PageAdmin</name>
-    <message>
-        <source>Clear Accounts Cache</source>
-        <translation>Clear Accounts Cache</translation>
-    </message>
-    <message>
-        <source>Fetch data</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Server message for latest version:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Server message for previous versions:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Latest version protocol number:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>MOTD preview:</source>
-        <extracomment>MOTD = Message Of The Day, the message which is shown to players joining the server</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Set data</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>General</source>
-        <translation type="unfinished">عام</translation>
-    </message>
-    <message>
-        <source>Bans</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>IP/Nick</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Expiration</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Reason</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Refresh</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Add</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Remove</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>PageCampaign</name>
-    <message>
-        <source>Team</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Campaign</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Mission</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Start fighting</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>PageConnecting</name>
-    <message>
-        <source>Connecting...</source>
-        <translation type="unfinished">جاري الاتصال</translation>
-    </message>
-</context>
-<context>
-    <name>PageDataDownload</name>
-    <message>
-        <source>Loading, please wait.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Open packages directory</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Load the start page</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Unknown network error (possibly missing SSL library).</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>This feature requires an Internet connection, but you don&apos;t appear to be online (error code: %1).</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Internal error: Reply object is invalid.</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>PageDrawMap</name>
-    <message>
-        <source>Undo</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Clear</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Load</source>
-        <translation type="unfinished">تحميل</translation>
-    </message>
-    <message>
-        <source>Save</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Load drawn map</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Save drawn map</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Drawn Maps</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>All files</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Eraser</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Polyline</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Rectangle</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Ellipse</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Optimize</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Brush size</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>PageEditTeam</name>
-    <message>
-        <source>General</source>
-        <translation>عام</translation>
-    </message>
-    <message>
-        <source>Select an action to choose a custom key bind for this team</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Use my default</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Reset all binds</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Custom Controls</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Hat</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Name</source>
-        <translation type="unfinished">اسم</translation>
-    </message>
-    <message>
-        <source>This hedgehog&apos;s name</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Randomize this hedgehog&apos;s name</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Random Team</source>
-        <translation type="unfinished">فريق عشوائي</translation>
-    </message>
-    <message>
-        <source>Play a random example of this voice</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Random Hats</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Random Names</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Randomize the team name</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Randomize the grave</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Randomize the flag</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Randomize the voice</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Randomize the fort</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>CPU %1</source>
-        <extracomment>Name of a flag for computer-controlled enemies. %1 is replaced with the computer level</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>%1 (%2)</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>PageGameStats</name>
-    <message>
-        <source>Details</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Health graph</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Ranking</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message numerus="yes">
-        <source>The best shot award was won by &lt;b&gt;%1&lt;/b&gt; with &lt;b&gt;%2&lt;/b&gt; pts.</source>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-            <numerusform></numerusform>
-        </translation>
-    </message>
-    <message numerus="yes">
-        <source>The best killer is &lt;b&gt;%1&lt;/b&gt; with &lt;b&gt;%2&lt;/b&gt; kills in a turn.</source>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-            <numerusform></numerusform>
-        </translation>
-    </message>
-    <message numerus="yes">
-        <source>A total of &lt;b&gt;%1&lt;/b&gt; hedgehog(s) were killed during this round.</source>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-            <numerusform></numerusform>
-        </translation>
-    </message>
-    <message numerus="yes">
-        <source>(%1 kill)</source>
-        <extracomment>Number of kills in stats screen, written after the team name</extracomment>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-            <numerusform></numerusform>
-        </translation>
-    </message>
-    <message numerus="yes">
-        <source>&lt;b&gt;%1&lt;/b&gt; was scared and skipped turn &lt;b&gt;%2&lt;/b&gt; times.</source>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-            <numerusform></numerusform>
-        </translation>
-    </message>
-    <message>
-        <source>Play again</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Save</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message numerus="yes">
-        <source>(%1 %2)</source>
-        <extracomment>For custom number of points in the stats screen, written after the team name. %1 is the number, %2 is the word. Example: “4 points”</extracomment>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-            <numerusform></numerusform>
-        </translation>
-    </message>
-    <message numerus="yes">
-        <source>&lt;b&gt;%1&lt;/b&gt; thought it&apos;s good to shoot their own hedgehogs for &lt;b&gt;%2&lt;/b&gt; pts.</source>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-            <numerusform></numerusform>
-        </translation>
-    </message>
-    <message numerus="yes">
-        <source>&lt;b&gt;%1&lt;/b&gt; killed &lt;b&gt;%2&lt;/b&gt; of their own hedgehogs.</source>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-            <numerusform></numerusform>
-        </translation>
-    </message>
-    <message>
-        <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>PageInGame</name>
-    <message>
-        <source>In game...</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>PageInfo</name>
-    <message>
-        <source>Open the snapshot folder</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>PageMain</name>
-    <message>
-        <source>Downloadable Content</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Play a game on a single computer</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Play a game across a network</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Read about who is behind the Hedgewars Project</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Leave a feedback here reporting issues, suggesting features or just saying how you like Hedgewars</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Access the user created content downloadable from our website</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Exit game</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Manage videos recorded from game</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Edit game preferences</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Play a game across a local area network</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Play a game on an official server</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Feedback</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Play local network game</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Play official network game</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Open the Hedgewars online game manual in your web browser</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>PageMultiplayer</name>
-    <message>
-        <source>Start</source>
-        <translation>ابدا</translation>
-    </message>
-    <message>
-        <source>Edit game preferences</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Start fighting (requires at least 2 teams)</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>PageNetGame</name>
-    <message>
-        <source>Control</source>
-        <translation type="obsolete">تحكم</translation>
-    </message>
-    <message>
-        <source>Edit game preferences</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Start</source>
-        <translation type="unfinished">ابدا</translation>
-    </message>
-    <message>
-        <source>Update</source>
-        <translation type="unfinished">تحديث</translation>
-    </message>
-    <message>
-        <source>Room controls</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Room name</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Update the room name</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Turn on the lightbulb to show the other players when you&apos;re ready to fight</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Start fighting (requires at least 2 teams)</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>PageNetServer</name>
-    <message>
-        <source>Click here for details</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Insert your address here</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>PageOptions</name>
-    <message>
-        <source>New team</source>
-        <translation>فريق جديد</translation>
-    </message>
-    <message>
-        <source>Edit team</source>
-        <translation>تغيير فريق</translation>
-    </message>
-    <message>
-        <source>Delete team</source>
-        <translation>حذف فريق</translation>
-    </message>
-    <message>
-        <source>You can&apos;t edit teams from team selection. Go back to main menu to add, edit or delete teams.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>New scheme</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Edit scheme</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Delete scheme</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>New weapon set</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Edit weapon set</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Delete weapon set</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Advanced</source>
-        <translation type="unfinished">متقدم</translation>
-    </message>
-    <message>
-        <source>Reset to default colors</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Proxy host</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Proxy port</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Proxy login</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Proxy password</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>No proxy</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Socks5 proxy</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>HTTP proxy</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>System proxy settings</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Select an action to change what key controls it</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Reset to default</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Reset all binds</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Game</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Graphics</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Audio</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Controls</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Video Recording</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Network</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Teams</source>
-        <translation type="unfinished">فرق</translation>
-    </message>
-    <message>
-        <source>Schemes</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Weapons</source>
-        <translation type="unfinished">اسلحة</translation>
-    </message>
-    <message>
-        <source>Frontend</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Custom colors</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Game audio</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Frontend audio</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Account</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Proxy settings</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Miscellaneous</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Updates</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Check for updates</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Video recording options</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>x</source>
-        <extracomment>Multiplication sign, to be used between two numbers. Note the “x” is only a dummy character, we recommend to use “×” if your language permits it</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>MISSING LANGUAGE NAME [%1]</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Check now</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Can&apos;t delete last team</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>You can&apos;t delete the last team!</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>PagePlayDemo</name>
-    <message>
-        <source>Rename dialog</source>
-        <translation>تغيير الشباك</translation>
-    </message>
-    <message>
-        <source>Enter new file name:</source>
-        <translation type="unfinished">ادخل اسم الملف</translation>
-    </message>
-    <message>
-        <source>Play demo</source>
-        <translation type="unfinished">ابدا العرض</translation>
-    </message>
-    <message>
-        <source>Play the selected demo</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Load the selected game</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>PageRoomsList</name>
-    <message>
-        <source>Create</source>
-        <translation type="obsolete">اصنع</translation>
-    </message>
-    <message>
-        <source>Join</source>
-        <translation type="obsolete">انضم</translation>
-    </message>
-    <message>
-        <source>Admin features</source>
-        <translation>الادارة</translation>
-    </message>
-    <message>
-        <source>Room Name:</source>
-        <translation type="obsolete">رقم الغرقة</translation>
-    </message>
-    <message numerus="yes">
-        <source>%1 players online</source>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-            <numerusform></numerusform>
-        </translation>
-    </message>
-    <message>
-        <source>Search for a room:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Create room</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Join room</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Room state</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Open server administration page</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>PageScheme</name>
-    <message>
-        <source>Defend your fort and destroy the opponents, two team colours max!</source>
-        <translation type="obsolete">دافع عن القلعة و دمر الاعداء. فريقان الحد الاقصى</translation>
-    </message>
-    <message>
-        <source>Teams will start on opposite sides of the terrain, two team colours max!</source>
-        <translation type="obsolete">الفرق تبدا في مكانين متقابلين. فريقان الحد الاقصى</translation>
-    </message>
-    <message>
-        <source>Land can not be destroyed!</source>
-        <translation type="obsolete">الارض لا يمكن ان تدمر</translation>
-    </message>
-    <message>
-        <source>Lower gravity</source>
-        <translation>جاذبية قليلة</translation>
-    </message>
-    <message>
-        <source>Assisted aiming with laser sight</source>
-        <translation>منظار ليزري</translation>
-    </message>
-    <message>
-        <source>All hogs have a personal forcefield</source>
-        <translation>كل اللاعبين لهم حقل قوى</translation>
-    </message>
-    <message>
-        <source>Gain 80% of the damage you do back in health</source>
-        <translation>احصل على 80% من التدمير في صحتك</translation>
-    </message>
-    <message>
-        <source>Share your opponents pain, share their damage</source>
-        <translation>شارك في صحة عدوك</translation>
-    </message>
-    <message>
-        <source>Your hogs are unable to move, put your artillery skills to the test</source>
-        <translation>الاعبين لا يمكنهم التحرك</translation>
-    </message>
-    <message>
-        <source>Random</source>
-        <translation type="obsolete">عشوائي</translation>
-    </message>
-    <message>
-        <source>Seconds</source>
-        <translation type="obsolete">ثواني</translation>
-    </message>
-    <message>
-        <source>New</source>
-        <translation>جديد</translation>
-    </message>
-    <message>
-        <source>Delete</source>
-        <translation>حذف</translation>
-    </message>
-    <message>
-        <source>Order of play is random instead of in room order.</source>
-        <translation type="unfinished">تسلسل اللعب عشواي</translation>
-    </message>
-    <message>
-        <source>Play with a King. If he dies, your side dies.</source>
-        <translation type="unfinished">اذا مات الملك، خسر الفريق</translation>
-    </message>
-    <message>
-        <source>Take turns placing your hedgehogs before the start of play.</source>
-        <translation type="unfinished">ضع لاعبين بالادوار قبل اللعب</translation>
-    </message>
-    <message>
-        <source>Ammo is shared between all teams that share a colour.</source>
-        <translation type="unfinished">العتاد مشترك</translation>
-    </message>
-    <message>
-        <source>Disable girders when generating random maps.</source>
-        <translation type="unfinished">ابطال البناء</translation>
-    </message>
-    <message>
-        <source>Disable land objects when generating random maps.</source>
-        <translation type="unfinished">ابطال الاجسام الساقطة</translation>
-    </message>
-    <message>
-        <source>All (living) hedgehogs are fully restored at the end of turn</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>AI respawns on death.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Attacking does not end your turn.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Weapons are reset to starting values each turn.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Each hedgehog has its own ammo. It does not share with the team.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>You will not have to worry about wind anymore.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Wind will affect almost everything.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Copy</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Teams in each clan take successive turns sharing their turn time.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Add an indestructible border around the terrain</source>
-        <translation>اضف اطار لا يمكن تدميره</translation>
-    </message>
-    <message>
-        <source>Add an indestructible border along the bottom</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>None (Default)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Wrap (World wraps)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Bounce (Edges reflect)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Sea (Edges connect to sea)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Each clan starts in its own part of the terrain.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Overall damage and knockback in percent</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Turn time in seconds</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Initial health of hedgehogs</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>How many rounds have to be played before Sudden Death begins</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>How much the water rises per turn while in Sudden Death. Set to 0 along with Sudden Death Health Decrease to disable Sudden Death.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>How much health hedgehogs lose per turn while in Sudden Death, down to 1 health. Set to 0 along with Sudden Death Water Rise to disable Sudden Death.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Maximum rope length in percent</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Likelihood of a dropped crate being a health crate. All other crates will be weapon or utility crates.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Likelihood of a crate dropping before a turn</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Health bonus for collecting a health crate</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Detonation timer of mines. The random timer lies between 0 and 5 seconds. The timer of air mines will be a quarter of the mines timer.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Average number of mines to be placed a medium-sized island map. This number will be scaled for other maps.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Likelihood of a mine being a dud. Does not affect mines placed by hedgehogs.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Average number of barrels to be placed a medium-sized island map. This number will be scaled for other maps.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Average number of air mines to be placed a medium-sized island map. This number will be scaled for other maps.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Affects the left and right boundaries of the map</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Time you get after an attack</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Name of this scheme</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Select a hedgehog at the beginning of a turn</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Land can not be destroyed by most weapons.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>%1 (%2)</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>PageSelectWeapon</name>
-    <message>
-        <source>Default</source>
-        <translation>التلقائي</translation>
-    </message>
-    <message>
-        <source>Delete</source>
-        <translation>حذف</translation>
-    </message>
-    <message>
-        <source>New</source>
-        <translation type="unfinished">جديد</translation>
-    </message>
-    <message>
-        <source>Copy</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>PageSinglePlayer</name>
-    <message>
-        <source>Play a quick game against the computer with random settings</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Play a hotseat game against your friends, or AI teams</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Campaign Mode</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Practice your skills in a range of training missions</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Watch recorded demos</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Load a previously saved game</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>PageTraining</name>
-    <message>
-        <source>No description available</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Select a mission!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Start fighting</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Pick the training to play</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Pick the challenge to play</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Pick the scenario to play</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Trainings</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Challenges</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Scenarios</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>PageVideos</name>
-    <message>
-        <source>Name</source>
-        <translation type="unfinished">اسم</translation>
-    </message>
-    <message>
-        <source>Size</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message numerus="yes">
-        <source>%1 bytes</source>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-            <numerusform></numerusform>
-        </translation>
-    </message>
-    <message>
-        <source>(in progress...)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>encoding</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Date: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Size: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>%1%</source>
-        <extracomment>Video encoding progress. %1 = number</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>%1 (%2%) - %3</source>
-        <extracomment>Video encoding list entry. %1 = file name, %2 = percent complete, %3 = video operation type (e.g. “encoding”)</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QAction</name>
-    <message>
-        <source>Kick</source>
-        <translation>ارفس</translation>
-    </message>
-    <message>
-        <source>Info</source>
-        <translation>معلومات</translation>
-    </message>
-    <message>
-        <source>Restrict Joins</source>
-        <translation>امنع الانضمام</translation>
-    </message>
-    <message>
-        <source>Restrict Team Additions</source>
-        <translation>امنع اضافات الفرق</translation>
-    </message>
-    <message>
-        <source>Ban</source>
-        <translation>امنع</translation>
-    </message>
-    <message>
-        <source>Follow</source>
-        <translation>اتبع</translation>
-    </message>
-    <message>
-        <source>Ignore</source>
-        <translation>اهمل</translation>
-    </message>
-    <message>
-        <source>Add friend</source>
-        <translation>اضف صديق</translation>
-    </message>
-    <message>
-        <source>Unignore</source>
-        <translation>حذف الاهمال</translation>
-    </message>
-    <message>
-        <source>Remove friend</source>
-        <translation>امحي صديق</translation>
-    </message>
-    <message>
-        <source>Update</source>
-        <translation type="obsolete">تحديث</translation>
-    </message>
-    <message>
-        <source>Restrict Unregistered Players Join</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Show games in lobby</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Show games in-progress</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Show password protected</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Show join restricted</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Delegate room control</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QCheckBox</name>
-    <message>
-        <source>Check for updates at startup</source>
-        <translation>تحرى عن التحديثات</translation>
-    </message>
-    <message>
-        <source>Fullscreen</source>
-        <translation type="unfinished">ملء الشاشة</translation>
-    </message>
-    <message>
-        <source>Show FPS</source>
-        <translation>اضهر عدد الاطارات في الثانية</translation>
-    </message>
-    <message>
-        <source>Alternative damage show</source>
-        <translation>عرض الدمار</translation>
-    </message>
-    <message>
-        <source>Append date and time to record file name</source>
-        <translation>اضف التاريخ و اليوم الى الملف</translation>
-    </message>
-    <message>
-        <source>Show ammo menu tooltips</source>
-        <translation>اضهر قوائم للعتاد</translation>
-    </message>
-    <message>
-        <source>Save password</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Record audio</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Use game resolution</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Visual effects</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Sound</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>In-game sound effects</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Music</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>In-game music</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Frontend sound effects</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Frontend music</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Team</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Enable team tags by default</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Hog</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Enable hedgehog tags by default</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Health</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Enable health tags by default</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Translucent</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Enable translucent tags by default</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Enable visual effects such as animated menu transitions and falling stars</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>If enabled, Hedgewars adds the date and time in the form &quot;YYYY-MM-DD_hh-mm&quot; for automatically created demos.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Dampen when losing focus</source>
-        <extracomment>Checkbox text. If checked, the in-game audio volume is reduced (=dampened) when the game window loses its focus</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Reduce the game audio volume if the game window has lost its focus</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QComboBox</name>
-    <message>
-        <source>Human</source>
-        <translation>انسان</translation>
-    </message>
-    <message>
-        <source>Level</source>
-        <translation type="obsolete">مرحلة</translation>
-    </message>
-    <message>
-        <source>(System default)</source>
-        <translation>نمط النظام</translation>
-    </message>
-    <message>
-        <source>Community</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Disabled</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Red/Cyan</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Cyan/Red</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Red/Blue</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Blue/Red</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Red/Green</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Green/Red</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Side-by-side</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Top-Bottom</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Red/Cyan grayscale</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Cyan/Red grayscale</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Red/Blue grayscale</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Blue/Red grayscale</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Red/Green grayscale</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Green/Red grayscale</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Computer (Level %1)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Stereoscopy creates an illusion of depth when you wear 3D glasses.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>24 FPS</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>25 FPS</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>30 FPS</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>50 FPS</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>60 FPS</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QGroupBox</name>
-    <message>
-        <source>Team Members</source>
-        <translation>اعضاء الفريق</translation>
-    </message>
-    <message>
-        <source>Fort</source>
-        <translation>حصن</translation>
-    </message>
-    <message>
-        <source>Net game</source>
-        <translation>لعبة شبكية</translation>
-    </message>
-    <message>
-        <source>Playing teams</source>
-        <translation>فرق اللعب</translation>
-    </message>
-    <message>
-        <source>Game Modifiers</source>
-        <translation>مغيرات اللعبة</translation>
-    </message>
-    <message>
-        <source>Basic Settings</source>
-        <translation>اعدادات الاساسية</translation>
-    </message>
-    <message>
-        <source>Team Settings</source>
-        <translation>اعدادات الفريق</translation>
-    </message>
-    <message>
-        <source>Videos</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Description</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QLabel</name>
-    <message>
-        <source>Mines Time</source>
-        <translation>وقت اللغم</translation>
-    </message>
-    <message>
-        <source>Mines</source>
-        <translation>الغام</translation>
-    </message>
-    <message>
-        <source>Version</source>
-        <translation type="obsolete">نسخة</translation>
-    </message>
-    <message>
-        <source>Weapons</source>
-        <translation>اسلحة</translation>
-    </message>
-    <message>
-        <source>Host:</source>
-        <translation>Host:</translation>
-    </message>
-    <message>
-        <source>Port:</source>
-        <translation>Port:</translation>
-    </message>
-    <message>
-        <source>Resolution</source>
-        <translation>الوضوح</translation>
-    </message>
-    <message>
-        <source>FPS limit</source>
-        <translation>حد الاقصى لعدد الاطر في الثانية</translation>
-    </message>
-    <message>
-        <source>Server name:</source>
-        <translation type="unfinished">اسم الخادم</translation>
-    </message>
-    <message>
-        <source>Server port:</source>
-        <translation>Server port:</translation>
-    </message>
-    <message>
-        <source>Initial sound volume</source>
-        <translation>ارتقاع الصوت</translation>
-    </message>
-    <message>
-        <source>Damage Modifier</source>
-        <translation>مغير الدمار</translation>
-    </message>
-    <message>
-        <source>Turn Time</source>
-        <translation>وقت الجولة</translation>
-    </message>
-    <message>
-        <source>Initial Health</source>
-        <translation>الصحة الاولية</translation>
-    </message>
-    <message>
-        <source>Sudden Death Timeout</source>
-        <translation>وقت الموت المفاجئ</translation>
-    </message>
-    <message>
-        <source>Scheme Name:</source>
-        <translation type="unfinished">اسم النمط:</translation>
-    </message>
-    <message>
-        <source>Crate Drops</source>
-        <translation>المساعدات</translation>
-    </message>
-    <message>
-        <source>% Dud Mines</source>
-        <translation>% الغام</translation>
-    </message>
-    <message>
-        <source>Name</source>
-        <translation>اسم</translation>
-    </message>
-    <message>
-        <source>Type</source>
-        <translation type="obsolete">نوع</translation>
-    </message>
-    <message>
-        <source>Grave</source>
-        <translation>تابوت</translation>
-    </message>
-    <message>
-        <source>Flag</source>
-        <translation>علم</translation>
-    </message>
-    <message>
-        <source>Voice</source>
-        <translation>صوت</translation>
-    </message>
-    <message>
-        <source>Locale</source>
-        <translation>محلي</translation>
-    </message>
-    <message>
-        <source>Explosives</source>
-        <translation type="obsolete">متفجرات</translation>
-    </message>
-    <message>
-        <source>Quality</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>% Health Crates</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Health in Crates</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Sudden Death Water Rise</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Sudden Death Health Decrease</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>% Rope Length</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Style</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Scheme</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>There are videos that are currently being processed.
-Exiting now will abort them.
-Do you really want to quit?</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Description</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Nickname</source>
-        <translation type="unfinished">اسم اللاعب</translation>
-    </message>
-    <message>
-        <source>Format</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Audio codec</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Video codec</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Framerate</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>This development build is &apos;work in progress&apos; and may not be compatible with other versions of the game, while some features might be broken or incomplete!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Fullscreen</source>
-        <translation type="unfinished">ملء الشاشة</translation>
-    </message>
-    <message>
-        <source>Fullscreen Resolution</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Windowed Resolution</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Your Email</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Summary</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Send system information</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Type the security code:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>This setting will be effective at next restart.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Tip: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Displayed tags above hogs and translucent tags</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>World Edge</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Script parameter</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Air Mines</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Player</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Barrels</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>% Retreat Time</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Stereoscopy</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Bitrate (Kibit/s)</source>
-        <extracomment>“Kibit/s” is the symbol for 1024 bits per second</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Loading&lt;br&gt;CAPTCHA ...</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QLineEdit</name>
-    <message>
-        <source>unnamed</source>
-        <translation>غير مسمى</translation>
-    </message>
-    <message>
-        <source>hedgehog %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>anonymous</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>unnamed (%1)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Hedgehog %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QMainWindow</name>
-    <message>
-        <source>Hedgewars %1</source>
-        <translation>Hedgewars %1</translation>
-    </message>
-</context>
-<context>
-    <name>QMessageBox</name>
-    <message>
-        <source>Connection to server is lost</source>
-        <translation type="vanished">ضاع الاتصال للخادم</translation>
-    </message>
-    <message>
-        <source>Error</source>
-        <translation>خطأ</translation>
-    </message>
-    <message>
-        <source>File association failed.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Teams - Are you sure?</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Do you really want to delete the team &apos;%1&apos;?</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Cannot delete default scheme &apos;%1&apos;!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Please select a record from the list</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Unable to start server</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Hedgewars - Error</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Hedgewars - Success</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>All file associations have been set</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Cannot create directory %1</source>
-        <translation type="obsolete">Cannot create directory %1</translation>
-    </message>
-    <message>
-        <source>Unable to start the server: %1.</source>
-        <translation type="obsolete">Unable to start the server: %1.</translation>
-    </message>
-    <message>
-        <source>Netgame - Error</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Please select a server from the list</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Please enter room name</source>
-        <translation type="unfinished">ادخل رقم الغرقة</translation>
-    </message>
-    <message>
-        <source>Please select record from the list</source>
-        <translation type="obsolete">اختر المقطع من القائمة</translation>
-    </message>
-    <message>
-        <source>Room Name - Error</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Please select room from the list</source>
-        <translation type="unfinished">اختر الغرقة من القائمة</translation>
-    </message>
-    <message>
-        <source>Room Name - Are you sure?</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>The game you are trying to join has started.
-Do you still want to join the room?</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Schemes - Warning</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Schemes - Are you sure?</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Do you really want to delete the game scheme &apos;%1&apos;?</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Videos - Are you sure?</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Do you really want to delete the video &apos;%1&apos;?</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message numerus="yes">
-        <source>Do you really want to remove %1 file(s)?</source>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-            <numerusform></numerusform>
-        </translation>
-    </message>
-    <message>
-        <source>File error</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Cannot open &apos;%1&apos; for writing</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Cannot open &apos;%1&apos; for reading</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Weapons - Warning</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Cannot delete default weapon set &apos;%1&apos;!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Weapons - Are you sure?</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Do you really want to delete the weapon set &apos;%1&apos;?</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Hedgewars - Nick not registered</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>System Information Preview</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Failed to generate captcha</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Failed to download captcha</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Please fill out all fields. Email is optional.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Hedgewars - Warning</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Hedgewars - Information</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Not all players are ready</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Are you sure you want to start this game?
-Not all players are ready.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Teams - Name already taken</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>The team name &apos;%1&apos; is already taken, so your team has been renamed to &apos;%2&apos;.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Please select a file from the list.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Cannot rename file to %1.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Cannot delete file %1.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Welcome to Hedgewars</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Welcome to Hedgewars!
-
-You seem to be new around here. Would you like to play some training missions first to learn the basics of Hedgewars?</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Cannot use the weapon scheme &apos;%1&apos;!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>The connection to the server is lost.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Schemes - Name already taken</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>A scheme with the name &apos;%1&apos; already exists. Your scheme has been renamed to &apos;%2&apos;.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QObject</name>
-    <message>
-        <source>No description available</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QPushButton</name>
-    <message>
-        <source>default</source>
-        <translation>التلقائي</translation>
-    </message>
-    <message>
-        <source>OK</source>
-        <translation>OK</translation>
-    </message>
-    <message>
-        <source>Cancel</source>
-        <translation>الغاء</translation>
-    </message>
-    <message>
-        <source>Start server</source>
-        <translation>تشغيل الخادم</translation>
-    </message>
-    <message>
-        <source>Connect</source>
-        <translation>اتصل</translation>
-    </message>
-    <message>
-        <source>Update</source>
-        <translation type="unfinished">تحديث</translation>
-    </message>
-    <message>
-        <source>Specify</source>
-        <translation>تحديد</translation>
-    </message>
-    <message>
-        <source>Start</source>
-        <translation>ابدا</translation>
-    </message>
-    <message>
-        <source>Go!</source>
-        <translation type="obsolete">ابدا</translation>
-    </message>
-    <message>
-        <source>Play demo</source>
-        <translation>ابدا العرض</translation>
-    </message>
-    <message>
-        <source>Rename</source>
-        <translation>تغيير الاسم</translation>
-    </message>
-    <message>
-        <source>Delete</source>
-        <translation>حذف</translation>
-    </message>
-    <message>
-        <source>Load</source>
-        <translation>تحميل</translation>
-    </message>
-    <message>
-        <source>Associate file extensions</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>More info</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Set default options</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Open videos directory</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Play</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Restore default coding parameters</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Open the video directory in your system</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Play this video</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Delete this video</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Reset</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Set the default server port for Hedgewars</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Invite your friends to your server in just 1 click!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Click to copy your unique server URL to your clipboard. Send this link to your friends and they will be able to join you.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Start private server</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QSpinBox</name>
-    <message>
-        <source>Specify the bitrate of recorded videos as a multiple of 1024 bits per second</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>RoomNamePrompt</name>
-    <message>
-        <source>Enter a name for your room.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Cancel</source>
-        <translation type="unfinished">الغاء</translation>
-    </message>
-    <message>
-        <source>Create room</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>set password</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>RoomsListModel</name>
-    <message>
-        <source>In progress</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Room Name</source>
-        <translation type="unfinished">اسم الغرقة</translation>
-    </message>
-    <message>
-        <source>C</source>
-        <extracomment>Caption of the column for the number of connected clients in the list of rooms</extracomment>
-        <translation type="unfinished">C</translation>
-    </message>
-    <message>
-        <source>T</source>
-        <extracomment>Caption of the column for the number of teams in the list of rooms</extracomment>
-        <translation type="unfinished">T</translation>
-    </message>
-    <message>
-        <source>Owner</source>
-        <translation type="unfinished">المالك</translation>
-    </message>
-    <message>
-        <source>Map</source>
-        <translation type="unfinished">خارطة</translation>
-    </message>
-    <message>
-        <source>Rules</source>
-        <translation type="unfinished">قوانين</translation>
-    </message>
-    <message>
-        <source>Weapons</source>
-        <translation type="unfinished">اسلحة</translation>
-    </message>
-    <message>
-        <source>Random Map</source>
-        <translation type="unfinished">خارطة عشوائية</translation>
-    </message>
-    <message>
-        <source>Random Maze</source>
-        <translation type="unfinished">متاهة عشوائية</translation>
-    </message>
-    <message>
-        <source>Hand-drawn</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Script</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Random Perlin</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Forts</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>SeedPrompt</name>
-    <message>
-        <source>The map seed is the basis for all random values generated by the game.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Cancel</source>
-        <translation type="unfinished">الغاء</translation>
-    </message>
-    <message>
-        <source>Set seed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Close</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Seed</source>
-        <extracomment>Refers to the &quot;random seed&quot;; the source of randomness in the game</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>SelWeaponWidget</name>
-    <message>
-        <source>Weapon set</source>
-        <translation>نمط الاسلحة</translation>
-    </message>
-    <message>
-        <source>Probabilities</source>
-        <translation>احتماليات</translation>
-    </message>
-    <message>
-        <source>Ammo in boxes</source>
-        <translation>العتاد في الصناديق</translation>
-    </message>
-    <message>
-        <source>Delays</source>
-        <translation>التأخير</translation>
-    </message>
-    <message>
-        <source>new</source>
-        <translation type="obsolete">جديد</translation>
-    </message>
-    <message>
-        <source>New</source>
-        <translation type="unfinished">جديد</translation>
-    </message>
-    <message>
-        <source>New (%1)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Copy of %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Copy of %1 (%2)</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>TCPBase</name>
-    <message>
-        <source>Unable to start server at %1.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Unable to run engine at %1
-Error code: %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>The game engine died unexpectedly!
-(exit code %1)
-
-We are very sorry for the inconvenience :(
-
-If this keeps happening, please click the &apos;%2&apos; button in the main menu!</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>TeamSelWidget</name>
-    <message>
-        <source>At least two teams are required to play!</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>ThemePrompt</name>
-    <message>
-        <source>Cancel</source>
-        <translation type="unfinished">الغاء</translation>
-    </message>
-    <message>
-        <source>Search for a theme:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Use selected theme</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Choose a theme</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>binds</name>
-    <message>
-        <source>up</source>
-        <translation>up</translation>
-    </message>
-    <message>
-        <source>left</source>
-        <translation>left</translation>
-    </message>
-    <message>
-        <source>right</source>
-        <translation>right</translation>
-    </message>
-    <message>
-        <source>down</source>
-        <translation>down</translation>
-    </message>
-    <message>
-        <source>attack</source>
-        <translation>attack</translation>
-    </message>
-    <message>
-        <source>precise aim</source>
-        <translation>precise aim</translation>
-    </message>
-    <message>
-        <source>put</source>
-        <translation>put</translation>
-    </message>
-    <message>
-        <source>switch</source>
-        <translation>switch</translation>
-    </message>
-    <message>
-        <source>find hedgehog</source>
-        <translation type="obsolete">find hedgehog</translation>
-    </message>
-    <message>
-        <source>ammo menu</source>
-        <translation>ammo menu</translation>
-    </message>
-    <message>
-        <source>slot 1</source>
-        <translation>slot 1</translation>
-    </message>
-    <message>
-        <source>slot 2</source>
-        <translation>slot 2</translation>
-    </message>
-    <message>
-        <source>slot 3</source>
-        <translation>slot 3</translation>
-    </message>
-    <message>
-        <source>slot 4</source>
-        <translation>slot 4</translation>
-    </message>
-    <message>
-        <source>slot 5</source>
-        <translation>slot 5</translation>
-    </message>
-    <message>
-        <source>slot 6</source>
-        <translation>slot 6</translation>
-    </message>
-    <message>
-        <source>slot 7</source>
-        <translation>slot 7</translation>
-    </message>
-    <message>
-        <source>slot 8</source>
-        <translation>slot 8</translation>
-    </message>
-    <message>
-        <source>slot 9</source>
-        <translation>slot 9</translation>
-    </message>
-    <message>
-        <source>timer 1 sec</source>
-        <translation>timer 1 sec</translation>
-    </message>
-    <message>
-        <source>timer 2 sec</source>
-        <translation>timer 2 sec</translation>
-    </message>
-    <message>
-        <source>timer 3 sec</source>
-        <translation>timer 3 sec</translation>
-    </message>
-    <message>
-        <source>timer 4 sec</source>
-        <translation>timer 4 sec</translation>
-    </message>
-    <message>
-        <source>timer 5 sec</source>
-        <translation>timer 5 sec</translation>
-    </message>
-    <message>
-        <source>chat</source>
-        <translation>chat</translation>
-    </message>
-    <message>
-        <source>chat history</source>
-        <translation>chat history</translation>
-    </message>
-    <message>
-        <source>pause</source>
-        <translation type="vanished">pause</translation>
-    </message>
-    <message>
-        <source>confirmation</source>
-        <translation>confirmation</translation>
-    </message>
-    <message>
-        <source>volume down</source>
-        <translation>volume down</translation>
-    </message>
-    <message>
-        <source>volume up</source>
-        <translation>volume up</translation>
-    </message>
-    <message>
-        <source>change mode</source>
-        <translation>change mode</translation>
-    </message>
-    <message>
-        <source>capture</source>
-        <translation>capture</translation>
-    </message>
-    <message>
-        <source>quit</source>
-        <translation>quit</translation>
-    </message>
-    <message>
-        <source>zoom in</source>
-        <translation>zoom in</translation>
-    </message>
-    <message>
-        <source>zoom out</source>
-        <translation>zoom out</translation>
-    </message>
-    <message>
-        <source>reset zoom</source>
-        <translation>reset zoom</translation>
-    </message>
-    <message>
-        <source>long jump</source>
-        <translation>long jump</translation>
-    </message>
-    <message>
-        <source>high jump</source>
-        <translation>high jump</translation>
-    </message>
-    <message>
-        <source>slot 10</source>
-        <translation type="unfinished">slot 10</translation>
-    </message>
-    <message>
-        <source>mute audio</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>record</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>autocam / find hedgehog</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>speed up replay</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>toggle team bars</source>
-        <extracomment>This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>pause / auto skip</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>toggle hedgehog tags</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>change timer</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>show mission information</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>clan chat</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>binds (categories)</name>
-    <message>
-        <source>Movement</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Weapons</source>
-        <translation type="unfinished">اسلحة</translation>
-    </message>
-    <message>
-        <source>Camera</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Miscellaneous</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>binds (descriptions)</name>
-    <message>
-        <source>Traverse gaps and obstacles by jumping:</source>
-        <translation type="unfinished">قفز فوق الحواجز</translation>
-    </message>
-    <message>
-        <source>Fire your selected weapon or trigger an utility item:</source>
-        <translation type="unfinished">اطلاق السلاح</translation>
-    </message>
-    <message>
-        <source>Pick a weapon or a target location under the cursor:</source>
-        <translation type="unfinished">أخذ السلاح تحت المؤشر</translation>
-    </message>
-    <message>
-        <source>Switch your currently active hog (if possible):</source>
-        <translation type="unfinished">تغيير اختيار اللاعب الحالي</translation>
-    </message>
-    <message>
-        <source>Pick a weapon or utility item:</source>
-        <translation type="unfinished">اختر السلاح</translation>
-    </message>
-    <message>
-        <source>Set the timer on bombs and timed weapons:</source>
-        <translation type="unfinished">وقت الانفجار</translation>
-    </message>
-    <message>
-        <source>Move the camera to the active hog:</source>
-        <translation type="obsolete">الكامرة على اللاعب</translation>
-    </message>
-    <message>
-        <source>Move the cursor or camera without using the mouse:</source>
-        <translation type="unfinished">تحريك الكامرة او اللاعب بلا المؤشر</translation>
-    </message>
-    <message>
-        <source>Modify the camera&apos;s zoom level:</source>
-        <translation type="unfinished">تغيير مدى التقريب البصري</translation>
-    </message>
-    <message>
-        <source>Talk to your team or all participants:</source>
-        <translation type="obsolete">ارسال رسالة لاعضاء الفريق</translation>
-    </message>
-    <message>
-        <source>Pause, continue or leave your game:</source>
-        <translation type="unfinished">توقيف اللعبة، الاستمرار او الغائها</translation>
-    </message>
-    <message>
-        <source>Modify the game&apos;s volume while playing:</source>
-        <translation type="unfinished">تغيير ارتقاع الصوت اثناء اللعبة</translation>
-    </message>
-    <message>
-        <source>Toggle fullscreen mode:</source>
-        <translation type="unfinished">تبديل ملئ الشاشة</translation>
-    </message>
-    <message>
-        <source>Take a screenshot:</source>
-        <translation type="unfinished">خد صورة</translation>
-    </message>
-    <message>
-        <source>Toggle labels above hedgehogs:</source>
-        <translation type="obsolete">تغيير العناوبن فوق اللاعبين</translation>
-    </message>
-    <message>
-        <source>Record video:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Hedgehog movement</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Toggle automatic camera / refocus on active hedgehog:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Demo replay:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Heads-up display:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Talk to your clan or all participants:</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>binds (keys)</name>
-    <message>
-        <source>Keyboard</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Delete</source>
-        <translation>Delete</translation>
-    </message>
-    <message>
-        <source>Mouse: Left button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Mouse: Middle button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Mouse: Right button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Mouse: Wheel up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Mouse: Wheel down</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Backspace</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Tab</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Clear</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Return</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Pause</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Escape</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Space</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 0</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 4</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 5</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 6</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 7</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 8</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 9</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad .</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad /</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad *</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad -</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad +</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Enter</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Equals</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Down</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Insert</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Home</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>End</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Page up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Page down</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Num lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Caps lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Scroll lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right shift</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left shift</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right ctrl</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left ctrl</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right alt</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left alt</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right meta</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left meta</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>A button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>B button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>X button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Y button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>LB button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>RB button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Back button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Start button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left stick</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right stick</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left stick (Right)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left stick (Left)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left stick (Down)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left stick (Up)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left trigger</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right trigger</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right stick (Down)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right stick (Up)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right stick (Right)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right stick (Left)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>D-pad</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Axis %1 %2</source>
-        <extracomment>Game controller axis direction. %1 = axis number, %2 = direction</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Button %1</source>
-        <extracomment>Game controller button. %1 = button number</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>D-pad %1 %2</source>
-        <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>server</name>
-    <message>
-        <source>Nickname is already in use</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>No checker rights</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Authentication failed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>60 seconds cooldown after kick</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>kicked</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Ping timeout</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>New voting started</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>kick</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>map</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>pause</source>
-        <translation type="unfinished">pause</translation>
-    </message>
-    <message>
-        <source>Reconnected too fast</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Warning! Chat flood protection activated</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Excess flood</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Game messages flood detected - 1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Warning! Joins flood protection activated</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>new seed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/maxteams: specify number from 2 to 8</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>The game can&apos;t be started with less than two clans!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Empty config entry.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Access denied.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>You&apos;re not the room master!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Corrupted hedgehogs info!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Too many teams!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Too many hedgehogs!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>There&apos;s already a team with same name in the list.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Joining not possible: Round is in progress.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>This room currently does not allow adding new teams.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Error: The team you tried to remove does not exist.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>You can&apos;t remove a team you don&apos;t own.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Illegal room name! The room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>A room with the same name already exists.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/callvote kick: You need to specify a nickname.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/callvote kick: No such user!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/callvote map: No such map!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/callvote pause: No game in progress!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/callvote hedgehogs: Specify number from 1 to 8.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Illegal room name! A room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>No such room.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Room version incompatible to your Hedgewars version!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Access denied. This room currently doesn&apos;t allow joining.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Access denied. This room is for registered users only.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>You are banned from this room.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Nickname already provided.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Illegal nickname! Nicknames must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Protocol already known.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Bad number.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>There&apos;s no voting going on.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>You already have voted.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Your vote has been counted.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Voting closed.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Pause toggled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Voting expired.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>hedgehogs per team: </source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/info &lt;player&gt;: Show info about player</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/me &lt;message&gt;: Chat action, e.g. &apos;/me eats pizza&apos; becomes &apos;* Player eats pizza&apos;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/rnd: Flip a virtual coin and reply with &apos;heads&apos; or &apos;tails&apos;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/rnd [A] [B] [C] [...]: Reply with a random word from the given list</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/watch &lt;id&gt;: Watch a demo stored on the server with the given ID</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/help: Show chat command help</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/callvote [arguments]: Start a vote</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/vote &lt;yes/no&gt;: Vote &apos;yes&apos; or &apos;no&apos; for active vote</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/delegate &lt;player&gt;: Surrender room control to player</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/maxteams &lt;N&gt;: Limit maximum number of teams to N</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/global &lt;message&gt;: Send global chat message which can be seen by everyone on the server</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/registered_only: Toggle &apos;registered only&apos; state. If enabled, only registered players can join server</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/super_power: Activate your super power. With it you can enter any room and are protected from kicking. Expires when you leave server</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/stats: Query server stats</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/force &lt;yes/no&gt;: Force vote result for active vote</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/fix: Force this room to stay open when it is empty</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/unfix: Undo the /fix command</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>List of lobby chat commands:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>List of room chat commands:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Commands for server admins only:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>room</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>lobby</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>(playing)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>(spectating)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Player is not online.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/force: Please use &apos;yes&apos; or &apos;no&apos;.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/vote: Please use &apos;yes&apos; or &apos;no&apos;.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Kicked</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>This server only allows registered users to join.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>heads</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>tails</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>This server does not support replays!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/greeting [message]: Set or clear greeting message to be shown to players who join the room</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/save &lt;config ID&gt; &lt;config name&gt;: Add current room configuration as votable choice for /callvote map</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/delete &lt;config ID&gt;: Delete a votable room configuration</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/saveroom &lt;file name&gt;: Save all votable room configurations (and the greeting) of this room into a file</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/loadroom &lt;file name&gt;: Load votable room configurations (and greeting) from a file</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>&apos;Registered only&apos; state toggled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Super power activated.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Unknown command or invalid parameters. Say &apos;/help&apos; in chat for a list of commands.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>You can&apos;t kick yourself!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>You can&apos;t kick the only other player!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>The player is not in your room.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>This player is protected from being kicked.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>You&apos;re not the room master or a server admin!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>You&apos;re already the room master.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Greeting message cleared.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Greeting message set.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/callvote kick: This is only allowed in rooms without a room master.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/callvote map: No maps available.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>You&apos;re the new room master!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>/quit: Quit the server</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>This command is only available in the lobby.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>This command is only available in rooms.</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_bg.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_bg.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -78,6 +78,49 @@
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>AbstractPage</name>
@@ -313,21 +356,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -534,10 +581,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Guest</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Room password</source>
         <translation type="unfinished"></translation>
     </message>
@@ -786,6 +829,18 @@
         <source>Click to edit</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation type="unfinished">Зареждане</translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
@@ -899,6 +954,20 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>HatButton</name>
     <message>
         <source>Change hat (%1)</source>
@@ -937,6 +1006,10 @@
         <source>Category</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>LibavInteraction</name>
@@ -977,6 +1050,7 @@
     </message>
     <message>
         <source>Record: %1</source>
+        <extracomment>As in ‘recording’</extracomment>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -1345,6 +1419,29 @@
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
 </context>
 <context>
     <name>PageInGame</name>
@@ -1439,6 +1536,25 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <source>Control</source>
@@ -1665,6 +1781,7 @@
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -1889,6 +2006,7 @@
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2010,10 +2128,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Practice your skills in a range of training missions</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Watch recorded demos</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2021,6 +2135,10 @@
         <source>Load a previously saved game</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -2060,6 +2178,33 @@
         <source>Scenarios</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageVideos</name>
@@ -2688,6 +2833,7 @@
     </message>
     <message>
         <source>% Retreat Time</source>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2703,6 +2849,10 @@
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QLineEdit</name>
@@ -2964,6 +3114,15 @@
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Server redirection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
@@ -3004,7 +3163,7 @@
     </message>
     <message>
         <source>Specify</source>
-        <translation>Указване</translation>
+        <translation type="vanished">Указване</translation>
     </message>
     <message>
         <source>default</source>
@@ -3082,6 +3241,10 @@
         <source>Start private server</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
@@ -3368,7 +3531,7 @@
     </message>
     <message>
         <source>capture</source>
-        <translation>Снимка</translation>
+        <translation type="vanished">Снимка</translation>
     </message>
     <message>
         <source>quit</source>
@@ -3428,7 +3591,7 @@
     </message>
     <message>
         <source>reset zoom</source>
-        <translation>Изчиставане на мащабирането</translation>
+        <translation type="vanished">Изчиставане на мащабирането</translation>
     </message>
     <message>
         <source>long jump</source>
@@ -3483,6 +3646,62 @@
         <source>clan chat</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>binds (categories)</name>
@@ -3504,6 +3723,49 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -3657,74 +3919,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Numpad 0</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 4</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 5</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 6</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 7</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 8</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 9</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad .</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad /</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad *</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad -</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad +</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Enter</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Equals</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Up</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3753,58 +3947,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Page up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Page down</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Num lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Caps lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Scroll lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right shift</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left shift</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right ctrl</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left ctrl</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right alt</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left alt</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right meta</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left meta</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>A button</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3903,6 +4045,609 @@
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation type="unfinished">Оръжия</translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation type="unfinished">Общи</translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -3975,10 +4720,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>The game can&apos;t be started with less than two clans!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4271,10 +5012,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>&apos;Registered only&apos; state toggled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Super power activated.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4338,5 +5075,25 @@
         <source>This command is only available in rooms.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 </TS>
--- a/share/hedgewars/Data/Locale/hedgewars_cs.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_cs.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -78,6 +78,49 @@
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>AbstractPage</name>
@@ -319,21 +362,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -540,10 +587,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Guest</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Room password</source>
         <translation type="unfinished"></translation>
     </message>
@@ -792,6 +835,18 @@
         <source>Click to edit</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation type="unfinished">Nahrát</translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
@@ -905,6 +960,20 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>HatButton</name>
     <message>
         <source>Change hat (%1)</source>
@@ -943,6 +1012,10 @@
         <source>Category</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>LibavInteraction</name>
@@ -983,6 +1056,7 @@
     </message>
     <message>
         <source>Record: %1</source>
+        <extracomment>As in ‘recording’</extracomment>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -1376,6 +1450,32 @@
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
 </context>
 <context>
     <name>PageInGame</name>
@@ -1470,6 +1570,25 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <source>Control</source>
@@ -1696,6 +1815,7 @@
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -1941,6 +2061,7 @@
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2062,10 +2183,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Practice your skills in a range of training missions</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Watch recorded demos</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2073,6 +2190,10 @@
         <source>Load a previously saved game</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -2112,6 +2233,33 @@
         <source>Scenarios</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageVideos</name>
@@ -2741,6 +2889,7 @@
     </message>
     <message>
         <source>% Retreat Time</source>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2756,6 +2905,10 @@
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QLineEdit</name>
@@ -3018,6 +3171,15 @@
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Server redirection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
@@ -3054,7 +3216,7 @@
     </message>
     <message>
         <source>Specify</source>
-        <translation>Upřesnit</translation>
+        <translation type="vanished">Upřesnit</translation>
     </message>
     <message>
         <source>Start</source>
@@ -3136,6 +3298,10 @@
         <source>Start private server</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
@@ -3466,7 +3632,7 @@
     </message>
     <message>
         <source>capture</source>
-        <translation>sejmout</translation>
+        <translation type="vanished">sejmout</translation>
     </message>
     <message>
         <source>quit</source>
@@ -3482,7 +3648,7 @@
     </message>
     <message>
         <source>reset zoom</source>
-        <translation>obnovit přiblížení</translation>
+        <translation type="vanished">obnovit přiblížení</translation>
     </message>
     <message>
         <source>long jump</source>
@@ -3537,6 +3703,62 @@
         <source>clan chat</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>binds (categories)</name>
@@ -3558,6 +3780,49 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -3732,71 +3997,71 @@
     </message>
     <message>
         <source>Numpad 0</source>
-        <translation type="unfinished">Numpad 0</translation>
+        <translation type="obsolete">Numpad 0</translation>
     </message>
     <message>
         <source>Numpad 1</source>
-        <translation type="unfinished">Numpad 1</translation>
+        <translation type="obsolete">Numpad 1</translation>
     </message>
     <message>
         <source>Numpad 2</source>
-        <translation type="unfinished">Numpad 2</translation>
+        <translation type="obsolete">Numpad 2</translation>
     </message>
     <message>
         <source>Numpad 3</source>
-        <translation type="unfinished">Numpad 3</translation>
+        <translation type="obsolete">Numpad 3</translation>
     </message>
     <message>
         <source>Numpad 4</source>
-        <translation type="unfinished">Numpad 4</translation>
+        <translation type="obsolete">Numpad 4</translation>
     </message>
     <message>
         <source>Numpad 5</source>
-        <translation type="unfinished">Numpad 5</translation>
+        <translation type="obsolete">Numpad 5</translation>
     </message>
     <message>
         <source>Numpad 6</source>
-        <translation type="unfinished">Numpad 6</translation>
+        <translation type="obsolete">Numpad 6</translation>
     </message>
     <message>
         <source>Numpad 7</source>
-        <translation type="unfinished">Numpad 7</translation>
+        <translation type="obsolete">Numpad 7</translation>
     </message>
     <message>
         <source>Numpad 8</source>
-        <translation type="unfinished">Numpad 8</translation>
+        <translation type="obsolete">Numpad 8</translation>
     </message>
     <message>
         <source>Numpad 9</source>
-        <translation type="unfinished">Numpad 9</translation>
+        <translation type="obsolete">Numpad 9</translation>
     </message>
     <message>
         <source>Numpad .</source>
-        <translation type="unfinished">Numpad .</translation>
+        <translation type="obsolete">Numpad .</translation>
     </message>
     <message>
         <source>Numpad /</source>
-        <translation type="unfinished">Numpad /</translation>
+        <translation type="obsolete">Numpad /</translation>
     </message>
     <message>
         <source>Numpad *</source>
-        <translation type="unfinished">Numpad *</translation>
+        <translation type="obsolete">Numpad *</translation>
     </message>
     <message>
         <source>Numpad -</source>
-        <translation type="unfinished">Numpad -</translation>
+        <translation type="obsolete">Numpad -</translation>
     </message>
     <message>
         <source>Numpad +</source>
-        <translation type="unfinished">Numpad +</translation>
+        <translation type="obsolete">Numpad +</translation>
     </message>
     <message>
         <source>Enter</source>
-        <translation type="unfinished">Enter</translation>
+        <translation type="obsolete">Enter</translation>
     </message>
     <message>
         <source>Equals</source>
-        <translation type="unfinished">Rovná se</translation>
+        <translation type="obsolete">Rovná se</translation>
     </message>
     <message>
         <source>Up</source>
@@ -3828,55 +4093,55 @@
     </message>
     <message>
         <source>Page up</source>
-        <translation type="unfinished">Page up</translation>
+        <translation type="obsolete">Page up</translation>
     </message>
     <message>
         <source>Page down</source>
-        <translation type="unfinished">Page down</translation>
+        <translation type="obsolete">Page down</translation>
     </message>
     <message>
         <source>Num lock</source>
-        <translation type="unfinished">Num lock</translation>
+        <translation type="obsolete">Num lock</translation>
     </message>
     <message>
         <source>Caps lock</source>
-        <translation type="unfinished">Caps lock</translation>
+        <translation type="obsolete">Caps lock</translation>
     </message>
     <message>
         <source>Scroll lock</source>
-        <translation type="unfinished">Scroll lock</translation>
+        <translation type="obsolete">Scroll lock</translation>
     </message>
     <message>
         <source>Right shift</source>
-        <translation>Pravý shift</translation>
+        <translation type="vanished">Pravý shift</translation>
     </message>
     <message>
         <source>Left shift</source>
-        <translation>Levý shift</translation>
+        <translation type="vanished">Levý shift</translation>
     </message>
     <message>
         <source>Right ctrl</source>
-        <translation type="unfinished">Pravý ctrl</translation>
+        <translation type="obsolete">Pravý ctrl</translation>
     </message>
     <message>
         <source>Left ctrl</source>
-        <translation type="unfinished">Levý ctrl</translation>
+        <translation type="obsolete">Levý ctrl</translation>
     </message>
     <message>
         <source>Right alt</source>
-        <translation>Pravý alt</translation>
+        <translation type="vanished">Pravý alt</translation>
     </message>
     <message>
         <source>Left alt</source>
-        <translation>Levý alt</translation>
+        <translation type="vanished">Levý alt</translation>
     </message>
     <message>
         <source>Right meta</source>
-        <translation type="unfinished">Pravá meta</translation>
+        <translation type="obsolete">Pravá meta</translation>
     </message>
     <message>
         <source>Left meta</source>
-        <translation type="unfinished">Levá meta</translation>
+        <translation type="obsolete">Levá meta</translation>
     </message>
     <message>
         <source>A button</source>
@@ -3977,6 +4242,609 @@
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation type="unfinished">Zbraně</translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation type="unfinished">Obecné</translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -4049,10 +4917,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>The game can&apos;t be started with less than two clans!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4345,10 +5209,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>&apos;Registered only&apos; state toggled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Super power activated.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4412,5 +5272,25 @@
         <source>This command is only available in rooms.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 </TS>
--- a/share/hedgewars/Data/Locale/hedgewars_da.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_da.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -78,6 +78,49 @@
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>AbstractPage</name>
@@ -317,21 +360,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -538,10 +585,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Guest</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Room password</source>
         <translation type="unfinished"></translation>
     </message>
@@ -790,6 +833,18 @@
         <source>Click to edit</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation type="unfinished">Indlæs</translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
@@ -907,6 +962,20 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>HatButton</name>
     <message>
         <source>Change hat (%1)</source>
@@ -945,6 +1014,10 @@
         <source>Category</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>LibavInteraction</name>
@@ -985,6 +1058,7 @@
     </message>
     <message>
         <source>Record: %1</source>
+        <extracomment>As in ‘recording’</extracomment>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -1367,6 +1441,29 @@
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
 </context>
 <context>
     <name>PageInGame</name>
@@ -1461,6 +1558,25 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <source>Control</source>
@@ -1687,6 +1803,7 @@
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -1931,6 +2048,7 @@
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2052,10 +2170,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Practice your skills in a range of training missions</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Watch recorded demos</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2063,6 +2177,10 @@
         <source>Load a previously saved game</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -2102,6 +2220,33 @@
         <source>Scenarios</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageVideos</name>
@@ -2738,6 +2883,7 @@
     </message>
     <message>
         <source>% Retreat Time</source>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2753,6 +2899,10 @@
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QLineEdit</name>
@@ -3014,6 +3164,15 @@
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Server redirection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
@@ -3050,7 +3209,7 @@
     </message>
     <message>
         <source>Specify</source>
-        <translation>Specificer</translation>
+        <translation type="vanished">Specificer</translation>
     </message>
     <message>
         <source>Start</source>
@@ -3132,6 +3291,10 @@
         <source>Start private server</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
@@ -3462,7 +3625,7 @@
     </message>
     <message>
         <source>capture</source>
-        <translation>fang</translation>
+        <translation type="vanished">fang</translation>
     </message>
     <message>
         <source>quit</source>
@@ -3478,7 +3641,7 @@
     </message>
     <message>
         <source>reset zoom</source>
-        <translation>nulstil zoom</translation>
+        <translation type="vanished">nulstil zoom</translation>
     </message>
     <message>
         <source>long jump</source>
@@ -3533,6 +3696,62 @@
         <source>clan chat</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>binds (categories)</name>
@@ -3554,6 +3773,49 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -3728,71 +3990,71 @@
     </message>
     <message>
         <source>Numpad 0</source>
-        <translation>Numpad 0</translation>
+        <translation type="vanished">Numpad 0</translation>
     </message>
     <message>
         <source>Numpad 1</source>
-        <translation>Numpad 1</translation>
+        <translation type="vanished">Numpad 1</translation>
     </message>
     <message>
         <source>Numpad 2</source>
-        <translation>Numpad 2</translation>
+        <translation type="vanished">Numpad 2</translation>
     </message>
     <message>
         <source>Numpad 3</source>
-        <translation>Numpad 3</translation>
+        <translation type="vanished">Numpad 3</translation>
     </message>
     <message>
         <source>Numpad 4</source>
-        <translation>Numpad 4</translation>
+        <translation type="vanished">Numpad 4</translation>
     </message>
     <message>
         <source>Numpad 5</source>
-        <translation>Numpad 5</translation>
+        <translation type="vanished">Numpad 5</translation>
     </message>
     <message>
         <source>Numpad 6</source>
-        <translation>Numpad 6</translation>
+        <translation type="vanished">Numpad 6</translation>
     </message>
     <message>
         <source>Numpad 7</source>
-        <translation>Numpad 7</translation>
+        <translation type="vanished">Numpad 7</translation>
     </message>
     <message>
         <source>Numpad 8</source>
-        <translation>Numpad 8</translation>
+        <translation type="vanished">Numpad 8</translation>
     </message>
     <message>
         <source>Numpad 9</source>
-        <translation>Numpad 9</translation>
+        <translation type="vanished">Numpad 9</translation>
     </message>
     <message>
         <source>Numpad .</source>
-        <translation>Numpad .</translation>
+        <translation type="vanished">Numpad .</translation>
     </message>
     <message>
         <source>Numpad /</source>
-        <translation>Numpad /</translation>
+        <translation type="vanished">Numpad /</translation>
     </message>
     <message>
         <source>Numpad *</source>
-        <translation>Numpad *</translation>
+        <translation type="vanished">Numpad *</translation>
     </message>
     <message>
         <source>Numpad -</source>
-        <translation>Numpad -</translation>
+        <translation type="vanished">Numpad -</translation>
     </message>
     <message>
         <source>Numpad +</source>
-        <translation>Numpad +</translation>
+        <translation type="vanished">Numpad +</translation>
     </message>
     <message>
         <source>Enter</source>
-        <translation>Enter</translation>
+        <translation type="vanished">Enter</translation>
     </message>
     <message>
         <source>Equals</source>
-        <translation>Lig</translation>
+        <translation type="vanished">Lig</translation>
     </message>
     <message>
         <source>Up</source>
@@ -3824,55 +4086,55 @@
     </message>
     <message>
         <source>Page up</source>
-        <translation>Page up</translation>
+        <translation type="vanished">Page up</translation>
     </message>
     <message>
         <source>Page down</source>
-        <translation>Page down</translation>
+        <translation type="vanished">Page down</translation>
     </message>
     <message>
         <source>Num lock</source>
-        <translation>Num lock</translation>
+        <translation type="vanished">Num lock</translation>
     </message>
     <message>
         <source>Caps lock</source>
-        <translation>Caps lock</translation>
+        <translation type="vanished">Caps lock</translation>
     </message>
     <message>
         <source>Scroll lock</source>
-        <translation>Scroll lock</translation>
+        <translation type="vanished">Scroll lock</translation>
     </message>
     <message>
         <source>Right shift</source>
-        <translation>Højre shift</translation>
+        <translation type="vanished">Højre shift</translation>
     </message>
     <message>
         <source>Left shift</source>
-        <translation>Venstre shift</translation>
+        <translation type="vanished">Venstre shift</translation>
     </message>
     <message>
         <source>Right ctrl</source>
-        <translation>Højre ctrl</translation>
+        <translation type="vanished">Højre ctrl</translation>
     </message>
     <message>
         <source>Left ctrl</source>
-        <translation>Venstre ctrl</translation>
+        <translation type="vanished">Venstre ctrl</translation>
     </message>
     <message>
         <source>Right alt</source>
-        <translation>Højre alt</translation>
+        <translation type="vanished">Højre alt</translation>
     </message>
     <message>
         <source>Left alt</source>
-        <translation>Venstre alt</translation>
+        <translation type="vanished">Venstre alt</translation>
     </message>
     <message>
         <source>Right meta</source>
-        <translation>Højre meta</translation>
+        <translation type="vanished">Højre meta</translation>
     </message>
     <message>
         <source>Left meta</source>
-        <translation>Venstre meta</translation>
+        <translation type="vanished">Venstre meta</translation>
     </message>
     <message>
         <source>A button</source>
@@ -3977,6 +4239,609 @@
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation type="unfinished">Våben</translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation type="unfinished">Generelt</translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -4049,10 +4914,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>The game can&apos;t be started with less than two clans!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4345,10 +5206,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>&apos;Registered only&apos; state toggled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Super power activated.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4412,5 +5269,25 @@
         <source>This command is only available in rooms.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 </TS>
--- a/share/hedgewars/Data/Locale/hedgewars_de.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_de.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -90,6 +90,49 @@
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_ttf&lt;/a&gt;: %1.%2.%3</source>
         <translation>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_ttf&lt;/a&gt;: %1.%2.%3</translation>
     </message>
+    <message>
+        <source>Credits</source>
+        <translation>Mitwirkende</translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation>Andere Leute</translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation>%1 (alias %2)</translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation>%1 &amp;lt;%2&amp;gt;</translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation>%1: %2</translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation>%1: %2 &amp;lt;%3&amp;gt;</translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation>Mehr Mitwirkende</translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation>Eine erweiterte Liste der Mitwirkenden kann in der CREDITS-Textdatei gefunden werden.</translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation>Unbekannter Compiler: %1</translation>
+    </message>
 </context>
 <context>
     <name>AbstractPage</name>
@@ -337,7 +380,7 @@
     </message>
     <message>
         <source>Scheme &apos;%1&apos; not supported</source>
-        <translation>Das Spielprofil »%1« wird nicht unterstützt</translation>
+        <translation>Das Schema »%1« wird nicht unterstützt</translation>
     </message>
     <message>
         <source>Cannot create directory %1</source>
@@ -356,21 +399,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation>Verwendung</translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation>SCHALTER</translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
         <translation>VERBINDUNGSTEXT</translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation>Schalter</translation>
     </message>
     <message>
@@ -591,7 +638,7 @@
     </message>
     <message>
         <source>Guest</source>
-        <translation>Gast</translation>
+        <translation type="vanished">Gast</translation>
     </message>
     <message>
         <source>Room password</source>
@@ -770,13 +817,11 @@
     </message>
     <message>
         <source>Load map drawing</source>
-        <translation>Gezeichnete
-Karte laden</translation>
+        <translation>Gezeichnete Karte laden</translation>
     </message>
     <message>
         <source>Edit map drawing</source>
-        <translation>Gezeichnete
-Karte bearbeiten</translation>
+        <translation>Gezeichnete Karte bearbeiten</translation>
     </message>
     <message>
         <source>Small islands</source>
@@ -878,6 +923,18 @@
         <source>Style:</source>
         <translation>Stil:</translation>
     </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation>Größe der gemalten Karte skalieren</translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation>Laden</translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation>Bearbeiten</translation>
+    </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
@@ -1007,6 +1064,27 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation>Ein kritischer FEHLER ist bei der Verarbeitung der Videoaufzeichnung aufgetreten! Das Video konnte nicht gespeichert werden.
+
+Als Notlösung könntest du versuchen, die Hedgewars-Videoaufzeichnungseinstellungen auf die Standardeinstellungen zurückzusetzen.
+
+Um diesen Fehler zu melden, klicke auf den Knopf »Feedback« im Hauptmenü!
+
+Die letzte Meldung der Engine lautet:
+%1</translation>
+    </message>
+</context>
+<context>
     <name>HWUploadVideoDialog</name>
     <message>
         <source>Upload video</source>
@@ -1056,6 +1134,10 @@
         <source>Category</source>
         <translation>Kategorie</translation>
     </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation>Achtung: Die gleiche Taste wurde mehrfach zugewiesen!</translation>
+    </message>
 </context>
 <context>
     <name>LibavInteraction</name>
@@ -1115,6 +1197,7 @@
     </message>
     <message>
         <source>Record: %1</source>
+        <extracomment>As in ‘recording’</extracomment>
         <translation>Aufzeichnung: %1</translation>
     </message>
     <message>
@@ -1375,7 +1458,7 @@
     </message>
     <message>
         <source>Select an action to choose a custom key bind for this team</source>
-        <translation>Wählt eine Aktion, um eine benutzerdefinierte Taste für dieses Team auszuwählen</translation>
+        <translation>Wähle eine Aktion, um eine benutzerdefinierte Taste für dieses Team auszuwählen</translation>
     </message>
     <message>
         <source>Use my default</source>
@@ -1549,6 +1632,29 @@
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation>Da alle die gleiche Klanfarbe hatten, gab es keinen Grund für einen Kampf. Und wenn sie nicht gestorben sind, dann leben die Igel noch heute in Frieden.</translation>
     </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation>
+            <numerusform>(%1 Punkt)</numerusform>
+            <numerusform>(%1 Punkte)</numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation>
+            <numerusform>(%L1 Sekunde)</numerusform>
+            <numerusform>(%L1 Sekunden)</numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation>
+            <numerusform>(%1 Kiste)</numerusform>
+            <numerusform>(%1 Kisten)</numerusform>
+        </translation>
+    </message>
 </context>
 <context>
     <name>PageInGame</name>
@@ -1561,7 +1667,7 @@
     <name>PageInfo</name>
     <message>
         <source>Open the snapshot folder</source>
-        <translation>Screenshot-Verzeichnis öffnen</translation>
+        <translation>Bildschirmfoto-Verzeichnis öffnen</translation>
     </message>
 </context>
 <context>
@@ -1643,6 +1749,25 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation>Zum gewählten Server verbinden</translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation>Liste der Server aktualisieren</translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation>Die Adresse und Portnummer eines bekannten Servers festlegen und eine Verbindung aufbauen</translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation>Privaten Server starten</translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <source>Control</source>
@@ -1864,6 +1989,7 @@
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
         <translation>FEHLENDER SPRACHNAME [%1]</translation>
     </message>
     <message>
@@ -2105,6 +2231,7 @@
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation>Basisschaden und -rückschlag in Prozent</translation>
     </message>
     <message>
@@ -2239,7 +2366,7 @@
     </message>
     <message>
         <source>Practice your skills in a range of training missions</source>
-        <translation>Deine Fähigkeiten in verschiedenen Trainingsmissionen verbessern</translation>
+        <translation type="vanished">Deine Fähigkeiten in verschiedenen Trainingsmissionen verbessern</translation>
     </message>
     <message>
         <source>Watch recorded demos</source>
@@ -2249,6 +2376,10 @@
         <source>Load a previously saved game</source>
         <translation>Ein vormals gespeichertes Spiel ansehen</translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation>Einzelspielermissionen: Lerne in Übungen, wie man spielt, verbessere deine Fähigkeiten in Herausforderungen oder versuche, Ziele in Szenarios abzuschließen.</translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -2292,6 +2423,33 @@
         <source>Start fighting</source>
         <translation>Auf in den Kampf!</translation>
     </message>
+    <message>
+        <source>Team</source>
+        <translation>Team</translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation>Team-Punkterekord: %1</translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation>Niedrigste Team-Punktzahl: %1</translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation>Beste Treffgenauigkeit des Teams: %1%</translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation>Team-Bestzeit: %L1 s</translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation>Längste Zeit des Teams: %L1 s</translation>
+    </message>
 </context>
 <context>
     <name>PageVideos</name>
@@ -2435,7 +2593,7 @@
     </message>
     <message>
         <source>Show FPS</source>
-        <translation>Bildwiederholrate anzeigen</translation>
+        <translation>Bildrate anzeigen</translation>
     </message>
     <message>
         <source>Alternative damage show</source>
@@ -2729,7 +2887,7 @@
     </message>
     <message>
         <source>FPS limit</source>
-        <translation>Bildwiederholratenbegrenzung (Hz)</translation>
+        <translation>Maximale Bildrate</translation>
     </message>
     <message>
         <source>Server name:</source>
@@ -2781,6 +2939,7 @@
     </message>
     <message>
         <source>% Retreat Time</source>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
         <translation>% Rückzugszeit</translation>
     </message>
     <message>
@@ -3008,6 +3167,10 @@
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
         <translation>CAPTCHA&lt;br&gt;laden …</translation>
     </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation>Zoom (%)</translation>
+    </message>
 </context>
 <context>
     <name>QLineEdit</name>
@@ -3350,6 +3513,16 @@
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation>Ein Arsenal mit dem Namen »%1« existiert bereits. Die am Arsenal vorgenommenen Änderungen wurden verworfen.</translation>
     </message>
+    <message>
+        <source>Server redirection</source>
+        <translation>Server-Umleitung</translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation>Dieser Server unterstützt sichere Verbindungen an Port %1.
+Möchtest du dich sicher neu verbinden?</translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
@@ -3390,7 +3563,7 @@
     </message>
     <message>
         <source>Specify</source>
-        <translation>Verbinden zu …</translation>
+        <translation type="vanished">Verbinden zu …</translation>
     </message>
     <message>
         <source>Start</source>
@@ -3488,6 +3661,10 @@
         <source>Upload this video to your YouTube account</source>
         <translation type="vanished">Dieses Video zu deinem YouTube-Benutzerkonto hochladen</translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation>Adresse festlegen</translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
@@ -3784,23 +3961,23 @@
     </message>
     <message>
         <source>timer 1 sec</source>
-        <translation>Timer 1 Sek.</translation>
+        <translation>Zeitzünder 1 Sek.</translation>
     </message>
     <message>
         <source>timer 2 sec</source>
-        <translation>Timer 2 Sek.</translation>
+        <translation>Zeitzünder 2 Sek.</translation>
     </message>
     <message>
         <source>timer 3 sec</source>
-        <translation>Timer 3 Sek.</translation>
+        <translation>Zeitzünder 3 Sek.</translation>
     </message>
     <message>
         <source>timer 4 sec</source>
-        <translation>Timer 4 Sek.</translation>
+        <translation>Zeitzünder 4 Sek.</translation>
     </message>
     <message>
         <source>timer 5 sec</source>
-        <translation>Timer 5 Sek.</translation>
+        <translation>Zeitzünder 5 Sek.</translation>
     </message>
     <message>
         <source>pause</source>
@@ -3820,7 +3997,7 @@
     </message>
     <message>
         <source>capture</source>
-        <translation>Bildschirmfoto</translation>
+        <translation type="vanished">Bildschirmfoto</translation>
     </message>
     <message>
         <source>quit</source>
@@ -3852,7 +4029,7 @@
     </message>
     <message>
         <source>reset zoom</source>
-        <translation>Zurücksetzen</translation>
+        <translation type="vanished">Zurücksetzen</translation>
     </message>
     <message>
         <source>long jump</source>
@@ -3905,7 +4082,7 @@
     </message>
     <message>
         <source>change timer</source>
-        <translation>Timer ändern</translation>
+        <translation>Zeitzünder ändern</translation>
     </message>
     <message>
         <source>show mission information</source>
@@ -3915,6 +4092,62 @@
         <source>clan chat</source>
         <translation>Klanchat</translation>
     </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation>Waffe abwählen</translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation>Auf rutschigem Land still stehen</translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation>Richtung ohne Bewegung ändern</translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation>Rückwärts wechseln</translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation>Sprungkraft ändern</translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation>Zoom zum Standardwert zurücksetzen</translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation>Zoom auf 100% setzen</translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation>Landschaft als Bild speichern</translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation>Objektinformationen anzeigen</translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation>Igelschildtypen ändern</translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation>Igelschild-Transluzenz umschalten</translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation>HUD umschalten</translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation>Rückwärtssprung</translation>
+    </message>
+    <message>
+        <source>screenshot</source>
+        <translation>Bildschirmfoto</translation>
+    </message>
 </context>
 <context>
     <name>binds (categories)</name>
@@ -3936,6 +4169,53 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation>Genaues Zielen gedrückt halten</translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation>Genaues Zielen + links/rechts</translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation>Genaues Zielen + wechseln</translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation>Genaues Zielen + Zeitzünder</translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation>Genaues Zielen + Zoom zurücksetzen</translation>
+    </message>
+    <message>
+        <source>precise + capture</source>
+        <translation type="vanished">Genaues Zielen + Screenshot</translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation>Genaues Zielen + Igelschilder umschalten</translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation>Wechseln + Igelschilder umschalten</translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation>Genaues Zielen + wechseln + Igelschilder umschalten</translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation>Hochsprung (doppelt)</translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation>Genaues Zielen + Bildschirmfoto</translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -3991,7 +4271,7 @@
     </message>
     <message>
         <source>Take a screenshot:</source>
-        <translation>Screenshot machen:</translation>
+        <translation>Bildschirmfoto machen:</translation>
     </message>
     <message>
         <source>Toggle labels above hedgehogs:</source>
@@ -4110,71 +4390,71 @@
     </message>
     <message>
         <source>Numpad 0</source>
-        <translation>Ziffernblock 0</translation>
+        <translation type="vanished">Ziffernblock 0</translation>
     </message>
     <message>
         <source>Numpad 1</source>
-        <translation>Ziffernblock 1</translation>
+        <translation type="vanished">Ziffernblock 1</translation>
     </message>
     <message>
         <source>Numpad 2</source>
-        <translation>Ziffernblock 2</translation>
+        <translation type="vanished">Ziffernblock 2</translation>
     </message>
     <message>
         <source>Numpad 3</source>
-        <translation>Ziffernblock 3</translation>
+        <translation type="vanished">Ziffernblock 3</translation>
     </message>
     <message>
         <source>Numpad 4</source>
-        <translation>Ziffernblock 4</translation>
+        <translation type="vanished">Ziffernblock 4</translation>
     </message>
     <message>
         <source>Numpad 5</source>
-        <translation>Ziffernblock 5</translation>
+        <translation type="vanished">Ziffernblock 5</translation>
     </message>
     <message>
         <source>Numpad 6</source>
-        <translation>Ziffernblock 6</translation>
+        <translation type="vanished">Ziffernblock 6</translation>
     </message>
     <message>
         <source>Numpad 7</source>
-        <translation>Ziffernblock 7</translation>
+        <translation type="vanished">Ziffernblock 7</translation>
     </message>
     <message>
         <source>Numpad 8</source>
-        <translation>Ziffernblock 8</translation>
+        <translation type="vanished">Ziffernblock 8</translation>
     </message>
     <message>
         <source>Numpad 9</source>
-        <translation>Ziffernblock 9</translation>
+        <translation type="vanished">Ziffernblock 9</translation>
     </message>
     <message>
         <source>Numpad .</source>
-        <translation>Ziffernblock ,</translation>
+        <translation type="vanished">Ziffernblock ,</translation>
     </message>
     <message>
         <source>Numpad /</source>
-        <translation>Ziffernblock /</translation>
+        <translation type="vanished">Ziffernblock /</translation>
     </message>
     <message>
         <source>Numpad *</source>
-        <translation>Ziffernblock *</translation>
+        <translation type="vanished">Ziffernblock *</translation>
     </message>
     <message>
         <source>Numpad -</source>
-        <translation>Ziffernblock -</translation>
+        <translation type="vanished">Ziffernblock -</translation>
     </message>
     <message>
         <source>Numpad +</source>
-        <translation>Ziffernblock +</translation>
+        <translation type="vanished">Ziffernblock +</translation>
     </message>
     <message>
         <source>Enter</source>
-        <translation>Enter</translation>
+        <translation type="vanished">Enter</translation>
     </message>
     <message>
         <source>Equals</source>
-        <translation>Gleich</translation>
+        <translation type="vanished">Gleich</translation>
     </message>
     <message>
         <source>Up</source>
@@ -4206,55 +4486,55 @@
     </message>
     <message>
         <source>Page up</source>
-        <translation>Bild auf</translation>
+        <translation type="vanished">Bild auf</translation>
     </message>
     <message>
         <source>Page down</source>
-        <translation>Bild ab</translation>
+        <translation type="vanished">Bild ab</translation>
     </message>
     <message>
         <source>Num lock</source>
-        <translation>Numlock</translation>
+        <translation type="vanished">Numlock</translation>
     </message>
     <message>
         <source>Caps lock</source>
-        <translation>Feststelltaste</translation>
+        <translation type="vanished">Feststelltaste</translation>
     </message>
     <message>
         <source>Scroll lock</source>
-        <translation>Rollen</translation>
+        <translation type="vanished">Rollen</translation>
     </message>
     <message>
         <source>Right shift</source>
-        <translation>Umschalt rechts</translation>
+        <translation type="vanished">Umschalt rechts</translation>
     </message>
     <message>
         <source>Left shift</source>
-        <translation>Umschalt links</translation>
+        <translation type="vanished">Umschalt links</translation>
     </message>
     <message>
         <source>Right ctrl</source>
-        <translation>Strg rechts</translation>
+        <translation type="vanished">Strg rechts</translation>
     </message>
     <message>
         <source>Left ctrl</source>
-        <translation>Strg links</translation>
+        <translation type="vanished">Strg links</translation>
     </message>
     <message>
         <source>Right alt</source>
-        <translation>Alt rechts</translation>
+        <translation type="vanished">Alt rechts</translation>
     </message>
     <message>
         <source>Left alt</source>
-        <translation>Alt links</translation>
+        <translation type="vanished">Alt links</translation>
     </message>
     <message>
         <source>Right meta</source>
-        <translation>Meta rechts</translation>
+        <translation type="vanished">Meta rechts</translation>
     </message>
     <message>
         <source>Left meta</source>
-        <translation>Meta links</translation>
+        <translation type="vanished">Meta links</translation>
     </message>
     <message>
         <source>A button</source>
@@ -4359,6 +4639,609 @@
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
         <translation>D-Pad %1 %2</translation>
     </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation>(Nicht benutzen)</translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
+        <translation>Maus: X1-Taste</translation>
+    </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation>Maus: X2-Taste</translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation>Ziffernblock 0</translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation>Ziffernblock 1</translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation>Ziffernblock 2</translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation>Ziffernblock 3</translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation>Ziffernblock 4</translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation>Ziffernblock 5</translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation>Ziffernblock 6</translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation>Ziffernblock 7</translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation>Ziffernblock 8</translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation>Ziffernblock 9</translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation>Ziffernblock ,</translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation>Ziffernblock /</translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation>Ziffernblock *</translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation>Ziffernblock -</translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation>Ziffernblock +</translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation>Ziffernblock Enter</translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation>Bild auf</translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation>Bild ab</translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation>Numlock</translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation>Feststelltaste</translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation>Rollen</translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation>Umschalt rechts</translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation>Umschalt links</translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation>Strg rechts</translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation>Strg links</translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation>Alt rechts</translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation>Alt links</translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation>GUI rechts</translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation>GUI links</translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation>(QWERTY)</translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation>Menü</translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation>Programmierung</translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation>Spiel-Engine</translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation>Ersteller</translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation>Viele Engine-Verbesserungen</translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation>Gamepad- und Lua-Integration</translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation>Kampagnenunterstützung</translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation>Mehr Anpassungsmöglichkeiten für Szenerien</translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation>Arbeit an Pas2C und GLES2</translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation>Videoaufzeichnung</translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation>Sonstige Verbesserungen</translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation>Kartengenerierung</translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation>Hauptkartengeneratoren</translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation>Perlinkarten und andere Verbesserungen</translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation>Labyrinthkarten</translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation>Waffen</translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation>Die meisten Hauptwaffen</translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation>Luftmine, Gummi, Andere</translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation>Bohrkopfrakete, Ballkanone, Funkflugzeug</translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation>Eiskanone</translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation>Einstellungen für Mineanzahl und -zeitzünder</translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation>Benutzeroberfläche / Hauptmenü</translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation>Viele Benutzeroberflächenverbesserungen</translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation>Bedienelemente für Tastenbelegung, Feedback, Karten und Hüte</translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation>Login-Dialoge, andere Verbesserungen</translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation>Missionen und Stile</translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation>Ein klassisches Märchen</translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation>Ein Weltraumabenteuer</translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation>Erstellte Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation>Übungen, Zeitrennen, Zielübungen, Bazookaschlachtfeld, Tentakel-Terror, Großes Arsenal, Fehlerkorrekturen und Wartung</translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation>Einige Stile und Missionen</translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation>Battalion</translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation>Continental supplies</translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation>Teamwork 2</translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation>Nach Hause klettern</translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation>Knifflige Portalherausforderung</translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation>Spielserver</translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation>Portierungen</translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation>macOS-/iPhone-Portierung, OpenGL-ES-Konvertierung</translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation>Android-Portierung</translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation>Android-Netzwerkspiel, Portierbarkeitsabstraktion</translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation>WebGL-Portierung</translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation>iPhone-/iPad-Portierungen</translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation>Grafik</translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation>Allgemein</translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation>Szenerien</translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation>Nature, Snow, City, Castle, Halloween, Island</translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation>Bamboo, EarthRise, BambooPlinko</translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation>Golf, Hoggywood, Stage</translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation>Hoggywood</translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation>Cave, Olympics</translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation>Fruit, Cake</translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation>Art</translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation>Beach</translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation>Brick</translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation>Hell</translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation>Jungle</translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation>Sheep</translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation>Karten</translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation>Castle, PirateFlag</translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation>ShoppaKing, TrophyRace</translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation>Battlefield</translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation>CTF_Blizzard</translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation>Cheese</translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation>ClimbHome</translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation>Lonely_Island</translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation>Octorama</translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation>portal</translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation>Ruler</translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation>Sticks</translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation>Festungen</translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation>EvilChicken</translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation>Olympic</translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation>Tank</translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation>Snail</translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation>SteelTower</translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation>Hüte, Grabsteine, Sonstiges</translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation>Siehe CREDITS-Textdatei</translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation>Toneffekte</translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation>Igelstimme</translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation>»Default_pl«- und »Russian_pl«-Stimmen</translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation>Diverse Autoren von www.freesound.org (siehe CREDITS-Textdatei)</translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation>Musik</translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation>City, Rock, andere</translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation>Compost</translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation>EarthRise, oriental, Pirate, snow</translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation>Fruit, Jungle</translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation>Nature</translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation>olympics_sd</translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation>sdmusic (Hitman [sheepluva edit])</translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation>Übersetzungen</translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation>Brasilianisches Portugiesisch</translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation>Bulgarisch</translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation>Tschechisch</translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation>Chinesisch</translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation>Finnisch</translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation>Französisch</translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation>Deutsch</translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation>Griechisch</translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation>Italienisch</translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation>Japanisch</translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation>Koreanisch</translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation>Litauisch</translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation>Polnisch</translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation>Portugiesisch</translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation>Russisch</translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation>Schottisch-Gälisch</translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation>Slowakisch</translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation>Spanisch</translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation>Schwedisch</translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation>Ukrainisch</translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation>Besonderes Dankeschön</translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation>Projektgründer</translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -4448,7 +5331,7 @@
     </message>
     <message>
         <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation>Verfügbare »callvote«-Befehle: kick &lt;Spitzname&gt;, map &lt;Name&gt;, pause, newseed, hedgehogs</translation>
+        <translation type="vanished">Verfügbare »callvote«-Befehle: kick &lt;Spitzname&gt;, map &lt;Name&gt;, pause, newseed, hedgehogs</translation>
     </message>
     <message>
         <source>callvote kick: specify nickname</source>
@@ -4907,7 +5790,7 @@
     </message>
     <message>
         <source>&apos;Registered only&apos; state toggled.</source>
-        <translation>»Registered only«-Zustand umgeschaltet.</translation>
+        <translation type="vanished">»Registered only«-Zustand umgeschaltet.</translation>
     </message>
     <message>
         <source>Super power activated.</source>
@@ -4973,5 +5856,25 @@
         <source>This command is only available in rooms.</source>
         <translation>Dieser Befehl ist nur in Räumen verfügbar.</translation>
     </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation>Dieser Server lässt unregistrierte Spieler nicht mehr rein.</translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation>Dieser Server lässt ab jetzt unregistrierte Spieler zu.</translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation>Verfügbare callvote-Befehle: hedgehogs &lt;Anzahl&gt;, pause, newseed, map &lt;Name&gt;, kick &lt;Spieler&gt;</translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation>Bitte Serverneustart mit »/restart_server yes« bestätigen.</translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation>Achtung! Zu viele Raumnamensänderungen in kurzer Zeit; Schutz aktiviert</translation>
+    </message>
 </context>
 </TS>
--- a/share/hedgewars/Data/Locale/hedgewars_el.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_el.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -78,6 +78,49 @@
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>AbstractPage</name>
@@ -309,21 +352,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -532,10 +579,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Guest</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Room password</source>
         <translation type="unfinished"></translation>
     </message>
@@ -784,6 +827,18 @@
         <source>Click to edit</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation type="unfinished">Φόρτωση</translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
@@ -897,6 +952,20 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>HatButton</name>
     <message>
         <source>Change hat (%1)</source>
@@ -935,6 +1004,10 @@
         <source>Category</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>LibavInteraction</name>
@@ -975,6 +1048,7 @@
     </message>
     <message>
         <source>Record: %1</source>
+        <extracomment>As in ‘recording’</extracomment>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -1357,6 +1431,29 @@
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
 </context>
 <context>
     <name>PageInGame</name>
@@ -1451,6 +1548,25 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <source>Control</source>
@@ -1677,6 +1793,7 @@
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -1921,6 +2038,7 @@
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2042,10 +2160,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Practice your skills in a range of training missions</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Watch recorded demos</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2053,6 +2167,10 @@
         <source>Load a previously saved game</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -2092,6 +2210,33 @@
         <source>Scenarios</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageVideos</name>
@@ -2716,6 +2861,7 @@
     </message>
     <message>
         <source>% Retreat Time</source>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2731,6 +2877,10 @@
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QLineEdit</name>
@@ -2992,6 +3142,15 @@
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Server redirection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
@@ -3028,7 +3187,7 @@
     </message>
     <message>
         <source>Specify</source>
-        <translation type="unfinished">Καθορισμός</translation>
+        <translation type="obsolete">Καθορισμός</translation>
     </message>
     <message>
         <source>Start</source>
@@ -3110,6 +3269,10 @@
         <source>Start private server</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
@@ -3436,7 +3599,7 @@
     </message>
     <message>
         <source>capture</source>
-        <translation type="unfinished">αιχμαλώτιση</translation>
+        <translation type="obsolete">αιχμαλώτιση</translation>
     </message>
     <message>
         <source>quit</source>
@@ -3452,7 +3615,7 @@
     </message>
     <message>
         <source>reset zoom</source>
-        <translation type="unfinished">επαναφορά μεγέθυνσης</translation>
+        <translation type="obsolete">επαναφορά μεγέθυνσης</translation>
     </message>
     <message>
         <source>long jump</source>
@@ -3507,6 +3670,62 @@
         <source>clan chat</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>binds (categories)</name>
@@ -3528,6 +3747,49 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -3702,71 +3964,71 @@
     </message>
     <message>
         <source>Numpad 0</source>
-        <translation type="unfinished">Numpad 0</translation>
+        <translation type="obsolete">Numpad 0</translation>
     </message>
     <message>
         <source>Numpad 1</source>
-        <translation type="unfinished">Numpad 1</translation>
+        <translation type="obsolete">Numpad 1</translation>
     </message>
     <message>
         <source>Numpad 2</source>
-        <translation type="unfinished">Numpad 2</translation>
+        <translation type="obsolete">Numpad 2</translation>
     </message>
     <message>
         <source>Numpad 3</source>
-        <translation type="unfinished">Numpad 3</translation>
+        <translation type="obsolete">Numpad 3</translation>
     </message>
     <message>
         <source>Numpad 4</source>
-        <translation type="unfinished">Numpad 4</translation>
+        <translation type="obsolete">Numpad 4</translation>
     </message>
     <message>
         <source>Numpad 5</source>
-        <translation type="unfinished">Numpad 5</translation>
+        <translation type="obsolete">Numpad 5</translation>
     </message>
     <message>
         <source>Numpad 6</source>
-        <translation type="unfinished">Numpad 6</translation>
+        <translation type="obsolete">Numpad 6</translation>
     </message>
     <message>
         <source>Numpad 7</source>
-        <translation type="unfinished">Numpad 7</translation>
+        <translation type="obsolete">Numpad 7</translation>
     </message>
     <message>
         <source>Numpad 8</source>
-        <translation type="unfinished">Numpad 8</translation>
+        <translation type="obsolete">Numpad 8</translation>
     </message>
     <message>
         <source>Numpad 9</source>
-        <translation type="unfinished">Numpad 9</translation>
+        <translation type="obsolete">Numpad 9</translation>
     </message>
     <message>
         <source>Numpad .</source>
-        <translation type="unfinished">Numpad .</translation>
+        <translation type="obsolete">Numpad .</translation>
     </message>
     <message>
         <source>Numpad /</source>
-        <translation type="unfinished">Numpad /</translation>
+        <translation type="obsolete">Numpad /</translation>
     </message>
     <message>
         <source>Numpad *</source>
-        <translation type="unfinished">Numpad *</translation>
+        <translation type="obsolete">Numpad *</translation>
     </message>
     <message>
         <source>Numpad -</source>
-        <translation type="unfinished">Numpad -</translation>
+        <translation type="obsolete">Numpad -</translation>
     </message>
     <message>
         <source>Numpad +</source>
-        <translation type="unfinished">Numpad +</translation>
+        <translation type="obsolete">Numpad +</translation>
     </message>
     <message>
         <source>Enter</source>
-        <translation type="unfinished">Enter</translation>
+        <translation type="obsolete">Enter</translation>
     </message>
     <message>
         <source>Equals</source>
-        <translation type="unfinished">Ίσον</translation>
+        <translation type="obsolete">Ίσον</translation>
     </message>
     <message>
         <source>Up</source>
@@ -3798,55 +4060,55 @@
     </message>
     <message>
         <source>Page up</source>
-        <translation type="unfinished">Page up</translation>
+        <translation type="obsolete">Page up</translation>
     </message>
     <message>
         <source>Page down</source>
-        <translation type="unfinished">Page down</translation>
+        <translation type="obsolete">Page down</translation>
     </message>
     <message>
         <source>Num lock</source>
-        <translation type="unfinished">Num lock</translation>
+        <translation type="obsolete">Num lock</translation>
     </message>
     <message>
         <source>Caps lock</source>
-        <translation type="unfinished">Caps lock</translation>
+        <translation type="obsolete">Caps lock</translation>
     </message>
     <message>
         <source>Scroll lock</source>
-        <translation type="unfinished">Scroll lock</translation>
+        <translation type="obsolete">Scroll lock</translation>
     </message>
     <message>
         <source>Right shift</source>
-        <translation type="unfinished">Δεξί Shift</translation>
+        <translation type="obsolete">Δεξί Shift</translation>
     </message>
     <message>
         <source>Left shift</source>
-        <translation type="unfinished">Αριστερό Shift</translation>
+        <translation type="obsolete">Αριστερό Shift</translation>
     </message>
     <message>
         <source>Right ctrl</source>
-        <translation type="unfinished">Δεξί Ctrl</translation>
+        <translation type="obsolete">Δεξί Ctrl</translation>
     </message>
     <message>
         <source>Left ctrl</source>
-        <translation type="unfinished">Αριστερό Ctrl</translation>
+        <translation type="obsolete">Αριστερό Ctrl</translation>
     </message>
     <message>
         <source>Right alt</source>
-        <translation type="unfinished">Δεξί Alt</translation>
+        <translation type="obsolete">Δεξί Alt</translation>
     </message>
     <message>
         <source>Left alt</source>
-        <translation type="unfinished">Αριστερό Alt</translation>
+        <translation type="obsolete">Αριστερό Alt</translation>
     </message>
     <message>
         <source>Right meta</source>
-        <translation type="unfinished">Δεξί meta</translation>
+        <translation type="obsolete">Δεξί meta</translation>
     </message>
     <message>
         <source>Left meta</source>
-        <translation type="unfinished">Αριστερό meta</translation>
+        <translation type="obsolete">Αριστερό meta</translation>
     </message>
     <message>
         <source>A button</source>
@@ -3951,6 +4213,609 @@
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation type="unfinished">Όπλα</translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation type="unfinished">Γενικά</translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -4023,10 +4888,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>The game can&apos;t be started with less than two clans!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4319,10 +5180,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>&apos;Registered only&apos; state toggled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Super power activated.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4386,5 +5243,25 @@
         <source>This command is only available in rooms.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 </TS>
--- a/share/hedgewars/Data/Locale/hedgewars_en.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_en.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -78,6 +78,49 @@
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</translation>
     </message>
+    <message>
+        <source>Credits</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation></translation>
+    </message>
 </context>
 <context>
     <name>AbstractPage</name>
@@ -320,21 +363,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation>Usage</translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation>OPTION</translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
         <translation>CONNECTSTRING</translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation>Options</translation>
     </message>
     <message>
@@ -560,7 +607,7 @@
     </message>
     <message>
         <source>Guest</source>
-        <translation>Guest</translation>
+        <translation type="vanished">Guest</translation>
     </message>
     <message>
         <source>Room password</source>
@@ -849,6 +896,18 @@
         <source>Click to edit</source>
         <translation>Click to edit</translation>
     </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation>Load</translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation></translation>
+    </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
@@ -978,6 +1037,20 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation></translation>
+    </message>
+</context>
+<context>
     <name>HWUploadVideoDialog</name>
     <message>
         <source>Upload video</source>
@@ -1027,6 +1100,10 @@
         <source>Category</source>
         <translation>Category</translation>
     </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation></translation>
+    </message>
 </context>
 <context>
     <name>LibavInteraction</name>
@@ -1065,6 +1142,7 @@
     </message>
     <message>
         <source>Record: %1</source>
+        <extracomment>As in ‘recording’</extracomment>
         <translation>Record: %1</translation>
     </message>
     <message>
@@ -1465,6 +1543,29 @@
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</translation>
     </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation>
+            <numerusform>(%1 point)</numerusform>
+            <numerusform>(%1 points)</numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation>
+            <numerusform>(%L1 second)</numerusform>
+            <numerusform>(%L1 seconds)</numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation>
+            <numerusform>(%1 crate)</numerusform>
+            <numerusform>(%1 crates)</numerusform>
+        </translation>
+    </message>
 </context>
 <context>
     <name>PageInGame</name>
@@ -1559,6 +1660,25 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation>Start private server</translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <source>Control</source>
@@ -1780,6 +1900,7 @@
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
         <translation>MISSING LANGUAGE NAME [%1]</translation>
     </message>
     <message>
@@ -2009,6 +2130,7 @@
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation>Overall damage and knockback in percent</translation>
     </message>
     <message>
@@ -2131,7 +2253,7 @@
     </message>
     <message>
         <source>Practice your skills in a range of training missions</source>
-        <translation>Practice your skills in a range of training missions</translation>
+        <translation type="vanished">Practice your skills in a range of training missions</translation>
     </message>
     <message>
         <source>Watch recorded demos</source>
@@ -2141,6 +2263,10 @@
         <source>Load a previously saved game</source>
         <translation>Load a previously saved game</translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation></translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -2180,6 +2306,33 @@
         <source>Scenarios</source>
         <translation>Scenarios</translation>
     </message>
+    <message>
+        <source>Team</source>
+        <translation>Team</translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation>Team’s top accuracy: %1%</translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation>Team’s best time: %L1 s</translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation>Team’s longest time: %L1 s</translation>
+    </message>
 </context>
 <context>
     <name>PageVideos</name>
@@ -2831,6 +2984,7 @@
     </message>
     <message>
         <source>% Retreat Time</source>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
         <translation>% Retreat Time</translation>
     </message>
     <message>
@@ -2846,6 +3000,10 @@
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
         <translation>Loading&lt;br&gt;CAPTCHA …</translation>
     </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation></translation>
+    </message>
 </context>
 <context>
     <name>QLineEdit</name>
@@ -3162,6 +3320,15 @@
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation>A weapon scheme with the name ‘%1’ already exists. Changes made to the weapon scheme have been discarded.</translation>
     </message>
+    <message>
+        <source>Server redirection</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation></translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
@@ -3198,7 +3365,7 @@
     </message>
     <message>
         <source>Specify</source>
-        <translation>Specify</translation>
+        <translation type="vanished">Specify</translation>
     </message>
     <message>
         <source>Start</source>
@@ -3296,6 +3463,10 @@
         <source>Upload this video to your YouTube account</source>
         <translation type="vanished">Upload this video to your YouTube account</translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation></translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
@@ -3628,7 +3799,7 @@
     </message>
     <message>
         <source>capture</source>
-        <translation>capture</translation>
+        <translation type="vanished">capture</translation>
     </message>
     <message>
         <source>quit</source>
@@ -3644,7 +3815,7 @@
     </message>
     <message>
         <source>reset zoom</source>
-        <translation>reset zoom</translation>
+        <translation type="vanished">reset zoom</translation>
     </message>
     <message>
         <source>long jump</source>
@@ -3707,6 +3878,62 @@
         <source>clan chat</source>
         <translation>clan chat</translation>
     </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>screenshot</source>
+        <translation></translation>
+    </message>
 </context>
 <context>
     <name>binds (categories)</name>
@@ -3728,6 +3955,49 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation></translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -3902,71 +4172,71 @@
     </message>
     <message>
         <source>Numpad 0</source>
-        <translation>Numpad 0</translation>
+        <translation type="vanished">Numpad 0</translation>
     </message>
     <message>
         <source>Numpad 1</source>
-        <translation>Numpad 1</translation>
+        <translation type="vanished">Numpad 1</translation>
     </message>
     <message>
         <source>Numpad 2</source>
-        <translation>Numpad 2</translation>
+        <translation type="vanished">Numpad 2</translation>
     </message>
     <message>
         <source>Numpad 3</source>
-        <translation>Numpad 3</translation>
+        <translation type="vanished">Numpad 3</translation>
     </message>
     <message>
         <source>Numpad 4</source>
-        <translation>Numpad 4</translation>
+        <translation type="vanished">Numpad 4</translation>
     </message>
     <message>
         <source>Numpad 5</source>
-        <translation>Numpad 5</translation>
+        <translation type="vanished">Numpad 5</translation>
     </message>
     <message>
         <source>Numpad 6</source>
-        <translation>Numpad 6</translation>
+        <translation type="vanished">Numpad 6</translation>
     </message>
     <message>
         <source>Numpad 7</source>
-        <translation>Numpad 7</translation>
+        <translation type="vanished">Numpad 7</translation>
     </message>
     <message>
         <source>Numpad 8</source>
-        <translation>Numpad 8</translation>
+        <translation type="vanished">Numpad 8</translation>
     </message>
     <message>
         <source>Numpad 9</source>
-        <translation>Numpad 9</translation>
+        <translation type="vanished">Numpad 9</translation>
     </message>
     <message>
         <source>Numpad .</source>
-        <translation>Numpad .</translation>
+        <translation type="vanished">Numpad .</translation>
     </message>
     <message>
         <source>Numpad /</source>
-        <translation>Numpad /</translation>
+        <translation type="vanished">Numpad /</translation>
     </message>
     <message>
         <source>Numpad *</source>
-        <translation>Numpad *</translation>
+        <translation type="vanished">Numpad *</translation>
     </message>
     <message>
         <source>Numpad -</source>
-        <translation>Numpad -</translation>
+        <translation type="vanished">Numpad -</translation>
     </message>
     <message>
         <source>Numpad +</source>
-        <translation>Numpad +</translation>
+        <translation type="vanished">Numpad +</translation>
     </message>
     <message>
         <source>Enter</source>
-        <translation>Enter</translation>
+        <translation type="vanished">Enter</translation>
     </message>
     <message>
         <source>Equals</source>
-        <translation>Equals</translation>
+        <translation type="vanished">Equals</translation>
     </message>
     <message>
         <source>Up</source>
@@ -3998,55 +4268,55 @@
     </message>
     <message>
         <source>Page up</source>
-        <translation>Page up</translation>
+        <translation type="vanished">Page up</translation>
     </message>
     <message>
         <source>Page down</source>
-        <translation>Page down</translation>
+        <translation type="vanished">Page down</translation>
     </message>
     <message>
         <source>Num lock</source>
-        <translation>Num lock</translation>
+        <translation type="vanished">Num lock</translation>
     </message>
     <message>
         <source>Caps lock</source>
-        <translation>Caps lock</translation>
+        <translation type="vanished">Caps lock</translation>
     </message>
     <message>
         <source>Scroll lock</source>
-        <translation>Scroll lock</translation>
+        <translation type="vanished">Scroll lock</translation>
     </message>
     <message>
         <source>Right shift</source>
-        <translation>Right shift</translation>
+        <translation type="vanished">Right shift</translation>
     </message>
     <message>
         <source>Left shift</source>
-        <translation>Left shift</translation>
+        <translation type="vanished">Left shift</translation>
     </message>
     <message>
         <source>Right ctrl</source>
-        <translation>Right ctrl</translation>
+        <translation type="vanished">Right ctrl</translation>
     </message>
     <message>
         <source>Left ctrl</source>
-        <translation>Left ctrl</translation>
+        <translation type="vanished">Left ctrl</translation>
     </message>
     <message>
         <source>Right alt</source>
-        <translation>Right alt</translation>
+        <translation type="vanished">Right alt</translation>
     </message>
     <message>
         <source>Left alt</source>
-        <translation>Left alt</translation>
+        <translation type="vanished">Left alt</translation>
     </message>
     <message>
         <source>Right meta</source>
-        <translation>Right meta</translation>
+        <translation type="vanished">Right meta</translation>
     </message>
     <message>
         <source>Left meta</source>
-        <translation>Left meta</translation>
+        <translation type="vanished">Left meta</translation>
     </message>
     <message>
         <source>A button</source>
@@ -4151,6 +4421,609 @@
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
         <translation>D-pad %1 %2</translation>
     </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation>(Don’t use)</translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation>Page Up</translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation>Page Down</translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation>Numlock</translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation>Caps Lock</translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation>Scroll Lock</translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation>Weapons</translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation>Graphics</translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation>General</translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation>Forts</translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation>Music</translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation></translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -4348,7 +5221,7 @@
     </message>
     <message>
         <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</translation>
+        <translation type="vanished">Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</translation>
     </message>
     <message>
         <source>callvote kick: specify nickname</source>
@@ -4692,7 +5565,7 @@
     </message>
     <message>
         <source>&apos;Registered only&apos; state toggled.</source>
-        <translation>‘Registered only’ state toggled.</translation>
+        <translation type="vanished">‘Registered only’ state toggled.</translation>
     </message>
     <message>
         <source>Super power activated.</source>
@@ -4758,5 +5631,25 @@
         <source>This command is only available in rooms.</source>
         <translation>This command is only available in rooms.</translation>
     </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation>Please confirm server restart with “/restart_server yes”.</translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation></translation>
+    </message>
 </context>
 </TS>
--- a/share/hedgewars/Data/Locale/hedgewars_es.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_es.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -78,6 +78,49 @@
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>AbstractPage</name>
@@ -317,21 +360,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -538,10 +585,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Guest</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Room password</source>
         <translation type="unfinished"></translation>
     </message>
@@ -790,6 +833,18 @@
         <source>Click to edit</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation type="unfinished">Cargar</translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
@@ -903,6 +958,20 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>HatButton</name>
     <message>
         <source>Change hat (%1)</source>
@@ -941,6 +1010,10 @@
         <source>Category</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>LibavInteraction</name>
@@ -981,6 +1054,7 @@
     </message>
     <message>
         <source>Record: %1</source>
+        <extracomment>As in ‘recording’</extracomment>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -1363,6 +1437,29 @@
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
 </context>
 <context>
     <name>PageInGame</name>
@@ -1457,6 +1554,25 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <source>Control</source>
@@ -1683,6 +1799,7 @@
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -1927,6 +2044,7 @@
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2048,10 +2166,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Practice your skills in a range of training missions</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Watch recorded demos</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2059,6 +2173,10 @@
         <source>Load a previously saved game</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -2098,6 +2216,33 @@
         <source>Scenarios</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageVideos</name>
@@ -2730,6 +2875,7 @@
     </message>
     <message>
         <source>% Retreat Time</source>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2745,6 +2891,10 @@
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QLineEdit</name>
@@ -3006,6 +3156,15 @@
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Server redirection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
@@ -3046,7 +3205,7 @@
     </message>
     <message>
         <source>Specify</source>
-        <translation>Especificar</translation>
+        <translation type="vanished">Especificar</translation>
     </message>
     <message>
         <source>Start</source>
@@ -3124,6 +3283,10 @@
         <source>Start private server</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
@@ -3438,7 +3601,7 @@
     </message>
     <message>
         <source>capture</source>
-        <translation>capturar</translation>
+        <translation type="vanished">capturar</translation>
     </message>
     <message>
         <source>quit</source>
@@ -3470,7 +3633,7 @@
     </message>
     <message>
         <source>reset zoom</source>
-        <translation>reiniciar zoom</translation>
+        <translation type="vanished">reiniciar zoom</translation>
     </message>
     <message>
         <source>long jump</source>
@@ -3525,6 +3688,62 @@
         <source>clan chat</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>binds (categories)</name>
@@ -3546,6 +3765,49 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -3720,71 +3982,71 @@
     </message>
     <message>
         <source>Numpad 0</source>
-        <translation>Teclado numérico 0</translation>
+        <translation type="vanished">Teclado numérico 0</translation>
     </message>
     <message>
         <source>Numpad 1</source>
-        <translation>Teclado numérico 1</translation>
+        <translation type="vanished">Teclado numérico 1</translation>
     </message>
     <message>
         <source>Numpad 2</source>
-        <translation>Teclado numérico 2</translation>
+        <translation type="vanished">Teclado numérico 2</translation>
     </message>
     <message>
         <source>Numpad 3</source>
-        <translation>Teclado numérico 3</translation>
+        <translation type="vanished">Teclado numérico 3</translation>
     </message>
     <message>
         <source>Numpad 4</source>
-        <translation>Teclado numérico 4</translation>
+        <translation type="vanished">Teclado numérico 4</translation>
     </message>
     <message>
         <source>Numpad 5</source>
-        <translation>Teclado numérico 5</translation>
+        <translation type="vanished">Teclado numérico 5</translation>
     </message>
     <message>
         <source>Numpad 6</source>
-        <translation>Teclado numérico 6</translation>
+        <translation type="vanished">Teclado numérico 6</translation>
     </message>
     <message>
         <source>Numpad 7</source>
-        <translation>Teclado numérico 7</translation>
+        <translation type="vanished">Teclado numérico 7</translation>
     </message>
     <message>
         <source>Numpad 8</source>
-        <translation>Teclado numérico 8</translation>
+        <translation type="vanished">Teclado numérico 8</translation>
     </message>
     <message>
         <source>Numpad 9</source>
-        <translation>Teclado numérico 9</translation>
+        <translation type="vanished">Teclado numérico 9</translation>
     </message>
     <message>
         <source>Numpad .</source>
-        <translation>Teclado numérico .</translation>
+        <translation type="vanished">Teclado numérico .</translation>
     </message>
     <message>
         <source>Numpad /</source>
-        <translation>Teclado numérico /</translation>
+        <translation type="vanished">Teclado numérico /</translation>
     </message>
     <message>
         <source>Numpad *</source>
-        <translation>Teclado numérico *</translation>
+        <translation type="vanished">Teclado numérico *</translation>
     </message>
     <message>
         <source>Numpad -</source>
-        <translation>Teclado numérico -</translation>
+        <translation type="vanished">Teclado numérico -</translation>
     </message>
     <message>
         <source>Numpad +</source>
-        <translation>Teclado numérico +</translation>
+        <translation type="vanished">Teclado numérico +</translation>
     </message>
     <message>
         <source>Enter</source>
-        <translation>Intro</translation>
+        <translation type="vanished">Intro</translation>
     </message>
     <message>
         <source>Equals</source>
-        <translation>Igual</translation>
+        <translation type="vanished">Igual</translation>
     </message>
     <message>
         <source>Up</source>
@@ -3816,55 +4078,55 @@
     </message>
     <message>
         <source>Page up</source>
-        <translation>Re Pág</translation>
+        <translation type="vanished">Re Pág</translation>
     </message>
     <message>
         <source>Page down</source>
-        <translation>Av Pág</translation>
+        <translation type="vanished">Av Pág</translation>
     </message>
     <message>
         <source>Num lock</source>
-        <translation>Bloq Num</translation>
+        <translation type="vanished">Bloq Num</translation>
     </message>
     <message>
         <source>Caps lock</source>
-        <translation>Bloq Mayús</translation>
+        <translation type="vanished">Bloq Mayús</translation>
     </message>
     <message>
         <source>Scroll lock</source>
-        <translation>Bloq Despl</translation>
+        <translation type="vanished">Bloq Despl</translation>
     </message>
     <message>
         <source>Right shift</source>
-        <translation>Shift derecho</translation>
+        <translation type="vanished">Shift derecho</translation>
     </message>
     <message>
         <source>Left shift</source>
-        <translation>Shift izquierdo</translation>
+        <translation type="vanished">Shift izquierdo</translation>
     </message>
     <message>
         <source>Right ctrl</source>
-        <translation>Ctrl derecho</translation>
+        <translation type="vanished">Ctrl derecho</translation>
     </message>
     <message>
         <source>Left ctrl</source>
-        <translation>Ctrl izquierdo</translation>
+        <translation type="vanished">Ctrl izquierdo</translation>
     </message>
     <message>
         <source>Right alt</source>
-        <translation>Alt Gr</translation>
+        <translation type="vanished">Alt Gr</translation>
     </message>
     <message>
         <source>Left alt</source>
-        <translation>Alt</translation>
+        <translation type="vanished">Alt</translation>
     </message>
     <message>
         <source>Right meta</source>
-        <translation>Meta derecho</translation>
+        <translation type="vanished">Meta derecho</translation>
     </message>
     <message>
         <source>Left meta</source>
-        <translation>Meta izquierdo</translation>
+        <translation type="vanished">Meta izquierdo</translation>
     </message>
     <message>
         <source>A button</source>
@@ -3969,6 +4231,609 @@
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation type="unfinished">Set de armas</translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation type="unfinished">General</translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -4041,10 +4906,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>The game can&apos;t be started with less than two clans!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4337,10 +5198,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>&apos;Registered only&apos; state toggled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Super power activated.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4404,5 +5261,25 @@
         <source>This command is only available in rooms.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 </TS>
--- a/share/hedgewars/Data/Locale/hedgewars_fi.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_fi.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -78,6 +78,49 @@
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>AbstractPage</name>
@@ -316,21 +359,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation>Käyttö</translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation>PARAMETRI</translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
         <translation>YHTEYSOSOITE</translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation>Valinnat</translation>
     </message>
     <message>
@@ -552,7 +599,7 @@
     </message>
     <message>
         <source>Guest</source>
-        <translation>Vieras</translation>
+        <translation type="vanished">Vieras</translation>
     </message>
     <message>
         <source>Room password</source>
@@ -822,6 +869,18 @@
         <source>Click to edit</source>
         <translation>Klikkaa muokataksesi</translation>
     </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation type="unfinished">Lataa</translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
@@ -938,6 +997,20 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>HWUploadVideoDialog</name>
     <message>
         <source>Upload video</source>
@@ -980,6 +1053,10 @@
         <source>Category</source>
         <translation>Kategoria</translation>
     </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>LibavInteraction</name>
@@ -1032,6 +1109,7 @@
     </message>
     <message>
         <source>Record: %1</source>
+        <extracomment>As in ‘recording’</extracomment>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -1418,6 +1496,29 @@
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
 </context>
 <context>
     <name>PageInGame</name>
@@ -1512,6 +1613,25 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation type="unfinished">Käynnistä oma palvelin</translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <source>Edit game preferences</source>
@@ -1734,6 +1854,7 @@
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -1934,6 +2055,7 @@
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation>Mitä isompi luku, sitä enemmän vahinkoa kaikki tuottaa, prosentteina oletustasosta</translation>
     </message>
     <message>
@@ -2056,7 +2178,7 @@
     </message>
     <message>
         <source>Practice your skills in a range of training missions</source>
-        <translation>Harjoittele taitojasi tehtäväradoilla</translation>
+        <translation type="vanished">Harjoittele taitojasi tehtäväradoilla</translation>
     </message>
     <message>
         <source>Watch recorded demos</source>
@@ -2066,6 +2188,10 @@
         <source>Load a previously saved game</source>
         <translation>Avaa tallennettu peli</translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -2105,6 +2231,33 @@
         <source>Scenarios</source>
         <translation>Tilanteet</translation>
     </message>
+    <message>
+        <source>Team</source>
+        <translation type="unfinished">Joukkue</translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageVideos</name>
@@ -2751,6 +2904,7 @@
     </message>
     <message>
         <source>% Retreat Time</source>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
         <translation>% Pakoaika</translation>
     </message>
     <message>
@@ -2766,6 +2920,10 @@
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QLineEdit</name>
@@ -3064,6 +3222,15 @@
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Server redirection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
@@ -3100,7 +3267,7 @@
     </message>
     <message>
         <source>Specify</source>
-        <translation>Määritä</translation>
+        <translation type="vanished">Määritä</translation>
     </message>
     <message>
         <source>Start</source>
@@ -3190,6 +3357,10 @@
         <source>Start private server</source>
         <translation>Käynnistä oma palvelin</translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
@@ -3514,7 +3685,7 @@
     </message>
     <message>
         <source>capture</source>
-        <translation>kaappaa</translation>
+        <translation type="vanished">kaappaa</translation>
     </message>
     <message>
         <source>quit</source>
@@ -3530,7 +3701,7 @@
     </message>
     <message>
         <source>reset zoom</source>
-        <translation>nollaa zoom</translation>
+        <translation type="vanished">nollaa zoom</translation>
     </message>
     <message>
         <source>long jump</source>
@@ -3589,6 +3760,62 @@
         <source>clan chat</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>binds (categories)</name>
@@ -3610,6 +3837,49 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -3776,71 +4046,71 @@
     </message>
     <message>
         <source>Numpad 0</source>
-        <translation>Numeronäppäimistö 0</translation>
+        <translation type="vanished">Numeronäppäimistö 0</translation>
     </message>
     <message>
         <source>Numpad 1</source>
-        <translation>Numeronäppäimistö 1</translation>
+        <translation type="vanished">Numeronäppäimistö 1</translation>
     </message>
     <message>
         <source>Numpad 2</source>
-        <translation>Numeronäppäimistö 2</translation>
+        <translation type="vanished">Numeronäppäimistö 2</translation>
     </message>
     <message>
         <source>Numpad 3</source>
-        <translation>Numeronäppäimistö 3</translation>
+        <translation type="vanished">Numeronäppäimistö 3</translation>
     </message>
     <message>
         <source>Numpad 4</source>
-        <translation>Numeronäppäimistö 4</translation>
+        <translation type="vanished">Numeronäppäimistö 4</translation>
     </message>
     <message>
         <source>Numpad 5</source>
-        <translation>Numeronäppäimistö 5</translation>
+        <translation type="vanished">Numeronäppäimistö 5</translation>
     </message>
     <message>
         <source>Numpad 6</source>
-        <translation>Numeronäppäimistö 6</translation>
+        <translation type="vanished">Numeronäppäimistö 6</translation>
     </message>
     <message>
         <source>Numpad 7</source>
-        <translation>Numeronäppäimistö 7</translation>
+        <translation type="vanished">Numeronäppäimistö 7</translation>
     </message>
     <message>
         <source>Numpad 8</source>
-        <translation>Numeronäppäimistö 8</translation>
+        <translation type="vanished">Numeronäppäimistö 8</translation>
     </message>
     <message>
         <source>Numpad 9</source>
-        <translation>Numeronäppäimistö 9</translation>
+        <translation type="vanished">Numeronäppäimistö 9</translation>
     </message>
     <message>
         <source>Numpad .</source>
-        <translation>Numeronäppäimistö .</translation>
+        <translation type="vanished">Numeronäppäimistö .</translation>
     </message>
     <message>
         <source>Numpad /</source>
-        <translation>Numeronäppäimistö /</translation>
+        <translation type="vanished">Numeronäppäimistö /</translation>
     </message>
     <message>
         <source>Numpad *</source>
-        <translation>Numeronäppäimistö *</translation>
+        <translation type="vanished">Numeronäppäimistö *</translation>
     </message>
     <message>
         <source>Numpad -</source>
-        <translation>Numeronäppäimistö -</translation>
+        <translation type="vanished">Numeronäppäimistö -</translation>
     </message>
     <message>
         <source>Numpad +</source>
-        <translation>Numeronäppäimistö +</translation>
+        <translation type="vanished">Numeronäppäimistö +</translation>
     </message>
     <message>
         <source>Enter</source>
-        <translation>Rivinvaihto</translation>
+        <translation type="vanished">Rivinvaihto</translation>
     </message>
     <message>
         <source>Equals</source>
-        <translation>=</translation>
+        <translation type="vanished">=</translation>
     </message>
     <message>
         <source>Up</source>
@@ -3872,55 +4142,55 @@
     </message>
     <message>
         <source>Page up</source>
-        <translation>Sivu ylös</translation>
+        <translation type="vanished">Sivu ylös</translation>
     </message>
     <message>
         <source>Page down</source>
-        <translation>Sivu alas</translation>
+        <translation type="vanished">Sivu alas</translation>
     </message>
     <message>
         <source>Num lock</source>
-        <translation>Num lock</translation>
+        <translation type="vanished">Num lock</translation>
     </message>
     <message>
         <source>Caps lock</source>
-        <translation>Caps lock</translation>
+        <translation type="vanished">Caps lock</translation>
     </message>
     <message>
         <source>Scroll lock</source>
-        <translation>Scroll lock</translation>
+        <translation type="vanished">Scroll lock</translation>
     </message>
     <message>
         <source>Right shift</source>
-        <translation>Oikea vaihtonäppäin</translation>
+        <translation type="vanished">Oikea vaihtonäppäin</translation>
     </message>
     <message>
         <source>Left shift</source>
-        <translation>Vasen vaihtonäppäin</translation>
+        <translation type="vanished">Vasen vaihtonäppäin</translation>
     </message>
     <message>
         <source>Right ctrl</source>
-        <translation>Oikea ctrl</translation>
+        <translation type="vanished">Oikea ctrl</translation>
     </message>
     <message>
         <source>Left ctrl</source>
-        <translation>Vasen ctrl</translation>
+        <translation type="vanished">Vasen ctrl</translation>
     </message>
     <message>
         <source>Right alt</source>
-        <translation>Oikea alt</translation>
+        <translation type="vanished">Oikea alt</translation>
     </message>
     <message>
         <source>Left alt</source>
-        <translation>Vasen alt</translation>
+        <translation type="vanished">Vasen alt</translation>
     </message>
     <message>
         <source>Right meta</source>
-        <translation>Oikea meta</translation>
+        <translation type="vanished">Oikea meta</translation>
     </message>
     <message>
         <source>Left meta</source>
-        <translation>Vasen meta</translation>
+        <translation type="vanished">Vasen meta</translation>
     </message>
     <message>
         <source>A button</source>
@@ -4029,6 +4299,609 @@
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation type="unfinished">Aseet</translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation type="unfinished">Grafiikka</translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation type="unfinished">Yleiset</translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation type="unfinished">Linnakkeet</translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation type="unfinished">Musiikki</translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -4226,7 +5099,7 @@
     </message>
     <message>
         <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation>Käytössä äänestyskomennot: kick &lt;nimi&gt;, map &lt;nimi&gt;, pause, newseed, hedgehogs</translation>
+        <translation type="vanished">Käytössä äänestyskomennot: kick &lt;nimi&gt;, map &lt;nimi&gt;, pause, newseed, hedgehogs</translation>
     </message>
     <message>
         <source>callvote kick: specify nickname</source>
@@ -4541,10 +5414,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>&apos;Registered only&apos; state toggled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Super power activated.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4608,5 +5477,25 @@
         <source>This command is only available in rooms.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 </TS>
--- a/share/hedgewars/Data/Locale/hedgewars_fr.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_fr.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -78,6 +78,49 @@
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation></translation>
     </message>
+    <message>
+        <source>Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>AbstractPage</name>
@@ -336,21 +379,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation>Utilisation</translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation>OPTION</translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
         <translation>LIENDECONNEXION</translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation>Options</translation>
     </message>
     <message>
@@ -572,7 +619,7 @@
     </message>
     <message>
         <source>Guest</source>
-        <translation>Invité</translation>
+        <translation type="vanished">Invité</translation>
     </message>
     <message>
         <source>Room password</source>
@@ -835,6 +882,18 @@
         <source>Click to edit</source>
         <translation>Cliquez pour éditer</translation>
     </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation type="unfinished">Charger</translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
@@ -955,6 +1014,20 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>HWUploadVideoDialog</name>
     <message>
         <source>Upload video</source>
@@ -1004,6 +1077,10 @@
         <source>Category</source>
         <translation>Catégorie</translation>
     </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>LibavInteraction</name>
@@ -1057,6 +1134,7 @@
     </message>
     <message>
         <source>Record: %1</source>
+        <extracomment>As in ‘recording’</extracomment>
         <translation>Enregistrement : %1</translation>
     </message>
 </context>
@@ -1443,6 +1521,29 @@
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
 </context>
 <context>
     <name>PageInGame</name>
@@ -1537,6 +1638,25 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation type="unfinished">Démarrer un serveur privé</translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <source>Control</source>
@@ -1763,6 +1883,7 @@
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
         <translation>NOM DE LANGAGE MANQUANT</translation>
     </message>
     <message>
@@ -2012,6 +2133,7 @@
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation>Dégâts généraux et coût en pourcent</translation>
     </message>
     <message>
@@ -2134,7 +2256,7 @@
     </message>
     <message>
         <source>Practice your skills in a range of training missions</source>
-        <translation>Améliorez vos compétences avec un large choix de missions</translation>
+        <translation type="vanished">Améliorez vos compétences avec un large choix de missions</translation>
     </message>
     <message>
         <source>Watch recorded demos</source>
@@ -2144,6 +2266,10 @@
         <source>Load a previously saved game</source>
         <translation>Charger une partie</translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -2187,6 +2313,33 @@
         <source>Scenarios</source>
         <translation>Scénarios</translation>
     </message>
+    <message>
+        <source>Team</source>
+        <translation type="unfinished">Équipe</translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageVideos</name>
@@ -2879,6 +3032,7 @@
     </message>
     <message>
         <source>% Retreat Time</source>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
         <translation>% temps de repli</translation>
     </message>
     <message>
@@ -2894,6 +3048,10 @@
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
         <translation>Chargement&lt;br&gt;CAPTCHA …</translation>
     </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QLineEdit</name>
@@ -3214,6 +3372,15 @@
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Server redirection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
@@ -3254,7 +3421,7 @@
     </message>
     <message>
         <source>Specify</source>
-        <translation>Spécifier</translation>
+        <translation type="vanished">Spécifier</translation>
     </message>
     <message>
         <source>default</source>
@@ -3344,6 +3511,10 @@
         <source>Start private server</source>
         <translation>Démarrer un serveur privé</translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
@@ -3643,7 +3814,7 @@
     </message>
     <message>
         <source>capture</source>
-        <translation>capture</translation>
+        <translation type="vanished">capture</translation>
     </message>
     <message>
         <source>quit</source>
@@ -3703,7 +3874,7 @@
     </message>
     <message>
         <source>reset zoom</source>
-        <translation>réinitialiser
+        <translation type="vanished">réinitialiser
 zoom</translation>
     </message>
     <message>
@@ -3767,6 +3938,62 @@
         <source>clan chat</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>binds (categories)</name>
@@ -3788,6 +4015,49 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -3958,71 +4228,71 @@
     </message>
     <message>
         <source>Numpad 0</source>
-        <translation>Pavé numérique 0</translation>
+        <translation type="vanished">Pavé numérique 0</translation>
     </message>
     <message>
         <source>Numpad 1</source>
-        <translation>Pavé numérique 1</translation>
+        <translation type="vanished">Pavé numérique 1</translation>
     </message>
     <message>
         <source>Numpad 2</source>
-        <translation>Pavé numérique 2</translation>
+        <translation type="vanished">Pavé numérique 2</translation>
     </message>
     <message>
         <source>Numpad 3</source>
-        <translation>Pavé numérique 3</translation>
+        <translation type="vanished">Pavé numérique 3</translation>
     </message>
     <message>
         <source>Numpad 4</source>
-        <translation>Pavé numérique 4</translation>
+        <translation type="vanished">Pavé numérique 4</translation>
     </message>
     <message>
         <source>Numpad 5</source>
-        <translation>Pavé numérique 5</translation>
+        <translation type="vanished">Pavé numérique 5</translation>
     </message>
     <message>
         <source>Numpad 6</source>
-        <translation>Pavé numérique 6</translation>
+        <translation type="vanished">Pavé numérique 6</translation>
     </message>
     <message>
         <source>Numpad 7</source>
-        <translation>Pavé numérique 7</translation>
+        <translation type="vanished">Pavé numérique 7</translation>
     </message>
     <message>
         <source>Numpad 8</source>
-        <translation>Pavé numérique 8</translation>
+        <translation type="vanished">Pavé numérique 8</translation>
     </message>
     <message>
         <source>Numpad 9</source>
-        <translation>Pavé numérique 9</translation>
+        <translation type="vanished">Pavé numérique 9</translation>
     </message>
     <message>
         <source>Numpad .</source>
-        <translation>Pavé numérique .</translation>
+        <translation type="vanished">Pavé numérique .</translation>
     </message>
     <message>
         <source>Numpad /</source>
-        <translation>Pavé numérique /</translation>
+        <translation type="vanished">Pavé numérique /</translation>
     </message>
     <message>
         <source>Numpad *</source>
-        <translation>Pavé numérique *</translation>
+        <translation type="vanished">Pavé numérique *</translation>
     </message>
     <message>
         <source>Numpad -</source>
-        <translation>Pavé numérique -</translation>
+        <translation type="vanished">Pavé numérique -</translation>
     </message>
     <message>
         <source>Numpad +</source>
-        <translation>Pavé numérique +</translation>
+        <translation type="vanished">Pavé numérique +</translation>
     </message>
     <message>
         <source>Enter</source>
-        <translation>Pavé numérique entrée</translation>
+        <translation type="vanished">Pavé numérique entrée</translation>
     </message>
     <message>
         <source>Equals</source>
-        <translation>Égale</translation>
+        <translation type="vanished">Égale</translation>
     </message>
     <message>
         <source>Up</source>
@@ -4054,55 +4324,55 @@
     </message>
     <message>
         <source>Page up</source>
-        <translation>Page précédente</translation>
+        <translation type="vanished">Page précédente</translation>
     </message>
     <message>
         <source>Page down</source>
-        <translation>Page suivante</translation>
+        <translation type="vanished">Page suivante</translation>
     </message>
     <message>
         <source>Num lock</source>
-        <translation>Verr. num</translation>
+        <translation type="vanished">Verr. num</translation>
     </message>
     <message>
         <source>Caps lock</source>
-        <translation>Verr. maj</translation>
+        <translation type="vanished">Verr. maj</translation>
     </message>
     <message>
         <source>Scroll lock</source>
-        <translation>Arrêt défil</translation>
+        <translation type="vanished">Arrêt défil</translation>
     </message>
     <message>
         <source>Right shift</source>
-        <translation>Maj droit</translation>
+        <translation type="vanished">Maj droit</translation>
     </message>
     <message>
         <source>Left shift</source>
-        <translation>Maj gauche</translation>
+        <translation type="vanished">Maj gauche</translation>
     </message>
     <message>
         <source>Right ctrl</source>
-        <translation>Ctrl droite</translation>
+        <translation type="vanished">Ctrl droite</translation>
     </message>
     <message>
         <source>Left ctrl</source>
-        <translation>Ctrl gauche</translation>
+        <translation type="vanished">Ctrl gauche</translation>
     </message>
     <message>
         <source>Right alt</source>
-        <translation>Alt droite</translation>
+        <translation type="vanished">Alt droite</translation>
     </message>
     <message>
         <source>Left alt</source>
-        <translation>Alt gauche</translation>
+        <translation type="vanished">Alt gauche</translation>
     </message>
     <message>
         <source>Right meta</source>
-        <translation>Meta droite</translation>
+        <translation type="vanished">Meta droite</translation>
     </message>
     <message>
         <source>Left meta</source>
-        <translation>Meta gauche</translation>
+        <translation type="vanished">Meta gauche</translation>
     </message>
     <message>
         <source>A button</source>
@@ -4211,6 +4481,609 @@
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation type="unfinished">Armes</translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation type="unfinished">Graphismes</translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation type="unfinished">Général</translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation type="unfinished">Forts</translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation type="unfinished">Musique</translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -4408,7 +5281,7 @@
     </message>
     <message>
         <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation>Commandes de vote disponible : kick &lt;pseudo&gt;, map &lt;nom&gt;, pause, newseed, hedgehogs</translation>
+        <translation type="vanished">Commandes de vote disponible : kick &lt;pseudo&gt;, map &lt;nom&gt;, pause, newseed, hedgehogs</translation>
     </message>
     <message>
         <source>callvote kick: specify nickname</source>
@@ -4723,10 +5596,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>&apos;Registered only&apos; state toggled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Super power activated.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4790,5 +5659,25 @@
         <source>This command is only available in rooms.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 </TS>
--- a/share/hedgewars/Data/Locale/hedgewars_gd.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_gd.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -1,4 +1,6 @@
-<?xml version="1.0" ?><!DOCTYPE TS><TS language="gd" version="2.1">
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="gd">
 <context>
     <name>About</name>
     <message>
@@ -7,7 +9,7 @@
     </message>
     <message>
         <source>Hedgewars %1</source>
-        <extracomment>%1 contains Hedgewars' version number</extracomment>
+        <extracomment>%1 contains Hedgewars&apos; version number</extracomment>
         <translation>Hedgewars %1</translation>
     </message>
     <message>
@@ -29,7 +31,7 @@
     </message>
     <message>
         <source>Dependency versions:</source>
-        <extracomment>For the version numbers of Hedgewars' software dependencies</extracomment>
+        <extracomment>For the version numbers of Hedgewars&apos; software dependencies</extracomment>
         <translation>Tionndaidhean na eisimeileachdan:</translation>
     </message>
     <message>
@@ -76,6 +78,49 @@
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</translation>
     </message>
+    <message>
+        <source>Credits</source>
+        <translation>Urram</translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation>Daoine eile</translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation>%1 (alias %2)</translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation>%1 &amp;lt;%2&amp;gt;</translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation>%1: %2</translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation>%1: %2 &amp;lt;%3&amp;gt;</translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation>Barrachd urraim</translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation>Gheibh thu liosta le barrachd urraman san fhaidhle teacsa CREDITS.</translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation>Trusaiche nach aithne dhuinn: %1</translation>
+    </message>
 </context>
 <context>
     <name>AbstractPage</name>
@@ -201,7 +246,12 @@
     </message>
     <message numerus="yes">
         <source>Every %1 turn</source>
-        <translation><numerusform>Gach %1d cuairt</numerusform><numerusform>Gach %1a cuairt</numerusform><numerusform>Gach %1mh cuairt</numerusform><numerusform>Gach %1mh cuairt</numerusform></translation>
+        <translation>
+            <numerusform>Gach %1d cuairt</numerusform>
+            <numerusform>Gach %1a cuairt</numerusform>
+            <numerusform>Gach %1mh cuairt</numerusform>
+            <numerusform>Gach %1mh cuairt</numerusform>
+        </translation>
     </message>
 </context>
 <context>
@@ -230,10 +280,6 @@
 <context>
     <name>GameSchemeModel</name>
     <message>
-        <source>new</source>
-        <translation type="unfinished"/>
-    </message>
-    <message>
         <source>New</source>
         <translation>Ùr</translation>
     </message>
@@ -261,23 +307,48 @@
     <name>HWApplication</name>
     <message numerus="yes">
         <source>%1 minutes</source>
-        <translation><numerusform>%1 mhionaid</numerusform><numerusform>%1 mhionaid</numerusform><numerusform>%1 mionaidean</numerusform><numerusform>%1 mionaid</numerusform></translation>
+        <translation>
+            <numerusform>%1 mhionaid</numerusform>
+            <numerusform>%1 mhionaid</numerusform>
+            <numerusform>%1 mionaidean</numerusform>
+            <numerusform>%1 mionaid</numerusform>
+        </translation>
     </message>
     <message numerus="yes">
         <source>%1 hour</source>
-        <translation><numerusform>%1 uair</numerusform><numerusform>%1 uair</numerusform><numerusform>%1 uairean</numerusform><numerusform>%1 uair</numerusform></translation>
+        <translation>
+            <numerusform>%1 uair</numerusform>
+            <numerusform>%1 uair</numerusform>
+            <numerusform>%1 uairean</numerusform>
+            <numerusform>%1 uair</numerusform>
+        </translation>
     </message>
     <message numerus="yes">
         <source>%1 hours</source>
-        <translation><numerusform>%1 uair</numerusform><numerusform>%1 uair</numerusform><numerusform>%1 uairean</numerusform><numerusform>%1 uair</numerusform></translation>
+        <translation>
+            <numerusform>%1 uair</numerusform>
+            <numerusform>%1 uair</numerusform>
+            <numerusform>%1 uairean</numerusform>
+            <numerusform>%1 uair</numerusform>
+        </translation>
     </message>
     <message numerus="yes">
         <source>%1 day</source>
-        <translation><numerusform>%1 latha</numerusform><numerusform>%1 latha</numerusform><numerusform>%1 làithean</numerusform><numerusform>%1 latha</numerusform></translation>
+        <translation>
+            <numerusform>%1 latha</numerusform>
+            <numerusform>%1 latha</numerusform>
+            <numerusform>%1 làithean</numerusform>
+            <numerusform>%1 latha</numerusform>
+        </translation>
     </message>
     <message numerus="yes">
         <source>%1 days</source>
-        <translation><numerusform>%1 latha</numerusform><numerusform>%1 latha</numerusform><numerusform>%1 làithean</numerusform><numerusform>%1 latha</numerusform></translation>
+        <translation>
+            <numerusform>%1 latha</numerusform>
+            <numerusform>%1 latha</numerusform>
+            <numerusform>%1 làithean</numerusform>
+            <numerusform>%1 latha</numerusform>
+        </translation>
     </message>
     <message>
         <source>Scheme &apos;%1&apos; not supported</source>
@@ -300,21 +371,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation>Cleachdadh</translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation>ROGHAINN</translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
         <translation>TEACSACEANGLAIDH</translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation>Roghainnean</translation>
     </message>
     <message>
@@ -481,7 +556,7 @@
         <translation>Hedgewars – Far-ainm clàraichte</translation>
     </message>
     <message>
-        <source>This nick is registered, and you haven't specified a password.
+        <source>This nick is registered, and you haven&apos;t specified a password.
 
 If this nick isn’t yours, please register your own nick at www.hedgewars.org
 
@@ -540,7 +615,7 @@
     </message>
     <message>
         <source>Guest</source>
-        <translation>Aoigh</translation>
+        <translation type="vanished">Aoigh</translation>
     </message>
     <message>
         <source>Room password</source>
@@ -562,9 +637,9 @@
         <translation>Sgioba %1</translation>
     </message>
     <message>
-        <source>This nick is registered, and you haven't specified a password.
+        <source>This nick is registered, and you haven&apos;t specified a password.
 
-If this nick isn't yours, please register your own nick at www.hedgewars.org
+If this nick isn&apos;t yours, please register your own nick at www.hedgewars.org
 
 Password:</source>
         <translation>Tha am far-ainm seo clàraichte ’s cha chuir thu facal-faire a-steach.
@@ -607,7 +682,7 @@
 
 We are very sorry for the inconvenience :(
 
-If this keeps happening, please click the '%1' button in the main menu!
+If this keeps happening, please click the &apos;%1&apos; button in the main menu!
 
 Last two engine messages:
 %2</source>
@@ -625,7 +700,7 @@
 
 We are very sorry for the inconvenience. :-(
 
-If this keeps happening, please click the 'Feedback' button in the main menu!
+If this keeps happening, please click the &apos;Feedback&apos; button in the main menu!
 
 Last engine message:
 %1</source>
@@ -829,6 +904,18 @@
         <source>Click to edit</source>
         <translation>Briog gus a dheasachadh</translation>
     </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation>Sgèilich meud tarraing a’ mhapa</translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation>Luchdaich</translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation>Deasaich</translation>
+    </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
@@ -874,10 +961,6 @@
         <translation>Thàinig %1 *** %2 a-steach dhan t-seòmar</translation>
     </message>
     <message>
-        <source>%1 *** %2 has joined</source>
-        <translation type="unfinished"/>
-    </message>
-    <message>
         <source>%1 *** %2 has left (%3)</source>
         <translation>Dh’fhalbh %1 *** %2  (%3)</translation>
     </message>
@@ -937,7 +1020,7 @@
     <message>
         <source>To connect to the server, please log in.
 
-If you don't have an account on www.hedgewars.org,
+If you don&apos;t have an account on www.hedgewars.org,
 just enter your nickname.</source>
         <translation>Clàraich a-steach gus ceangal ris an fhrithealaiche.
 
@@ -958,6 +1041,27 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation>Thachair mearachd MHARBHTACH fhad ’s a bha sinn a’ pròiseasadh clàradh a’ video! Cha b’ urrainn dhuinn a’ video a shàbhaladh.
+
+B’ urrainn dhut inneal-clàraidh Hedgewars ath-shuidheachadh air na bun-roghainnean feuch an cuidich sin.
+
+Airson aithris a dhèanamh air a’ mhearachd seo, briog air a’ phutan “Beachdan thugainn” air a’ phrìomh chlàr-taice!
+
+An teachdaireachd mu dheireadh aig an einnsein:
+%1</translation>
+    </message>
+</context>
+<context>
     <name>HWUploadVideoDialog</name>
     <message>
         <source>Upload video</source>
@@ -995,18 +1099,15 @@
     </message>
 </context>
 <context>
-    <name>KB</name>
-    <message>
-        <source>SDL_ttf returned error while rendering text, most propably it is related to the bug in freetype2. It&apos;s recommended to update your freetype lib.</source>
-        <translation type="unfinished"/>
-    </message>
-</context>
-<context>
     <name>KeyBinder</name>
     <message>
         <source>Category</source>
         <translation>Roinn-seòrsa</translation>
     </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation>Rabhadh: Chaidh an t-aon iuchair a nasgadh iomadh turas!</translation>
+    </message>
 </context>
 <context>
     <name>LibavInteraction</name>
@@ -1045,6 +1146,7 @@
     </message>
     <message>
         <source>Record: %1</source>
+        <extracomment>As in ‘recording’</extracomment>
         <translation>Clàradh: %1</translation>
     </message>
     <message>
@@ -1073,7 +1175,12 @@
     </message>
     <message numerus="yes">
         <source>%1 seconds</source>
-        <translation><numerusform>%1 diog</numerusform><numerusform>%1 dhiog</numerusform><numerusform>%1 diogan</numerusform><numerusform>%1 diog</numerusform></translation>
+        <translation>
+            <numerusform>%1 diog</numerusform>
+            <numerusform>%1 dhiog</numerusform>
+            <numerusform>%1 diogan</numerusform>
+            <numerusform>%1 diog</numerusform>
+        </translation>
     </message>
 </context>
 <context>
@@ -1360,32 +1467,67 @@
     </message>
     <message numerus="yes">
         <source>The best shot award was won by &lt;b&gt;%1&lt;/b&gt; with &lt;b&gt;%2&lt;/b&gt; pts.</source>
-        <translation><numerusform>Bhuannaich &lt;b&gt;%1&lt;/b&gt; duais an losgaidh as fhearr le &lt;b&gt;%2&lt;/b&gt; phuing.</numerusform><numerusform>Bhuannaich &lt;b&gt;%1&lt;/b&gt; duais an losgaidh as fhearr le &lt;b&gt;%2&lt;/b&gt; phuing.</numerusform><numerusform>Bhuannaich &lt;b&gt;%1&lt;/b&gt; duais an losgaidh as fhearr le &lt;b&gt;%2&lt;/b&gt; puingean.</numerusform><numerusform>Bhuannaich &lt;b&gt;%1&lt;/b&gt; duais an losgaidh as fhearr le &lt;b&gt;%2&lt;/b&gt; puing.</numerusform></translation>
+        <translation>
+            <numerusform>Bhuannaich &lt;b&gt;%1&lt;/b&gt; duais an losgaidh as fhearr le &lt;b&gt;%2&lt;/b&gt; phuing.</numerusform>
+            <numerusform>Bhuannaich &lt;b&gt;%1&lt;/b&gt; duais an losgaidh as fhearr le &lt;b&gt;%2&lt;/b&gt; phuing.</numerusform>
+            <numerusform>Bhuannaich &lt;b&gt;%1&lt;/b&gt; duais an losgaidh as fhearr le &lt;b&gt;%2&lt;/b&gt; puingean.</numerusform>
+            <numerusform>Bhuannaich &lt;b&gt;%1&lt;/b&gt; duais an losgaidh as fhearr le &lt;b&gt;%2&lt;/b&gt; puing.</numerusform>
+        </translation>
     </message>
     <message numerus="yes">
         <source>The best killer is &lt;b&gt;%1&lt;/b&gt; with &lt;b&gt;%2&lt;/b&gt; kills in a turn.</source>
-        <translation><numerusform>Is &lt;b&gt;%1&lt;/b&gt; am marbhaiche as fhearr le &lt;b&gt;%2&lt;/b&gt; mharbhadh ann an cuairt.</numerusform><numerusform>Is &lt;b&gt;%1&lt;/b&gt; am marbhaiche as fhearr le &lt;b&gt;%2&lt;/b&gt; mharbhadh ann an cuairt.</numerusform><numerusform>Is &lt;b&gt;%1&lt;/b&gt; am marbhaiche as fhearr le &lt;b&gt;%2&lt;/b&gt; marbhaidhean ann an cuairt.</numerusform><numerusform>Is &lt;b&gt;%1&lt;/b&gt; am marbhaiche as fhearr le &lt;b&gt;%2&lt;/b&gt; marbhadh ann an cuairt.</numerusform></translation>
+        <translation>
+            <numerusform>Is &lt;b&gt;%1&lt;/b&gt; am marbhaiche as fhearr le &lt;b&gt;%2&lt;/b&gt; mharbhadh ann an cuairt.</numerusform>
+            <numerusform>Is &lt;b&gt;%1&lt;/b&gt; am marbhaiche as fhearr le &lt;b&gt;%2&lt;/b&gt; mharbhadh ann an cuairt.</numerusform>
+            <numerusform>Is &lt;b&gt;%1&lt;/b&gt; am marbhaiche as fhearr le &lt;b&gt;%2&lt;/b&gt; marbhaidhean ann an cuairt.</numerusform>
+            <numerusform>Is &lt;b&gt;%1&lt;/b&gt; am marbhaiche as fhearr le &lt;b&gt;%2&lt;/b&gt; marbhadh ann an cuairt.</numerusform>
+        </translation>
     </message>
     <message numerus="yes">
         <source>A total of &lt;b&gt;%1&lt;/b&gt; hedgehog(s) were killed during this round.</source>
-        <translation><numerusform>Chaidh &lt;b&gt;%1&lt;/b&gt; ghràineag a mharbhadh uile gu lèir sa chuairt seo.</numerusform><numerusform>Chaidh &lt;b&gt;%1&lt;/b&gt; ghràineag a mharbhadh uile gu lèir sa chuairt seo.</numerusform><numerusform>Chaidh &lt;b&gt;%1&lt;/b&gt; gràineagan a mharbhadh uile gu lèir sa chuairt seo.</numerusform><numerusform>Chaidh &lt;b&gt;%1&lt;/b&gt; gràineag a mharbhadh uile gu lèir sa chuairt seo.</numerusform></translation>
+        <translation>
+            <numerusform>Chaidh &lt;b&gt;%1&lt;/b&gt; ghràineag a mharbhadh uile gu lèir sa chuairt seo.</numerusform>
+            <numerusform>Chaidh &lt;b&gt;%1&lt;/b&gt; ghràineag a mharbhadh uile gu lèir sa chuairt seo.</numerusform>
+            <numerusform>Chaidh &lt;b&gt;%1&lt;/b&gt; gràineagan a mharbhadh uile gu lèir sa chuairt seo.</numerusform>
+            <numerusform>Chaidh &lt;b&gt;%1&lt;/b&gt; gràineag a mharbhadh uile gu lèir sa chuairt seo.</numerusform>
+        </translation>
     </message>
     <message numerus="yes">
         <source>(%1 kill)</source>
         <extracomment>Number of kills in stats screen, written after the team name</extracomment>
-        <translation><numerusform>(%1 mharbhadh)</numerusform><numerusform>(%1 mharbhadh)</numerusform><numerusform>(%1 marbhaidhean)</numerusform><numerusform>(%1 marbhadh)</numerusform></translation>
+        <translation>
+            <numerusform>(%1 mharbhadh)</numerusform>
+            <numerusform>(%1 mharbhadh)</numerusform>
+            <numerusform>(%1 marbhaidhean)</numerusform>
+            <numerusform>(%1 marbhadh)</numerusform>
+        </translation>
     </message>
     <message numerus="yes">
         <source>&lt;b&gt;%1&lt;/b&gt; thought it&apos;s good to shoot his own hedgehogs with &lt;b&gt;%2&lt;/b&gt; pts.</source>
-        <translation type="vanished"><numerusform>Bha &lt;b&gt;%1&lt;/b&gt; dhen bheachd gum b’ fheairrde e na gràineagan aige fhèin a mharbhadh le &lt;b&gt;%2&lt;/b&gt; phuing.</numerusform><numerusform>Bha &lt;b&gt;%1&lt;/b&gt; dhen bheachd gum b’ fheairrde e na gràineagan aige fhèin a mharbhadh le &lt;b&gt;%2&lt;/b&gt; phuing.</numerusform><numerusform>Bha &lt;b&gt;%1&lt;/b&gt; dhen bheachd gum b’ fheairrde e na gràineagan aige fhèin a mharbhadh le &lt;b&gt;%2&lt;/b&gt; puingean.</numerusform><numerusform>Bha &lt;b&gt;%1&lt;/b&gt; dhen bheachd gum b’ fheairrde e na gràineagan aige fhèin a mharbhadh le &lt;b&gt;%2&lt;/b&gt; puing.</numerusform></translation>
+        <translation type="vanished">
+            <numerusform>Bha &lt;b&gt;%1&lt;/b&gt; dhen bheachd gum b’ fheairrde e na gràineagan aige fhèin a mharbhadh le &lt;b&gt;%2&lt;/b&gt; phuing.</numerusform>
+            <numerusform>Bha &lt;b&gt;%1&lt;/b&gt; dhen bheachd gum b’ fheairrde e na gràineagan aige fhèin a mharbhadh le &lt;b&gt;%2&lt;/b&gt; phuing.</numerusform>
+            <numerusform>Bha &lt;b&gt;%1&lt;/b&gt; dhen bheachd gum b’ fheairrde e na gràineagan aige fhèin a mharbhadh le &lt;b&gt;%2&lt;/b&gt; puingean.</numerusform>
+            <numerusform>Bha &lt;b&gt;%1&lt;/b&gt; dhen bheachd gum b’ fheairrde e na gràineagan aige fhèin a mharbhadh le &lt;b&gt;%2&lt;/b&gt; puing.</numerusform>
+        </translation>
     </message>
     <message numerus="yes">
         <source>&lt;b&gt;%1&lt;/b&gt; killed &lt;b&gt;%2&lt;/b&gt; of his own hedgehogs.</source>
-        <translation type="vanished"><numerusform>Mharbh &lt;b&gt;%1&lt;/b&gt; &lt;b&gt;%2&lt;/b&gt; dhe na gràineagan aige fhèin.</numerusform><numerusform>Mharbh &lt;b&gt;%1&lt;/b&gt; &lt;b&gt;%2&lt;/b&gt; dhe na gràineagan aige fhèin.</numerusform><numerusform>Mharbh &lt;b&gt;%1&lt;/b&gt; &lt;b&gt;%2&lt;/b&gt; dhe na gràineagan aige fhèin.</numerusform><numerusform>Mharbh &lt;b&gt;%1&lt;/b&gt; &lt;b&gt;%2&lt;/b&gt; dhe na gràineagan aige fhèin.</numerusform></translation>
+        <translation type="vanished">
+            <numerusform>Mharbh &lt;b&gt;%1&lt;/b&gt; &lt;b&gt;%2&lt;/b&gt; dhe na gràineagan aige fhèin.</numerusform>
+            <numerusform>Mharbh &lt;b&gt;%1&lt;/b&gt; &lt;b&gt;%2&lt;/b&gt; dhe na gràineagan aige fhèin.</numerusform>
+            <numerusform>Mharbh &lt;b&gt;%1&lt;/b&gt; &lt;b&gt;%2&lt;/b&gt; dhe na gràineagan aige fhèin.</numerusform>
+            <numerusform>Mharbh &lt;b&gt;%1&lt;/b&gt; &lt;b&gt;%2&lt;/b&gt; dhe na gràineagan aige fhèin.</numerusform>
+        </translation>
     </message>
     <message numerus="yes">
         <source>&lt;b&gt;%1&lt;/b&gt; was scared and skipped turn &lt;b&gt;%2&lt;/b&gt; times.</source>
-        <translation><numerusform>Thàinig an t-eagal air &lt;b&gt;%1&lt;/b&gt; agus leig e seachad a chuairt &lt;b&gt;%2&lt;/b&gt; turas.</numerusform><numerusform>Thàinig an t-eagal air &lt;b&gt;%1&lt;/b&gt; agus leig e seachad a chuairt &lt;b&gt;%2&lt;/b&gt; thuras.</numerusform><numerusform>Thàinig an t-eagal air &lt;b&gt;%1&lt;/b&gt; agus leig e seachad a chuairt &lt;b&gt;%2&lt;/b&gt; tursan.</numerusform><numerusform>Thàinig an t-eagal air &lt;b&gt;%1&lt;/b&gt; agus leig e seachad a chuairt &lt;b&gt;%2&lt;/b&gt; turas.</numerusform></translation>
+        <translation>
+            <numerusform>Thàinig an t-eagal air &lt;b&gt;%1&lt;/b&gt; agus leig e seachad a chuairt &lt;b&gt;%2&lt;/b&gt; turas.</numerusform>
+            <numerusform>Thàinig an t-eagal air &lt;b&gt;%1&lt;/b&gt; agus leig e seachad a chuairt &lt;b&gt;%2&lt;/b&gt; thuras.</numerusform>
+            <numerusform>Thàinig an t-eagal air &lt;b&gt;%1&lt;/b&gt; agus leig e seachad a chuairt &lt;b&gt;%2&lt;/b&gt; tursan.</numerusform>
+            <numerusform>Thàinig an t-eagal air &lt;b&gt;%1&lt;/b&gt; agus leig e seachad a chuairt &lt;b&gt;%2&lt;/b&gt; turas.</numerusform>
+        </translation>
     </message>
     <message>
         <source>Play again</source>
@@ -1398,20 +1540,64 @@
     <message numerus="yes">
         <source>(%1 %2)</source>
         <extracomment>For custom number of points in the stats screen, written after the team name. %1 is the number, %2 is the word. Example: “4 points”</extracomment>
-        <translation><numerusform>(%1 %2)</numerusform><numerusform>(%1 %2)</numerusform><numerusform>(%1 %2)</numerusform><numerusform>(%1 %2)</numerusform></translation>
+        <translation>
+            <numerusform>(%1 %2)</numerusform>
+            <numerusform>(%1 %2)</numerusform>
+            <numerusform>(%1 %2)</numerusform>
+            <numerusform>(%1 %2)</numerusform>
+        </translation>
     </message>
     <message numerus="yes">
         <source>&lt;b&gt;%1&lt;/b&gt; thought it&apos;s good to shoot their own hedgehogs for &lt;b&gt;%2&lt;/b&gt; pts.</source>
-        <translation><numerusform>Bha &lt;b&gt;%1&lt;/b&gt; dhen bheachd gum b’ fheairrde e na gràineagan aige fhèin a mharbhadh airson &lt;b&gt;%2&lt;/b&gt; phuing.</numerusform><numerusform>Bha &lt;b&gt;%1&lt;/b&gt; dhen bheachd gum b’ fheairrde e na gràineagan aige fhèin a mharbhadh airson &lt;b&gt;%2&lt;/b&gt; phuing.</numerusform><numerusform>Bha &lt;b&gt;%1&lt;/b&gt; dhen bheachd gum b’ fheairrde e na gràineagan aige fhèin a mharbhadh airson &lt;b&gt;%2&lt;/b&gt; puingean.</numerusform><numerusform>Bha &lt;b&gt;%1&lt;/b&gt; dhen bheachd gum b’ fheairrde e na gràineagan aige fhèin a mharbhadh airson &lt;b&gt;%2&lt;/b&gt; puing.</numerusform></translation>
+        <translation>
+            <numerusform>Bha &lt;b&gt;%1&lt;/b&gt; dhen bheachd gum b’ fheairrde e na gràineagan aige fhèin a mharbhadh airson &lt;b&gt;%2&lt;/b&gt; phuing.</numerusform>
+            <numerusform>Bha &lt;b&gt;%1&lt;/b&gt; dhen bheachd gum b’ fheairrde e na gràineagan aige fhèin a mharbhadh airson &lt;b&gt;%2&lt;/b&gt; phuing.</numerusform>
+            <numerusform>Bha &lt;b&gt;%1&lt;/b&gt; dhen bheachd gum b’ fheairrde e na gràineagan aige fhèin a mharbhadh airson &lt;b&gt;%2&lt;/b&gt; puingean.</numerusform>
+            <numerusform>Bha &lt;b&gt;%1&lt;/b&gt; dhen bheachd gum b’ fheairrde e na gràineagan aige fhèin a mharbhadh airson &lt;b&gt;%2&lt;/b&gt; puing.</numerusform>
+        </translation>
     </message>
     <message numerus="yes">
         <source>&lt;b&gt;%1&lt;/b&gt; killed &lt;b&gt;%2&lt;/b&gt; of their own hedgehogs.</source>
-        <translation><numerusform>Mharbh &lt;b&gt;%1&lt;/b&gt; &lt;b&gt;%2&lt;/b&gt; dhe na gràineagan aca fhèin.</numerusform><numerusform>Mharbh &lt;b&gt;%1&lt;/b&gt; &lt;b&gt;%2&lt;/b&gt; dhe na gràineagan aca fhèin.</numerusform><numerusform>Mharbh &lt;b&gt;%1&lt;/b&gt; &lt;b&gt;%2&lt;/b&gt; dhe na gràineagan aca fhèin.</numerusform><numerusform>Mharbh &lt;b&gt;%1&lt;/b&gt; &lt;b&gt;%2&lt;/b&gt; dhe na gràineagan aca fhèin.</numerusform></translation>
+        <translation>
+            <numerusform>Mharbh &lt;b&gt;%1&lt;/b&gt; &lt;b&gt;%2&lt;/b&gt; dhe na gràineagan aca fhèin.</numerusform>
+            <numerusform>Mharbh &lt;b&gt;%1&lt;/b&gt; &lt;b&gt;%2&lt;/b&gt; dhe na gràineagan aca fhèin.</numerusform>
+            <numerusform>Mharbh &lt;b&gt;%1&lt;/b&gt; &lt;b&gt;%2&lt;/b&gt; dhe na gràineagan aca fhèin.</numerusform>
+            <numerusform>Mharbh &lt;b&gt;%1&lt;/b&gt; &lt;b&gt;%2&lt;/b&gt; dhe na gràineagan aca fhèin.</numerusform>
+        </translation>
     </message>
     <message>
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation>On a bhuineas a h-uile duine ris an aon chinneadh, cha robh adhbhar sabaid ann. Bha na gràineagan toilichte riamh tuilleadh is cha chuala sinn an corr.</translation>
     </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation>
+            <numerusform>(%1 phuing)</numerusform>
+            <numerusform>(%1 phuing)</numerusform>
+            <numerusform>(%1 puingean)</numerusform>
+            <numerusform>(%1 puing)</numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation>
+            <numerusform>(%L1 diog)</numerusform>
+            <numerusform>(%L1 dhiog)</numerusform>
+            <numerusform>(%L1 diogan)</numerusform>
+            <numerusform>(%L1 diog)</numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation>
+            <numerusform>(%1 chreat)</numerusform>
+            <numerusform>(%1 chreat)</numerusform>
+            <numerusform>(%1 creataichean)</numerusform>
+            <numerusform>(%1 creat)</numerusform>
+        </translation>
+    </message>
 </context>
 <context>
     <name>PageInGame</name>
@@ -1506,12 +1692,27 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation>Ceangail ris an fhrithealaiche a thagh thu</translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation>Ùraich liosta nam frithealaichean</translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation>Sònraich seòladh is àireamh puirt aig frithealaiche air a bheil thu eòlach is ceangail ris gu dìreach</translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation>Tòisich air frithealaiche prìobhaideach</translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
-        <source>Control</source>
-        <translation type="unfinished"/>
-    </message>
-    <message>
         <source>Edit game preferences</source>
         <translation>Deasaich roghainnean a’ gheama</translation>
     </message>
@@ -1643,7 +1844,7 @@
     </message>
     <message>
         <source>Reset to default</source>
-        <translation>Ath-shuidhich air a’ bhun-roghainn</translation>
+        <translation>A’ bhun-roghainn</translation>
     </message>
     <message>
         <source>Reset all binds</source>
@@ -1727,6 +1928,7 @@
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
         <translation>THA AINM CÀNAIN A DHÌTH [%1]</translation>
     </message>
     <message>
@@ -1777,24 +1979,17 @@
 <context>
     <name>PageRoomsList</name>
     <message>
-        <source>Create</source>
-        <translation type="unfinished"/>
-    </message>
-    <message>
-        <source>Join</source>
-        <translation type="unfinished"/>
-    </message>
-    <message>
         <source>Admin features</source>
         <translation>Rianachd</translation>
     </message>
-    <message>
-        <source>Room Name:</source>
-        <translation type="unfinished"/>
-    </message>
     <message numerus="yes">
         <source>%1 players online</source>
-        <translation><numerusform>%1 chluicheadair air loidhne</numerusform><numerusform>%1 chluicheadair air loidhne</numerusform><numerusform>%1 cluicheadairean air loidhne</numerusform><numerusform>%1 cluicheadair air loidhne</numerusform></translation>
+        <translation>
+            <numerusform>%1 chluicheadair air loidhne</numerusform>
+            <numerusform>%1 chluicheadair air loidhne</numerusform>
+            <numerusform>%1 cluicheadairean air loidhne</numerusform>
+            <numerusform>%1 cluicheadair air loidhne</numerusform>
+        </translation>
     </message>
     <message>
         <source>Search for a room:</source>
@@ -1820,14 +2015,6 @@
 <context>
     <name>PageScheme</name>
     <message>
-        <source>Defend your fort and destroy the opponents, two team colours max!</source>
-        <translation type="unfinished"/>
-    </message>
-    <message>
-        <source>Teams will start on opposite sides of the terrain, two team colours max!</source>
-        <translation type="unfinished"/>
-    </message>
-    <message>
         <source>Land can not be destroyed!</source>
         <translation type="vanished">Cha ghabh an talamh a mhilleadh!</translation>
     </message>
@@ -1953,7 +2140,8 @@
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
-        <translation>Dochainn coitcheann agus bualadh air ais ann an ceudad</translation>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
+        <translation>Dochainn coitcheann agus putadh ann an ceudad</translation>
     </message>
     <message>
         <source>Turn time in seconds</source>
@@ -2075,7 +2263,7 @@
     </message>
     <message>
         <source>Practice your skills in a range of training missions</source>
-        <translation>Cuir gleus air na sgilean agad le miseanan trèanaidh</translation>
+        <translation type="vanished">Cuir gleus air na sgilean agad le miseanan trèanaidh</translation>
     </message>
     <message>
         <source>Watch recorded demos</source>
@@ -2085,6 +2273,10 @@
         <source>Load a previously saved game</source>
         <translation>Luchdaich geama air a shàbhaladh</translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation>Miseanan aon-chluicheadair: Ionnsaich mar a chluicheas tu san oideachadh, cleachd na sgilean agad ann an dùbhlanan no feuch an coilean thu an amasan nan cnàmh-sgeulan.</translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -2124,6 +2316,33 @@
         <source>Scenarios</source>
         <translation>Cnàmh-sgeulan</translation>
     </message>
+    <message>
+        <source>Team</source>
+        <translation>Sgioba</translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation>Sgòr as àirde an sgioba: %1</translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation>Sgòr as ìsle an sgioba: %1</translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation>Pongalachd as àirde an sgioba: %1%</translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation>Ùine as fhearr an sgioba: %L1 d</translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation>Ùine as fhaide an sgioba: %L1 d</translation>
+    </message>
 </context>
 <context>
     <name>PageVideos</name>
@@ -2137,7 +2356,12 @@
     </message>
     <message numerus="yes">
         <source>%1 bytes</source>
-        <translation><numerusform>%1 bhaidht</numerusform><numerusform>%1 bhaidht</numerusform><numerusform>%1 baidhtichean</numerusform><numerusform>%1 baidht</numerusform></translation>
+        <translation>
+            <numerusform>%1 bhaidht</numerusform>
+            <numerusform>%1 bhaidht</numerusform>
+            <numerusform>%1 baidhtichean</numerusform>
+            <numerusform>%1 baidht</numerusform>
+        </translation>
     </message>
     <message>
         <source>(in progress...)</source>
@@ -2218,10 +2442,6 @@
         <translation>Thoir air falbh o na caraidean</translation>
     </message>
     <message>
-        <source>Update</source>
-        <translation type="unfinished"/>
-    </message>
-    <message>
         <source>Restrict Unregistered Players Join</source>
         <translation>Cuingich cluicheadairean gun chlàradh</translation>
     </message>
@@ -2377,10 +2597,6 @@
         <translation>Daonna</translation>
     </message>
     <message>
-        <source>Level</source>
-        <translation type="unfinished"/>
-    </message>
-    <message>
         <source>(System default)</source>
         <translation>(Bun-roghainn an t-siostaim)</translation>
     </message>
@@ -2527,10 +2743,6 @@
         <translation>Mèinnean</translation>
     </message>
     <message>
-        <source>Version</source>
-        <translation type="unfinished"/>
-    </message>
-    <message>
         <source>Weapons</source>
         <translation>Airm</translation>
     </message>
@@ -2595,10 +2807,6 @@
         <translation>Ainm</translation>
     </message>
     <message>
-        <source>Type</source>
-        <translation type="unfinished"/>
-    </message>
-    <message>
         <source>Grave</source>
         <translation>Uaigh</translation>
     </message>
@@ -2615,10 +2823,6 @@
         <translation>Cànan</translation>
     </message>
     <message>
-        <source>Explosives</source>
-        <translation type="unfinished"/>
-    </message>
-    <message>
         <source>Quality</source>
         <translation>Càileachd</translation>
     </message>
@@ -2772,6 +2976,7 @@
     </message>
     <message>
         <source>% Retreat Time</source>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
         <translation>% ùine cùlachaidh</translation>
     </message>
     <message>
@@ -2787,6 +2992,10 @@
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
         <translation>A’ luchdadh&lt;br&gt;CAPTCHA …</translation>
     </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation>Sùm (%)</translation>
+    </message>
 </context>
 <context>
     <name>QLineEdit</name>
@@ -2881,14 +3090,6 @@
         <translation>Chaidh gach co-cheangal faidhle a shuidheachadh</translation>
     </message>
     <message>
-        <source>Cannot create directory %1</source>
-        <translation type="unfinished"/>
-    </message>
-    <message>
-        <source>Unable to start the server: %1.</source>
-        <translation type="unfinished"/>
-    </message>
-    <message>
         <source>Video upload - Error</source>
         <translation type="vanished">Luchdadh suas video – Mearachd</translation>
     </message>
@@ -2960,7 +3161,12 @@
     </message>
     <message numerus="yes">
         <source>Do you really want to remove %1 file(s)?</source>
-        <translation><numerusform>A bheil thu airson %1 fhaidhle a thoirt air falbh dha-rìribh?</numerusform><numerusform>A bheil thu airson an %1 fhaidhle a thoirt air falbh dha-rìribh?</numerusform><numerusform>A bheil thu airson na %1 faidhlichean a thoirt air falbh dha-rìribh?</numerusform><numerusform>A bheil thu airson am %1 faidhle a thoirt air falbh dha-rìribh?</numerusform></translation>
+        <translation>
+            <numerusform>A bheil thu airson %1 fhaidhle a thoirt air falbh dha-rìribh?</numerusform>
+            <numerusform>A bheil thu airson an %1 fhaidhle a thoirt air falbh dha-rìribh?</numerusform>
+            <numerusform>A bheil thu airson na %1 faidhlichean a thoirt air falbh dha-rìribh?</numerusform>
+            <numerusform>A bheil thu airson am %1 faidhle a thoirt air falbh dha-rìribh?</numerusform>
+        </translation>
     </message>
     <message>
         <source>Do you really want to cancel uploading %1?</source>
@@ -3041,7 +3247,7 @@
 Chan eil a h-uile cluicheadair ullamh.</translation>
     </message>
     <message>
-        <source>Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs.
+        <source>Sorry, Hedgewars can&apos;t be played with more than 48 hedgehogs. Please try again with fewer hedgehogs.
 
 Current number of hedgehogs: %1</source>
         <translation type="vanished">Tha sinn duilich ach chan urrainn dhut Hedgewars a chluiche le corr is 48 gràineag. Feuch ris a-rithist le nas lugha a grhàineagan.
@@ -3100,6 +3306,16 @@
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation>Tha sgeama airm air a bheil “%1” ann mu thràth. Chaidh na h-atharraichean air an sgeama airm a thilgeil air falbh.</translation>
     </message>
+    <message>
+        <source>Server redirection</source>
+        <translation>Ath-stiùireadh an fhrithealaiche</translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation>Cuiridh am frithealaiche seo taic ri ceanglaichean tèarainte air port %1.
+A bheil thu airson ath-cheangal ris gu tèarainte?</translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
@@ -3136,17 +3352,13 @@
     </message>
     <message>
         <source>Specify</source>
-        <translation>Sònraich</translation>
+        <translation type="vanished">Sònraich</translation>
     </message>
     <message>
         <source>Start</source>
         <translation>Tòisich</translation>
     </message>
     <message>
-        <source>Go!</source>
-        <translation type="unfinished"/>
-    </message>
-    <message>
         <source>Play demo</source>
         <translation>Cluich demo</translation>
     </message>
@@ -3234,6 +3446,10 @@
         <source>Upload this video to your YouTube account</source>
         <translation type="vanished">Luchdaich suas a’ video seo dhan chunntas YouTube agad</translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation>Sònraich seòladh</translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
@@ -3365,10 +3581,6 @@
         <translation>Dàlaichean</translation>
     </message>
     <message>
-        <source>new</source>
-        <translation type="unfinished"/>
-    </message>
-    <message>
         <source>New</source>
         <translation>Ùr</translation>
     </message>
@@ -3473,10 +3685,6 @@
         <translation>dèan suids</translation>
     </message>
     <message>
-        <source>find hedgehog</source>
-        <translation type="unfinished"/>
-    </message>
-    <message>
         <source>ammo menu</source>
         <translation>clàr-taice a’ chonnaidh</translation>
     </message>
@@ -3566,7 +3774,7 @@
     </message>
     <message>
         <source>capture</source>
-        <translation>glac</translation>
+        <translation type="vanished">glac</translation>
     </message>
     <message>
         <source>quit</source>
@@ -3582,7 +3790,7 @@
     </message>
     <message>
         <source>reset zoom</source>
-        <translation>ath-shuidhich an sùm</translation>
+        <translation type="vanished">ath-shuidhich an sùm</translation>
     </message>
     <message>
         <source>long jump</source>
@@ -3631,7 +3839,7 @@
     </message>
     <message>
         <source>toggle hedgehog tags</source>
-        <translation>toglaich na tagaichean gràineige</translation>
+        <translation>toglaich thagaichean gràineige</translation>
     </message>
     <message>
         <source>change timer</source>
@@ -3645,6 +3853,62 @@
         <source>clan chat</source>
         <translation>cabadaich a’ chinnidh</translation>
     </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation>dì-thagh an t-arm</translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation>seas gun ghluasad air tìr sleamhnach</translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation>atharraich do chomhair gun ghluasad</translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation>dèan suids an comhair a’ chùil</translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation>atharraich am bocadh</translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation>ath-shuidhich an sùm air an luach tùsail</translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation>suidhich an sùm air 100%</translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation>sàbhail am mapa ’na dhealbh</translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation>seall fiosrachadh an oibseict</translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation>atharraich seòrsaichean thagaichean gràineige</translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation>toglaich trìd-shoilleireachd nan tagaichean gràineige</translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation>toglaich an HUD</translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation>leum an comhair a’ chùil</translation>
+    </message>
+    <message>
+        <source>screenshot</source>
+        <translation>glacadh-sgrìn</translation>
+    </message>
 </context>
 <context>
     <name>binds (categories)</name>
@@ -3666,6 +3930,49 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation>cum sìos an t-amas pongail</translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation>amas pongail + gu clì/deas</translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation>amas pongail + dèan suids</translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation>amas pongail + tìmear</translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation>amas pongail + ath-shuidhich an sùm</translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation>amas pongail + toglaich thagaichean gràineige</translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation>dèan suidse + toglaich thagaichean gràineige</translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation>amas pongail + dèan suidse + toglaich thagaichean gràineige</translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation>leum àrd (dà thuras)</translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation>amas pongail + glacadh-sgrìn</translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -3681,7 +3988,7 @@
     </message>
     <message>
         <source>Switch your currently active hog (if possible):</source>
-        <translation>Gearr leum gu gràineag eile (ma ghabhas seo dèanamh):</translation>
+        <translation>Dèan suids gu gràineag eile (ma ghabhas seo dèanamh):</translation>
     </message>
     <message>
         <source>Pick a weapon or utility item:</source>
@@ -3692,10 +3999,6 @@
         <translation>Suidhich an tìmear air boma no arm eile le tìmear:</translation>
     </message>
     <message>
-        <source>Move the camera to the active hog:</source>
-        <translation type="unfinished"/>
-    </message>
-    <message>
         <source>Move the cursor or camera without using the mouse:</source>
         <translation>Gluais an cùrsair no an camara gun a bhith a’ cleachdadh na luchaige:</translation>
     </message>
@@ -3840,71 +4143,71 @@
     </message>
     <message>
         <source>Numpad 0</source>
-        <translation>0 air pada nan àireamh</translation>
+        <translation type="vanished">0 air pada nan àireamh</translation>
     </message>
     <message>
         <source>Numpad 1</source>
-        <translation>1 air pada nan àireamh</translation>
+        <translation type="vanished">1 air pada nan àireamh</translation>
     </message>
     <message>
         <source>Numpad 2</source>
-        <translation>2 air pada nan àireamh</translation>
+        <translation type="vanished">2 air pada nan àireamh</translation>
     </message>
     <message>
         <source>Numpad 3</source>
-        <translation>3 air pada nan àireamh</translation>
+        <translation type="vanished">3 air pada nan àireamh</translation>
     </message>
     <message>
         <source>Numpad 4</source>
-        <translation>4 air pada nan àireamh</translation>
+        <translation type="vanished">4 air pada nan àireamh</translation>
     </message>
     <message>
         <source>Numpad 5</source>
-        <translation>5 air pada nan àireamh</translation>
+        <translation type="vanished">5 air pada nan àireamh</translation>
     </message>
     <message>
         <source>Numpad 6</source>
-        <translation>6 air pada nan àireamh</translation>
+        <translation type="vanished">6 air pada nan àireamh</translation>
     </message>
     <message>
         <source>Numpad 7</source>
-        <translation>7 air pada nan àireamh</translation>
+        <translation type="vanished">7 air pada nan àireamh</translation>
     </message>
     <message>
         <source>Numpad 8</source>
-        <translation>8 air pada nan àireamh</translation>
+        <translation type="vanished">8 air pada nan àireamh</translation>
     </message>
     <message>
         <source>Numpad 9</source>
-        <translation>9 air pada nan àireamh</translation>
+        <translation type="vanished">9 air pada nan àireamh</translation>
     </message>
     <message>
         <source>Numpad .</source>
-        <translation>. air pada nan àireamh</translation>
+        <translation type="vanished">. air pada nan àireamh</translation>
     </message>
     <message>
         <source>Numpad /</source>
-        <translation>/ air pada nan àireamh</translation>
+        <translation type="vanished">/ air pada nan àireamh</translation>
     </message>
     <message>
         <source>Numpad *</source>
-        <translation>* air pada nan àireamh</translation>
+        <translation type="vanished">* air pada nan àireamh</translation>
     </message>
     <message>
         <source>Numpad -</source>
-        <translation>- air pada nan àireamh</translation>
+        <translation type="vanished">- air pada nan àireamh</translation>
     </message>
     <message>
         <source>Numpad +</source>
-        <translation>+ air pada nan àireamh</translation>
+        <translation type="vanished">+ air pada nan àireamh</translation>
     </message>
     <message>
         <source>Enter</source>
-        <translation>Enter</translation>
+        <translation type="vanished">Enter</translation>
     </message>
     <message>
         <source>Equals</source>
-        <translation>Co-ionnnannachd</translation>
+        <translation type="vanished">Co-ionnannachd</translation>
     </message>
     <message>
         <source>Up</source>
@@ -3936,55 +4239,55 @@
     </message>
     <message>
         <source>Page up</source>
-        <translation>Page up</translation>
+        <translation type="vanished">Page up</translation>
     </message>
     <message>
         <source>Page down</source>
-        <translation>Page down</translation>
+        <translation type="vanished">Page down</translation>
     </message>
     <message>
         <source>Num lock</source>
-        <translation>Num lock</translation>
+        <translation type="vanished">Num lock</translation>
     </message>
     <message>
         <source>Caps lock</source>
-        <translation>Caps lock</translation>
+        <translation type="vanished">Caps lock</translation>
     </message>
     <message>
         <source>Scroll lock</source>
-        <translation>Scroll lock</translation>
+        <translation type="vanished">Scroll lock</translation>
     </message>
     <message>
         <source>Right shift</source>
-        <translation>Shift deas</translation>
+        <translation type="vanished">Shift deas</translation>
     </message>
     <message>
         <source>Left shift</source>
-        <translation>Shift clì</translation>
+        <translation type="vanished">Shift clì</translation>
     </message>
     <message>
         <source>Right ctrl</source>
-        <translation>Ctrl deas</translation>
+        <translation type="vanished">Ctrl deas</translation>
     </message>
     <message>
         <source>Left ctrl</source>
-        <translation>Ctrl clì</translation>
+        <translation type="vanished">Ctrl clì</translation>
     </message>
     <message>
         <source>Right alt</source>
-        <translation>Alt deas</translation>
+        <translation type="vanished">Alt deas</translation>
     </message>
     <message>
         <source>Left alt</source>
-        <translation>Alt clì</translation>
+        <translation type="vanished">Alt clì</translation>
     </message>
     <message>
         <source>Right meta</source>
-        <translation>Meta deas</translation>
+        <translation type="vanished">Meta deas</translation>
     </message>
     <message>
         <source>Left meta</source>
-        <translation>Meta clì</translation>
+        <translation type="vanished">Meta clì</translation>
     </message>
     <message>
         <source>A button</source>
@@ -4089,6 +4392,609 @@
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
         <translation>Pada-D %1 %2</translation>
     </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation>(Na cleachd seo)</translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
+        <translation>Luchag: putan X1</translation>
+    </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation>Luchag: putan X2</translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation>0 air pada nan àireamh</translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation>1 air pada nan àireamh</translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation>2 air pada nan àireamh</translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation>3 air pada nan àireamh</translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation>4 air pada nan àireamh</translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation>5 air pada nan àireamh</translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation>6 air pada nan àireamh</translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation>7 air pada nan àireamh</translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation>8 air pada nan àireamh</translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation>9 air pada nan àireamh</translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation>. air pada nan àireamh</translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation>/ air pada nan àireamh</translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation>* air pada nan àireamh</translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation>- air pada nan àireamh</translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation>+ air pada nan àireamh</translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation>Enter air pada nan àireamh</translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation>Duilleag suas</translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation>Duilleag sìos</translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation>Numlock</translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation>Caps Lock</translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation>Scroll Lock</translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation>Shift deas</translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation>Shift clì</translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation>Ctrl deas</translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation>Ctrl clì</translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation>Alt deas</translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation>Alt clì</translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation>GUI deas</translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation>GUI clì</translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation>(QWERTY)</translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation>Clàr-taice</translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation>Prògramachadh</translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation>Einnsean a’ gheama</translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation>Ùghdar</translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation>Iomadh piseach air an einnsean</translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation>Amalachadh pada-geama is Lua</translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation>Taic ri iomairtean</translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation>Piseach air gnàthachadh nan ùrlaran</translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation>Obair air Pas2C agus GLES2</translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation>Clàradh video</translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation>Pisich eile</translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation>Gineadh mhapaichean</translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation>Bun-ghineadairean mhapaichean</translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation>Mapaichean Perlin is pisich eile</translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation>Mapaichean cuartain</translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation>Airm</translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation>A’ mhòrchuid dhe na bun-airm</translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation>Mèin adhair, bann rubair ’s airm eile</translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation>Rocaid tochlaidh, gunna-bhàlaichean, itealan le smachd chèin</translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation>Reòthadair</translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation>Roghainnean air uiread nam mèinnean is ùine a’ gheama</translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation>Frontend / prìomh chlàr-taice</translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation>Iomadh piseach air a’ frontend</translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation>Eadar-aghaidhean airson nasgadh iuchraichean, beachdan thugainn, mapaichean is adan</translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation>Còmhraidhean clàraidh a-steach is pisich eile</translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation>Miseanan is stoidhlichean</translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation>Sean-eachdraidh</translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation>Dàna-thuras san fhànas</translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation>Ùghdar aig Glac a’ bhratach, Modh togail, Stiùireadh, An deasaiche, Highlander, Rèis, Rèis theicnigeach, Na speisealaichean, O bhalla gu balla</translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation>Oideachadh, dùbhlanan ùine is cleachdadh amais, Blàr a’ bhazooka, Maoimeadh nan greimichean, Arm-lann mòr, càradh air bugaichean is obair-chàraidh</translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation>Cuid a stoidhlichean is miseanan</translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation>Cath</translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation>Solar mòr-thìreach</translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation>Obair còmhla 2</translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation>Sreap dhachaigh</translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation>Dùbhlan nan doras</translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation>Frithealaiche a’ gheama</translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation>Portadh</translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation>Portadh gu macOS/iPhone, iompachadh gu OpenGL-ES</translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation>Portadh gu Android</translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation>Cluich-lìn Android, eas-chruthachd portaidh</translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation>Portadh gu WebGL</translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation>Portadh gu iPhone/iPad</translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation>Grafaigeachd</translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation>Coitcheann</translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation>Ùrlaran</translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation>An nàdar, sneachd, baile, caisteal, Oidhche Shamhna, eilean</translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation>Bambù, togail talmhainn, BambooPlinko</translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation>Goilf, Hoggywood, àrd-ùrlar</translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation>Hoggywood</translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation>Uamh, geamannan Oilimpigeach</translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation>Meas, cèic</translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation>Obair-ealain</translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation>Tràigh</translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation>Breige</translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation>Ifrinn</translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation>Dlùth-choille</translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation>Caoraich</translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation>Mapaichean</translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation>Ball-basgaid, raon buill-bhasgaid, amar, sruthadh bhuilgean, an leabaidh-chrochte, Hedgelove, Hedgewars, hàidreant, balgain-bhuachair, itealan, ròpannan, craobh</translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation>Bambù, blocaichean, cèic, Cogs, togail talmhainn, mòr-rathad</translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation>caisteal, bratach spùinneadair</translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation>ShoppaKing, TrophyRace</translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation>Blàr</translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation>CTF_Blizzard</translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation>Càise</translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation>Sreap dhachaigh</translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation>Lonely_Island</translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation>Octorama</translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation>doras</translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation>Rùilear</translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation>Steigeadh</translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation>Dùin</translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation>Cearc olc</translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation>Geamannan Oilimpigeach</translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation>Tanca</translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation>Seilcheag</translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation>Tùr stàilinn</translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation>Adan, uaighean, nithean eile</translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation>Faic faidhle teacsa CREDITS</translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation>Fuaimean</translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation>Guth nan gràineagan</translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation>Guthan tùsail &apos;s san Ruisis</translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation>Iomadh ùghdar o www.freesound.org (faic faidhle teacsa CREDITS)</translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation>Ceòl</translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation>Baile, creag, eile</translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation>Compost</translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation>Togail talmhainn, Oirthireach, spùinneadair, sneachd</translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation>Meas, dlùth-choille</translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation>An nàdar</translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation>olympics_sd</translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation>sdmusic (Hitman [deasachadh sheepluva])</translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation>Eadar-theangachaidhean</translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation>Portagailis Bhraisileach</translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation>Bulgarais</translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation>Seicis</translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation>Sìnis</translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation>Fionnlannais</translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation>Fraingis</translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation>Gearmailtis</translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation>Greugais</translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation>Eadailtis</translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation>Seapanais</translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation>Coirèanais</translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation>Liotuainis</translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation>Pòlannais</translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation>Portagailis</translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation>Ruisis</translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation>Gàidhlig na h-Alba</translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation>Slòbhacais</translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation>Spàinntis</translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation>Suainis</translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation>Ucràinis</translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation>Taing shònraichte</translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation>Stèidheadair a’ phròiseict</translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -4286,7 +5192,7 @@
     </message>
     <message>
         <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation>Àitheantan callvote a tha ri am faighinn: kick &lt;far-ainm&gt;, map &lt;ainm&gt;, pause, newseed, hedgehogs</translation>
+        <translation type="vanished">Àitheantan callvote a tha ri am faighinn: kick &lt;far-ainm&gt;, map &lt;ainm&gt;, pause, newseed, hedgehogs</translation>
     </message>
     <message>
         <source>callvote kick: specify nickname</source>
@@ -4458,7 +5364,7 @@
     </message>
     <message>
         <source>/me &lt;message&gt;: Chat action, e.g. &apos;/me eats pizza&apos; becomes &apos;* Player eats pizza&apos;</source>
-        <translation>/me &lt;message&gt;: gnìomh na cabadaich, mar eisimpleir, thèid “/me ag ithe taigeis” ’na “* Cluicheadair ag ithe taigeis”</translation>
+        <translation>/me &lt;message&gt;: gnìomh sa chabadaich, mar eisimpleir, thèid “/me ag ithe ceann-cropaig” ’na “* Cluicheadair ag ithe ceann-cropaig”</translation>
     </message>
     <message>
         <source>/rnd: Flip a virtual coin and reply with &apos;heads&apos; or &apos;tails&apos;</source>
@@ -4630,7 +5536,7 @@
     </message>
     <message>
         <source>&apos;Registered only&apos; state toggled.</source>
-        <translation>Chaidh an staid “Buill clàraichte a-mhàin” a thoglachadh.</translation>
+        <translation type="vanished">Chaidh an staid “Buill clàraichte a-mhàin” a thoglachadh.</translation>
     </message>
     <message>
         <source>Super power activated.</source>
@@ -4696,5 +5602,25 @@
         <source>This command is only available in rooms.</source>
         <translation>Chan eil an àithne seo ri fhaighinn ach ann an seòmar.</translation>
     </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation>Cha cheadaich am frithealaiche seo tuilleadh gun dig cluicheadairean gun chlàradh ann.</translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation>Ceadaichidh am frithealaiche seo a-nis gun dig cluicheadairean gun chlàradh ann.</translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation>Àitheantan callvote a tha ri am faighinn: hedgehogs &lt;àireamh&gt;, pause, newseed, map &lt;ainm&gt;, kick &lt;cluicheadair&gt;</translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation>Dearbh ath-thòiseachadh an fhrithealaiche le “/restart_server yes”.</translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation>Rabhadh! Chaidh dìon tuile air atharrachadh ainm an t-seòmair a ghnìomhachadh</translation>
+    </message>
 </context>
-</TS>
\ No newline at end of file
+</TS>
--- a/share/hedgewars/Data/Locale/hedgewars_gl.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_gl.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -78,6 +78,49 @@
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>AbstractPage</name>
@@ -309,21 +352,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -526,10 +573,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Guest</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Room password</source>
         <translation type="unfinished"></translation>
     </message>
@@ -778,6 +821,18 @@
         <source>Click to edit</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation type="unfinished">Cargar</translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
@@ -891,6 +946,20 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>HatButton</name>
     <message>
         <source>Change hat (%1)</source>
@@ -929,6 +998,10 @@
         <source>Category</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>LibavInteraction</name>
@@ -969,6 +1042,7 @@
     </message>
     <message>
         <source>Record: %1</source>
+        <extracomment>As in ‘recording’</extracomment>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -1337,6 +1411,29 @@
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
 </context>
 <context>
     <name>PageInGame</name>
@@ -1431,6 +1528,25 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <source>Control</source>
@@ -1657,6 +1773,7 @@
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -1889,6 +2006,7 @@
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2010,10 +2128,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Practice your skills in a range of training missions</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Watch recorded demos</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2021,6 +2135,10 @@
         <source>Load a previously saved game</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -2060,6 +2178,33 @@
         <source>Scenarios</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageVideos</name>
@@ -2660,6 +2805,7 @@
     </message>
     <message>
         <source>% Retreat Time</source>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2675,6 +2821,10 @@
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QLineEdit</name>
@@ -2935,6 +3085,15 @@
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Server redirection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
@@ -2971,7 +3130,7 @@
     </message>
     <message>
         <source>Specify</source>
-        <translation>Especificar</translation>
+        <translation type="vanished">Especificar</translation>
     </message>
     <message>
         <source>Start</source>
@@ -3053,6 +3212,10 @@
         <source>Start private server</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
@@ -3379,7 +3542,7 @@
     </message>
     <message>
         <source>capture</source>
-        <translation>capturar</translation>
+        <translation type="vanished">capturar</translation>
     </message>
     <message>
         <source>quit</source>
@@ -3395,7 +3558,7 @@
     </message>
     <message>
         <source>reset zoom</source>
-        <translation>distancia inicial</translation>
+        <translation type="vanished">distancia inicial</translation>
     </message>
     <message>
         <source>long jump</source>
@@ -3450,6 +3613,62 @@
         <source>clan chat</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>binds (categories)</name>
@@ -3471,6 +3690,49 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -3645,71 +3907,71 @@
     </message>
     <message>
         <source>Numpad 0</source>
-        <translation>Teclado numérico: 0</translation>
+        <translation type="vanished">Teclado numérico: 0</translation>
     </message>
     <message>
         <source>Numpad 1</source>
-        <translation>Teclado numérico: 1</translation>
+        <translation type="vanished">Teclado numérico: 1</translation>
     </message>
     <message>
         <source>Numpad 2</source>
-        <translation>Teclado numérico: 2</translation>
+        <translation type="vanished">Teclado numérico: 2</translation>
     </message>
     <message>
         <source>Numpad 3</source>
-        <translation>Teclado numérico: 3</translation>
+        <translation type="vanished">Teclado numérico: 3</translation>
     </message>
     <message>
         <source>Numpad 4</source>
-        <translation>Teclado numérico: 4</translation>
+        <translation type="vanished">Teclado numérico: 4</translation>
     </message>
     <message>
         <source>Numpad 5</source>
-        <translation>Teclado numérico: 5</translation>
+        <translation type="vanished">Teclado numérico: 5</translation>
     </message>
     <message>
         <source>Numpad 6</source>
-        <translation>Teclado numérico: 6</translation>
+        <translation type="vanished">Teclado numérico: 6</translation>
     </message>
     <message>
         <source>Numpad 7</source>
-        <translation>Teclado numérico: 7</translation>
+        <translation type="vanished">Teclado numérico: 7</translation>
     </message>
     <message>
         <source>Numpad 8</source>
-        <translation>Teclado numérico: 8</translation>
+        <translation type="vanished">Teclado numérico: 8</translation>
     </message>
     <message>
         <source>Numpad 9</source>
-        <translation>Teclado numérico: 9</translation>
+        <translation type="vanished">Teclado numérico: 9</translation>
     </message>
     <message>
         <source>Numpad .</source>
-        <translation>Teclado numérico: .</translation>
+        <translation type="vanished">Teclado numérico: .</translation>
     </message>
     <message>
         <source>Numpad /</source>
-        <translation>Teclado numérico: /</translation>
+        <translation type="vanished">Teclado numérico: /</translation>
     </message>
     <message>
         <source>Numpad *</source>
-        <translation>Teclado numérico: *</translation>
+        <translation type="vanished">Teclado numérico: *</translation>
     </message>
     <message>
         <source>Numpad -</source>
-        <translation>Teclado numérico: -</translation>
+        <translation type="vanished">Teclado numérico: -</translation>
     </message>
     <message>
         <source>Numpad +</source>
-        <translation>Teclado numérico: +</translation>
+        <translation type="vanished">Teclado numérico: +</translation>
     </message>
     <message>
         <source>Enter</source>
-        <translation>Intro</translation>
+        <translation type="vanished">Intro</translation>
     </message>
     <message>
         <source>Equals</source>
-        <translation>Igual</translation>
+        <translation type="vanished">Igual</translation>
     </message>
     <message>
         <source>Up</source>
@@ -3741,55 +4003,55 @@
     </message>
     <message>
         <source>Page up</source>
-        <translation>Re Páx</translation>
+        <translation type="vanished">Re Páx</translation>
     </message>
     <message>
         <source>Page down</source>
-        <translation>Av Páx</translation>
+        <translation type="vanished">Av Páx</translation>
     </message>
     <message>
         <source>Num lock</source>
-        <translation>Bloq Num</translation>
+        <translation type="vanished">Bloq Num</translation>
     </message>
     <message>
         <source>Caps lock</source>
-        <translation>Bloq Maiús</translation>
+        <translation type="vanished">Bloq Maiús</translation>
     </message>
     <message>
         <source>Scroll lock</source>
-        <translation>Bloq Despr</translation>
+        <translation type="vanished">Bloq Despr</translation>
     </message>
     <message>
         <source>Right shift</source>
-        <translation>Maiús dereito</translation>
+        <translation type="vanished">Maiús dereito</translation>
     </message>
     <message>
         <source>Left shift</source>
-        <translation>Maiús esquerdo</translation>
+        <translation type="vanished">Maiús esquerdo</translation>
     </message>
     <message>
         <source>Right ctrl</source>
-        <translation>Ctrl dereito</translation>
+        <translation type="vanished">Ctrl dereito</translation>
     </message>
     <message>
         <source>Left ctrl</source>
-        <translation>Ctrl esquerdo</translation>
+        <translation type="vanished">Ctrl esquerdo</translation>
     </message>
     <message>
         <source>Right alt</source>
-        <translation>Alt dereito</translation>
+        <translation type="vanished">Alt dereito</translation>
     </message>
     <message>
         <source>Left alt</source>
-        <translation>Alt esquerdo</translation>
+        <translation type="vanished">Alt esquerdo</translation>
     </message>
     <message>
         <source>Right meta</source>
-        <translation>Meta dereito</translation>
+        <translation type="vanished">Meta dereito</translation>
     </message>
     <message>
         <source>Left meta</source>
-        <translation>Meta esquerdo</translation>
+        <translation type="vanished">Meta esquerdo</translation>
     </message>
     <message>
         <source>A button</source>
@@ -3894,6 +4156,609 @@
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation type="unfinished">Armamento</translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation type="unfinished">Xeral</translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -3966,10 +4831,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>The game can&apos;t be started with less than two clans!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4262,10 +5123,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>&apos;Registered only&apos; state toggled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Super power activated.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4329,5 +5186,25 @@
         <source>This command is only available in rooms.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 </TS>
--- a/share/hedgewars/Data/Locale/hedgewars_hu.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_hu.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -78,6 +78,49 @@
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>AbstractPage</name>
@@ -303,21 +346,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -520,10 +567,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Guest</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Room password</source>
         <translation type="unfinished"></translation>
     </message>
@@ -772,6 +815,18 @@
         <source>Click to edit</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation type="unfinished">Betöltés</translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
@@ -885,6 +940,20 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>HatButton</name>
     <message>
         <source>Change hat (%1)</source>
@@ -923,6 +992,10 @@
         <source>Category</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>LibavInteraction</name>
@@ -963,6 +1036,7 @@
     </message>
     <message>
         <source>Record: %1</source>
+        <extracomment>As in ‘recording’</extracomment>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -1322,6 +1396,26 @@
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+        </translation>
+    </message>
 </context>
 <context>
     <name>PageInGame</name>
@@ -1416,6 +1510,25 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <source>Control</source>
@@ -1642,6 +1755,7 @@
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -1873,6 +1987,7 @@
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -1994,10 +2109,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Practice your skills in a range of training missions</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Watch recorded demos</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2005,6 +2116,10 @@
         <source>Load a previously saved game</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -2044,6 +2159,33 @@
         <source>Scenarios</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageVideos</name>
@@ -2651,6 +2793,7 @@
     </message>
     <message>
         <source>% Retreat Time</source>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2666,6 +2809,10 @@
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QLineEdit</name>
@@ -2925,6 +3072,15 @@
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Server redirection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
@@ -2961,7 +3117,7 @@
     </message>
     <message>
         <source>Specify</source>
-        <translation>Specifikálás</translation>
+        <translation type="vanished">Specifikálás</translation>
     </message>
     <message>
         <source>Start</source>
@@ -3043,6 +3199,10 @@
         <source>Start private server</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
@@ -3369,7 +3529,7 @@
     </message>
     <message>
         <source>capture</source>
-        <translation>elfogás</translation>
+        <translation type="vanished">elfogás</translation>
     </message>
     <message>
         <source>quit</source>
@@ -3385,7 +3545,7 @@
     </message>
     <message>
         <source>reset zoom</source>
-        <translation>zoom visszaállítása</translation>
+        <translation type="vanished">zoom visszaállítása</translation>
     </message>
     <message>
         <source>long jump</source>
@@ -3440,6 +3600,62 @@
         <source>clan chat</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>binds (categories)</name>
@@ -3461,6 +3677,49 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -3635,71 +3894,71 @@
     </message>
     <message>
         <source>Numpad 0</source>
-        <translation>Numpad 0</translation>
+        <translation type="vanished">Numpad 0</translation>
     </message>
     <message>
         <source>Numpad 1</source>
-        <translation>Numpad 1</translation>
+        <translation type="vanished">Numpad 1</translation>
     </message>
     <message>
         <source>Numpad 2</source>
-        <translation>Numpad 2</translation>
+        <translation type="vanished">Numpad 2</translation>
     </message>
     <message>
         <source>Numpad 3</source>
-        <translation>Numpad 3</translation>
+        <translation type="vanished">Numpad 3</translation>
     </message>
     <message>
         <source>Numpad 4</source>
-        <translation>Numpad 4</translation>
+        <translation type="vanished">Numpad 4</translation>
     </message>
     <message>
         <source>Numpad 5</source>
-        <translation>Numpad 5</translation>
+        <translation type="vanished">Numpad 5</translation>
     </message>
     <message>
         <source>Numpad 6</source>
-        <translation>Numpad 6</translation>
+        <translation type="vanished">Numpad 6</translation>
     </message>
     <message>
         <source>Numpad 7</source>
-        <translation>Numpad 7</translation>
+        <translation type="vanished">Numpad 7</translation>
     </message>
     <message>
         <source>Numpad 8</source>
-        <translation>Numpad 8</translation>
+        <translation type="vanished">Numpad 8</translation>
     </message>
     <message>
         <source>Numpad 9</source>
-        <translation>Numpad 9</translation>
+        <translation type="vanished">Numpad 9</translation>
     </message>
     <message>
         <source>Numpad .</source>
-        <translation>Numpad .</translation>
+        <translation type="vanished">Numpad .</translation>
     </message>
     <message>
         <source>Numpad /</source>
-        <translation>Numpad /</translation>
+        <translation type="vanished">Numpad /</translation>
     </message>
     <message>
         <source>Numpad *</source>
-        <translation>Numpad *</translation>
+        <translation type="vanished">Numpad *</translation>
     </message>
     <message>
         <source>Numpad -</source>
-        <translation>Numpad -</translation>
+        <translation type="vanished">Numpad -</translation>
     </message>
     <message>
         <source>Numpad +</source>
-        <translation>Numpad +</translation>
+        <translation type="vanished">Numpad +</translation>
     </message>
     <message>
         <source>Enter</source>
-        <translation>Enter</translation>
+        <translation type="vanished">Enter</translation>
     </message>
     <message>
         <source>Equals</source>
-        <translation>Egyenlő</translation>
+        <translation type="vanished">Egyenlő</translation>
     </message>
     <message>
         <source>Up</source>
@@ -3731,55 +3990,55 @@
     </message>
     <message>
         <source>Page up</source>
-        <translation>Page up</translation>
+        <translation type="vanished">Page up</translation>
     </message>
     <message>
         <source>Page down</source>
-        <translation>Page Down</translation>
+        <translation type="vanished">Page Down</translation>
     </message>
     <message>
         <source>Num lock</source>
-        <translation>Num lock</translation>
+        <translation type="vanished">Num lock</translation>
     </message>
     <message>
         <source>Caps lock</source>
-        <translation>Caps lock</translation>
+        <translation type="vanished">Caps lock</translation>
     </message>
     <message>
         <source>Scroll lock</source>
-        <translation>Scroll lock</translation>
+        <translation type="vanished">Scroll lock</translation>
     </message>
     <message>
         <source>Right shift</source>
-        <translation>Jobb oldali Shift</translation>
+        <translation type="vanished">Jobb oldali Shift</translation>
     </message>
     <message>
         <source>Left shift</source>
-        <translation>Bal oldali Shift</translation>
+        <translation type="vanished">Bal oldali Shift</translation>
     </message>
     <message>
         <source>Right ctrl</source>
-        <translation>Jobb oldali Ctrl</translation>
+        <translation type="vanished">Jobb oldali Ctrl</translation>
     </message>
     <message>
         <source>Left ctrl</source>
-        <translation>Bal oldali Ctrl</translation>
+        <translation type="vanished">Bal oldali Ctrl</translation>
     </message>
     <message>
         <source>Right alt</source>
-        <translation>Jobb oldali Alt</translation>
+        <translation type="vanished">Jobb oldali Alt</translation>
     </message>
     <message>
         <source>Left alt</source>
-        <translation>Bal oldali Alt</translation>
+        <translation type="vanished">Bal oldali Alt</translation>
     </message>
     <message>
         <source>Right meta</source>
-        <translation>Jobb oldali Meta</translation>
+        <translation type="vanished">Jobb oldali Meta</translation>
     </message>
     <message>
         <source>Left meta</source>
-        <translation>Bal oldali Meta</translation>
+        <translation type="vanished">Bal oldali Meta</translation>
     </message>
     <message>
         <source>A button</source>
@@ -3884,6 +4143,609 @@
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation type="unfinished">Fegyverek</translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation type="unfinished">Általános</translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -3956,10 +4818,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>The game can&apos;t be started with less than two clans!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4252,10 +5110,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>&apos;Registered only&apos; state toggled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Super power activated.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4319,5 +5173,25 @@
         <source>This command is only available in rooms.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 </TS>
--- a/share/hedgewars/Data/Locale/hedgewars_it.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_it.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -78,6 +78,49 @@
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>AbstractPage</name>
@@ -324,21 +367,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation>Utilizzo</translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation>OPTION</translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
         <translation>CONNECTSTRING</translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation>Opzioni</translation>
     </message>
     <message>
@@ -560,7 +607,7 @@
     </message>
     <message>
         <source>Guest</source>
-        <translation>Ospite</translation>
+        <translation type="vanished">Ospite</translation>
     </message>
     <message>
         <source>Room password</source>
@@ -830,6 +877,18 @@
         <source>Click to edit</source>
         <translation>Clicca per modificare</translation>
     </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation type="unfinished">Carica</translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
@@ -946,6 +1005,20 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>HWUploadVideoDialog</name>
     <message>
         <source>Upload video</source>
@@ -988,6 +1061,10 @@
         <source>Category</source>
         <translation>Categoria</translation>
     </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>LibavInteraction</name>
@@ -1040,6 +1117,7 @@
     </message>
     <message>
         <source>Record: %1</source>
+        <extracomment>As in ‘recording’</extracomment>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -1426,6 +1504,29 @@
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
 </context>
 <context>
     <name>PageInGame</name>
@@ -1520,6 +1621,25 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation type="unfinished">Avvia un server privato</translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <source>Edit game preferences</source>
@@ -1742,6 +1862,7 @@
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -1958,6 +2079,7 @@
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation>Danni complessivi e perdite in percentuale</translation>
     </message>
     <message>
@@ -2080,7 +2202,7 @@
     </message>
     <message>
         <source>Practice your skills in a range of training missions</source>
-        <translation>Metti alla prova le tue capacità in una vasta gamma di missioni di addestramento</translation>
+        <translation type="vanished">Metti alla prova le tue capacità in una vasta gamma di missioni di addestramento</translation>
     </message>
     <message>
         <source>Watch recorded demos</source>
@@ -2090,6 +2212,10 @@
         <source>Load a previously saved game</source>
         <translation>Carica un gioco salvato in precedenza</translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -2133,6 +2259,33 @@
         <source>Scenarios</source>
         <translation>Scenari</translation>
     </message>
+    <message>
+        <source>Team</source>
+        <translation type="unfinished">Squadra</translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageVideos</name>
@@ -2791,6 +2944,7 @@
     </message>
     <message>
         <source>% Retreat Time</source>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
         <translation>% Tempo di ritirata</translation>
     </message>
     <message>
@@ -2806,6 +2960,10 @@
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QLineEdit</name>
@@ -3102,6 +3260,15 @@
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Server redirection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
@@ -3142,7 +3309,7 @@
     </message>
     <message>
         <source>Specify</source>
-        <translation>Specifica</translation>
+        <translation type="vanished">Specifica</translation>
     </message>
     <message>
         <source>Start</source>
@@ -3232,6 +3399,10 @@
         <source>Start private server</source>
         <translation>Avvia un server privato</translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
@@ -3548,7 +3719,7 @@
     </message>
     <message>
         <source>capture</source>
-        <translation>cattura</translation>
+        <translation type="vanished">cattura</translation>
     </message>
     <message>
         <source>quit</source>
@@ -3580,7 +3751,7 @@
     </message>
     <message>
         <source>reset zoom</source>
-        <translation>reset zoom</translation>
+        <translation type="vanished">reset zoom</translation>
     </message>
     <message>
         <source>long jump</source>
@@ -3639,6 +3810,62 @@
         <source>clan chat</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>binds (categories)</name>
@@ -3660,6 +3887,49 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -3830,71 +4100,71 @@
     </message>
     <message>
         <source>Numpad 0</source>
-        <translation>Numpad 0</translation>
+        <translation type="vanished">Numpad 0</translation>
     </message>
     <message>
         <source>Numpad 1</source>
-        <translation>Numpad 1</translation>
+        <translation type="vanished">Numpad 1</translation>
     </message>
     <message>
         <source>Numpad 2</source>
-        <translation>Numpad 2</translation>
+        <translation type="vanished">Numpad 2</translation>
     </message>
     <message>
         <source>Numpad 3</source>
-        <translation>Numpad 3</translation>
+        <translation type="vanished">Numpad 3</translation>
     </message>
     <message>
         <source>Numpad 4</source>
-        <translation>Numpad 4</translation>
+        <translation type="vanished">Numpad 4</translation>
     </message>
     <message>
         <source>Numpad 5</source>
-        <translation>Numpad 5</translation>
+        <translation type="vanished">Numpad 5</translation>
     </message>
     <message>
         <source>Numpad 6</source>
-        <translation>Numpad 6</translation>
+        <translation type="vanished">Numpad 6</translation>
     </message>
     <message>
         <source>Numpad 7</source>
-        <translation>Numpad 7</translation>
+        <translation type="vanished">Numpad 7</translation>
     </message>
     <message>
         <source>Numpad 8</source>
-        <translation>Numpad 8</translation>
+        <translation type="vanished">Numpad 8</translation>
     </message>
     <message>
         <source>Numpad 9</source>
-        <translation>Numpad 9</translation>
+        <translation type="vanished">Numpad 9</translation>
     </message>
     <message>
         <source>Numpad .</source>
-        <translation>Numpad .</translation>
+        <translation type="vanished">Numpad .</translation>
     </message>
     <message>
         <source>Numpad /</source>
-        <translation>Numpad /</translation>
+        <translation type="vanished">Numpad /</translation>
     </message>
     <message>
         <source>Numpad *</source>
-        <translation>Numpad *</translation>
+        <translation type="vanished">Numpad *</translation>
     </message>
     <message>
         <source>Numpad -</source>
-        <translation>Numpad -</translation>
+        <translation type="vanished">Numpad -</translation>
     </message>
     <message>
         <source>Numpad +</source>
-        <translation>Numpad +</translation>
+        <translation type="vanished">Numpad +</translation>
     </message>
     <message>
         <source>Enter</source>
-        <translation>Invio</translation>
+        <translation type="vanished">Invio</translation>
     </message>
     <message>
         <source>Equals</source>
-        <translation>Uguale</translation>
+        <translation type="vanished">Uguale</translation>
     </message>
     <message>
         <source>Up</source>
@@ -3926,55 +4196,55 @@
     </message>
     <message>
         <source>Page up</source>
-        <translation>Pagina su</translation>
+        <translation type="vanished">Pagina su</translation>
     </message>
     <message>
         <source>Page down</source>
-        <translation>Pagina giù</translation>
+        <translation type="vanished">Pagina giù</translation>
     </message>
     <message>
         <source>Num lock</source>
-        <translation>Bloc Num</translation>
+        <translation type="vanished">Bloc Num</translation>
     </message>
     <message>
         <source>Caps lock</source>
-        <translation>Caps lock</translation>
+        <translation type="vanished">Caps lock</translation>
     </message>
     <message>
         <source>Scroll lock</source>
-        <translation>Bloc Scorr</translation>
+        <translation type="vanished">Bloc Scorr</translation>
     </message>
     <message>
         <source>Right shift</source>
-        <translation>Shift destro</translation>
+        <translation type="vanished">Shift destro</translation>
     </message>
     <message>
         <source>Left shift</source>
-        <translation>Shift sinistro</translation>
+        <translation type="vanished">Shift sinistro</translation>
     </message>
     <message>
         <source>Right ctrl</source>
-        <translation>Ctrl destro</translation>
+        <translation type="vanished">Ctrl destro</translation>
     </message>
     <message>
         <source>Left ctrl</source>
-        <translation>Ctrl sinistro</translation>
+        <translation type="vanished">Ctrl sinistro</translation>
     </message>
     <message>
         <source>Right alt</source>
-        <translation>Alt destro</translation>
+        <translation type="vanished">Alt destro</translation>
     </message>
     <message>
         <source>Left alt</source>
-        <translation>Alt sinistro</translation>
+        <translation type="vanished">Alt sinistro</translation>
     </message>
     <message>
         <source>Right meta</source>
-        <translation>Meta destro</translation>
+        <translation type="vanished">Meta destro</translation>
     </message>
     <message>
         <source>Left meta</source>
-        <translation>Meta sinistro</translation>
+        <translation type="vanished">Meta sinistro</translation>
     </message>
     <message>
         <source>A button</source>
@@ -4079,6 +4349,609 @@
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation type="unfinished">Armi</translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation type="unfinished">Grafica</translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation type="unfinished">Generale</translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation type="unfinished">Forti</translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation type="unfinished">Musica</translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -4280,7 +5153,7 @@
     </message>
     <message>
         <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation>Comandi callvote disponibili: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</translation>
+        <translation type="vanished">Comandi callvote disponibili: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</translation>
     </message>
     <message>
         <source>callvote kick: specify nickname</source>
@@ -4595,10 +5468,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>&apos;Registered only&apos; state toggled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Super power activated.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4662,5 +5531,25 @@
         <source>This command is only available in rooms.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 </TS>
--- a/share/hedgewars/Data/Locale/hedgewars_ja.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_ja.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -78,6 +78,49 @@
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</translation>
     </message>
+    <message>
+        <source>Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>AbstractPage</name>
@@ -302,21 +345,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation>利用説明</translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation>設定</translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
         <translation>接続列</translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation>設定</translation>
     </message>
     <message>
@@ -518,7 +565,7 @@
     </message>
     <message>
         <source>Guest</source>
-        <translation>ゲスト</translation>
+        <translation type="vanished">ゲスト</translation>
     </message>
     <message>
         <source>Room password</source>
@@ -789,6 +836,18 @@
         <source>Click to edit</source>
         <translation>編集</translation>
     </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation type="unfinished">ロード</translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
@@ -910,6 +969,20 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>HatButton</name>
     <message>
         <source>Change hat (%1)</source>
@@ -941,6 +1014,10 @@
         <source>Category</source>
         <translation>カテゴリー</translation>
     </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>LibavInteraction</name>
@@ -971,6 +1048,7 @@
     </message>
     <message>
         <source>Record: %1</source>
+        <extracomment>As in ‘recording’</extracomment>
         <translation>記録:%1</translation>
     </message>
     <message>
@@ -1341,6 +1419,26 @@
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation>みんなが同じクランの一員であるため、戦う必要もありません。めでたしめでたし。</translation>
     </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+        </translation>
+    </message>
 </context>
 <context>
     <name>PageInGame</name>
@@ -1435,6 +1533,25 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation type="unfinished">私用のサーバーを起動する</translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <source>Edit game preferences</source>
@@ -1653,6 +1770,7 @@
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
         <translation>「%1」言語が欠けています</translation>
     </message>
     <message>
@@ -1857,6 +1975,7 @@
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation>総体的なダメージとノックバックの百分率。</translation>
     </message>
     <message>
@@ -1979,7 +2098,7 @@
     </message>
     <message>
         <source>Practice your skills in a range of training missions</source>
-        <translation>トレーニング任務の数々で技を磨く</translation>
+        <translation type="vanished">トレーニング任務の数々で技を磨く</translation>
     </message>
     <message>
         <source>Watch recorded demos</source>
@@ -1989,6 +2108,10 @@
         <source>Load a previously saved game</source>
         <translation>セーブから続ける</translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -2028,6 +2151,33 @@
         <source>Scenarios</source>
         <translation>シナリオ</translation>
     </message>
+    <message>
+        <source>Team</source>
+        <translation type="unfinished">チーム</translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageVideos</name>
@@ -2615,6 +2765,7 @@
     </message>
     <message>
         <source>% Retreat Time</source>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
         <translation>後退時間(%)</translation>
     </message>
     <message>
@@ -2630,6 +2781,10 @@
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
         <translation>CAPTCHA&lt;br&gt;ロード中。。。</translation>
     </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QLineEdit</name>
@@ -2891,6 +3046,15 @@
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation>武器セット「%1」はすでに存在します。編集中の武器セットは「%2」に変名されました。</translation>
     </message>
+    <message>
+        <source>Server redirection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
@@ -2927,7 +3091,7 @@
     </message>
     <message>
         <source>Specify</source>
-        <translation>指定</translation>
+        <translation type="vanished">指定</translation>
     </message>
     <message>
         <source>Start</source>
@@ -3005,6 +3169,10 @@
         <source>Start private server</source>
         <translation>私用のサーバーを起動する</translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
@@ -3324,7 +3492,7 @@
     </message>
     <message>
         <source>capture</source>
-        <translation>取る</translation>
+        <translation type="vanished">取る</translation>
     </message>
     <message>
         <source>quit</source>
@@ -3340,7 +3508,7 @@
     </message>
     <message>
         <source>reset zoom</source>
-        <translation>初期ズーム</translation>
+        <translation type="vanished">初期ズーム</translation>
     </message>
     <message>
         <source>long jump</source>
@@ -3399,6 +3567,62 @@
         <source>clan chat</source>
         <translation>クランチャット</translation>
     </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>binds (categories)</name>
@@ -3420,6 +3644,49 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -3586,71 +3853,71 @@
     </message>
     <message>
         <source>Numpad 0</source>
-        <translation>0(数値パッド)</translation>
+        <translation type="vanished">0(数値パッド)</translation>
     </message>
     <message>
         <source>Numpad 1</source>
-        <translation>1(数値パッド)</translation>
+        <translation type="vanished">1(数値パッド)</translation>
     </message>
     <message>
         <source>Numpad 2</source>
-        <translation>2(数値パッド)</translation>
+        <translation type="vanished">2(数値パッド)</translation>
     </message>
     <message>
         <source>Numpad 3</source>
-        <translation>3(数値パッド)</translation>
+        <translation type="vanished">3(数値パッド)</translation>
     </message>
     <message>
         <source>Numpad 4</source>
-        <translation>4(数値パッド)</translation>
+        <translation type="vanished">4(数値パッド)</translation>
     </message>
     <message>
         <source>Numpad 5</source>
-        <translation>5(数値パッド)</translation>
+        <translation type="vanished">5(数値パッド)</translation>
     </message>
     <message>
         <source>Numpad 6</source>
-        <translation>6(数値パッド)</translation>
+        <translation type="vanished">6(数値パッド)</translation>
     </message>
     <message>
         <source>Numpad 7</source>
-        <translation>7(数値パッド)</translation>
+        <translation type="vanished">7(数値パッド)</translation>
     </message>
     <message>
         <source>Numpad 8</source>
-        <translation>8(数値パッド)</translation>
+        <translation type="vanished">8(数値パッド)</translation>
     </message>
     <message>
         <source>Numpad 9</source>
-        <translation>9(数値パッド)</translation>
+        <translation type="vanished">9(数値パッド)</translation>
     </message>
     <message>
         <source>Numpad .</source>
-        <translation>。(数値パッド)</translation>
+        <translation type="vanished">。(数値パッド)</translation>
     </message>
     <message>
         <source>Numpad /</source>
-        <translation>/(数値パッド)</translation>
+        <translation type="vanished">/(数値パッド)</translation>
     </message>
     <message>
         <source>Numpad *</source>
-        <translation>*(数値パッド)</translation>
+        <translation type="vanished">*(数値パッド)</translation>
     </message>
     <message>
         <source>Numpad -</source>
-        <translation>-(数値パッド)</translation>
+        <translation type="vanished">-(数値パッド)</translation>
     </message>
     <message>
         <source>Numpad +</source>
-        <translation>+(数値パッド)</translation>
+        <translation type="vanished">+(数値パッド)</translation>
     </message>
     <message>
         <source>Enter</source>
-        <translation>Enter</translation>
+        <translation type="vanished">Enter</translation>
     </message>
     <message>
         <source>Equals</source>
-        <translation>イコール</translation>
+        <translation type="vanished">イコール</translation>
     </message>
     <message>
         <source>Up</source>
@@ -3682,55 +3949,55 @@
     </message>
     <message>
         <source>Page up</source>
-        <translation>Page Up</translation>
+        <translation type="vanished">Page Up</translation>
     </message>
     <message>
         <source>Page down</source>
-        <translation>Page Down</translation>
+        <translation type="vanished">Page Down</translation>
     </message>
     <message>
         <source>Num lock</source>
-        <translation>NumLock</translation>
+        <translation type="vanished">NumLock</translation>
     </message>
     <message>
         <source>Caps lock</source>
-        <translation>CapsLock</translation>
+        <translation type="vanished">CapsLock</translation>
     </message>
     <message>
         <source>Scroll lock</source>
-        <translation>ScrollLock</translation>
+        <translation type="vanished">ScrollLock</translation>
     </message>
     <message>
         <source>Right shift</source>
-        <translation>右Shift</translation>
+        <translation type="vanished">右Shift</translation>
     </message>
     <message>
         <source>Left shift</source>
-        <translation>左Shift</translation>
+        <translation type="vanished">左Shift</translation>
     </message>
     <message>
         <source>Right ctrl</source>
-        <translation>右Ctrl</translation>
+        <translation type="vanished">右Ctrl</translation>
     </message>
     <message>
         <source>Left ctrl</source>
-        <translation>左Ctrl</translation>
+        <translation type="vanished">左Ctrl</translation>
     </message>
     <message>
         <source>Right alt</source>
-        <translation>右Alt</translation>
+        <translation type="vanished">右Alt</translation>
     </message>
     <message>
         <source>Left alt</source>
-        <translation>左Alt</translation>
+        <translation type="vanished">左Alt</translation>
     </message>
     <message>
         <source>Right meta</source>
-        <translation>右メタ</translation>
+        <translation type="vanished">右メタ</translation>
     </message>
     <message>
         <source>Left meta</source>
-        <translation>左メタ</translation>
+        <translation type="vanished">左メタ</translation>
     </message>
     <message>
         <source>A button</source>
@@ -3835,6 +4102,609 @@
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
         <translation>十字ボタン%1%2</translation>
     </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation type="unfinished">武器</translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation type="unfinished">グラフィック</translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation type="unfinished">一般</translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation type="unfinished">要塞</translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation type="unfinished">音楽</translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -3912,7 +4782,7 @@
     </message>
     <message>
         <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation>使用可能なcallvote指令:kick &lt;ニックネーム&gt;, map &lt;マップ名&gt;, pause, newseed, hedgehogs</translation>
+        <translation type="vanished">使用可能なcallvote指令:kick &lt;ニックネーム&gt;, map &lt;マップ名&gt;, pause, newseed, hedgehogs</translation>
     </message>
     <message>
         <source>The game can&apos;t be started with less than two clans!</source>
@@ -4072,7 +4942,7 @@
     </message>
     <message>
         <source>/rnd [A] [B] [C] [...]: Reply with a random word from the given list</source>
-        <translation>/rnd <選択肢1> <選択肢2> 。。。:選択肢のうちの一つをランダムに出力する</translation>
+        <translation>/rnd <選択肢1>&#x3000;<選択肢2>&#x3000;。。。:選択肢のうちの一つをランダムに出力する</translation>
     </message>
     <message>
         <source>/watch &lt;id&gt;: Watch a demo stored on the server with the given ID</source>
@@ -4088,7 +4958,7 @@
     </message>
     <message>
         <source>/vote &lt;yes/no&gt;: Vote &apos;yes&apos; or &apos;no&apos; for active vote</source>
-        <translation>/vote <投票>:賛成「yes」か反対「no」で投票する</translation>
+        <translation>/vote&#x3000;<投票>:賛成「yes」か反対「no」で投票する</translation>
     </message>
     <message>
         <source>/delegate &lt;player&gt;: Surrender room control to player</source>
@@ -4096,11 +4966,11 @@
     </message>
     <message>
         <source>/maxteams &lt;N&gt;: Limit maximum number of teams to N</source>
-        <translation>/maxteams <数>:最大のチーム数を指定する</translation>
+        <translation>/maxteams&#x3000;<数>:最大のチーム数を指定する</translation>
     </message>
     <message>
         <source>/global &lt;message&gt;: Send global chat message which can be seen by everyone on the server</source>
-        <translation>/global <メッセージ>:グロリアチャットにメッセージを送る</translation>
+        <translation>/global&#x3000;<メッセージ>:グロリアチャットにメッセージを送る</translation>
     </message>
     <message>
         <source>/registered_only: Toggle &apos;registered only&apos; state. If enabled, only registered players can join server</source>
@@ -4116,7 +4986,7 @@
     </message>
     <message>
         <source>/force &lt;yes/no&gt;: Force vote result for active vote</source>
-        <translation>/force <投票>:投票結果を強制的に賛成「yes」か反対「no」かにする</translation>
+        <translation>/force&#x3000;<投票>:投票結果を強制的に賛成「yes」か反対「no」かにする</translation>
     </message>
     <message>
         <source>/fix: Force this room to stay open when it is empty</source>
@@ -4188,11 +5058,11 @@
     </message>
     <message>
         <source>/greeting [message]: Set or clear greeting message to be shown to players who join the room</source>
-        <translation>/greeting <メッセージ>:歓迎メッセージを指定する</translation>
+        <translation>/greeting&#x3000;<メッセージ>:歓迎メッセージを指定する</translation>
     </message>
     <message>
         <source>/save &lt;config ID&gt; &lt;config name&gt;: Add current room configuration as votable choice for /callvote map</source>
-        <translation>/save <コンフィグID> <コンフィグ名>:現在のルームコンフィグを「/callvote map」で投票できるようにします</translation>
+        <translation>/save <コンフィグID>&#x3000;<コンフィグ名>:現在のルームコンフィグを「/callvote map」で投票できるようにします</translation>
     </message>
     <message>
         <source>/delete &lt;config ID&gt;: Delete a votable room configuration</source>
@@ -4200,15 +5070,15 @@
     </message>
     <message>
         <source>/saveroom &lt;file name&gt;: Save all votable room configurations (and the greeting) of this room into a file</source>
-        <translation>/saveroom <ファイル名>:投票できるルームコンフィグを指定されたファイルに保存する</translation>
+        <translation>/saveroom&#x3000;<ファイル名>:投票できるルームコンフィグを指定されたファイルに保存する</translation>
     </message>
     <message>
         <source>/loadroom &lt;file name&gt;: Load votable room configurations (and greeting) from a file</source>
-        <translation>/loadroom <ファイル名>:投票できるルームコンフィグを指定されたファイルから読み込む</translation>
+        <translation>/loadroom&#x3000;<ファイル名>:投票できるルームコンフィグを指定されたファイルから読み込む</translation>
     </message>
     <message>
         <source>&apos;Registered only&apos; state toggled.</source>
-        <translation>登録専用状態が切り替えられました。</translation>
+        <translation type="vanished">登録専用状態が切り替えられました。</translation>
     </message>
     <message>
         <source>Super power activated.</source>
@@ -4274,5 +5144,25 @@
         <source>This command is only available in rooms.</source>
         <translation>このコマンドはルーム専用です</translation>
     </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 </TS>
--- a/share/hedgewars/Data/Locale/hedgewars_ko.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_ko.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -78,6 +78,49 @@
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>AbstractPage</name>
@@ -299,21 +342,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -516,10 +563,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Guest</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Room password</source>
         <translation type="unfinished"></translation>
     </message>
@@ -768,6 +811,18 @@
         <source>Click to edit</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
@@ -869,6 +924,20 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>HatButton</name>
     <message>
         <source>Change hat (%1)</source>
@@ -900,6 +969,10 @@
         <source>Category</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>LibavInteraction</name>
@@ -940,6 +1013,7 @@
     </message>
     <message>
         <source>Record: %1</source>
+        <extracomment>As in ‘recording’</extracomment>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -1299,6 +1373,26 @@
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+        </translation>
+    </message>
 </context>
 <context>
     <name>PageInGame</name>
@@ -1393,6 +1487,25 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <source>Edit game preferences</source>
@@ -1615,6 +1728,7 @@
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -1810,6 +1924,7 @@
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -1931,10 +2046,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Practice your skills in a range of training missions</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Watch recorded demos</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1942,6 +2053,10 @@
         <source>Load a previously saved game</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -1981,6 +2096,33 @@
         <source>Scenarios</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageVideos</name>
@@ -2568,6 +2710,7 @@
     </message>
     <message>
         <source>% Retreat Time</source>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2583,6 +2726,10 @@
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QLineEdit</name>
@@ -2826,6 +2973,15 @@
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Server redirection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
@@ -2861,10 +3017,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Specify</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Start</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2940,6 +3092,10 @@
         <source>Start private server</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
@@ -3253,10 +3409,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>capture</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>quit</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3269,10 +3421,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>reset zoom</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>long jump</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3325,6 +3473,62 @@
         <source>clan chat</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>binds (categories)</name>
@@ -3346,6 +3550,49 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -3479,74 +3726,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Numpad 0</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 4</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 5</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 6</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 7</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 8</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 9</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad .</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad /</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad *</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad -</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad +</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Enter</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Equals</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Up</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3575,58 +3754,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Page up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Page down</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Num lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Caps lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Scroll lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right shift</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left shift</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right ctrl</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left ctrl</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right alt</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left alt</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right meta</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left meta</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>A button</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3725,6 +3852,609 @@
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -3797,10 +4527,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>The game can&apos;t be started with less than two clans!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4093,10 +4819,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>&apos;Registered only&apos; state toggled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Super power activated.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4160,5 +4882,25 @@
         <source>This command is only available in rooms.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 </TS>
--- a/share/hedgewars/Data/Locale/hedgewars_lt.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_lt.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -4,95 +4,148 @@
 <context>
     <name>About</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="76"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="92"/>
+        <source>Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="171"/>
+        <source>Other people</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="181"/>
+        <source>%1 (alias %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="202"/>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="208"/>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="217"/>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="265"/>
         <source>Hedgewars %1</source>
         <extracomment>%1 contains Hedgewars&apos; version number</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="78"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="267"/>
         <source>Revision %1 (%2)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="80"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="269"/>
         <source>Visit our homepage: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="83"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="272"/>
         <source>This program is distributed under the %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="86"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="275"/>
         <source>GNU GPL v2</source>
         <extracomment>Short for “GNU General Public License version 2”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="101"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="304"/>
+        <source>Extended Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="305"/>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="314"/>
         <source>Dependency versions:</source>
         <extracomment>For the version numbers of Hedgewars&apos; software dependencies</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="104"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="317"/>
         <source>&lt;a href=&quot;https://gcc.gnu.org&quot;&gt;GCC&lt;/a&gt;: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="107"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="319"/>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="321"/>
+        <source>Unknown Compiler: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="323"/>
         <source>Unknown Compiler</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="114"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="331"/>
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="121"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="338"/>
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_mixer&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="135"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="352"/>
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_net&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="150"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="367"/>
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_image&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="165"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="382"/>
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_ttf&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="175"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="392"/>
         <source>&lt;a href=&quot;https://www.qt.io/developers/&quot;&gt;Qt&lt;/a&gt;: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="179"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="396"/>
         <source>&lt;a href=&quot;https://libav.org&quot;&gt;libavcodec&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="184"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="401"/>
         <source>&lt;a href=&quot;https://libav.org&quot;&gt;libavformat&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="189"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="406"/>
         <source>&lt;a href=&quot;https://libav.org&quot;&gt;libavutil&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="196"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="413"/>
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
@@ -176,7 +229,7 @@
 <context>
     <name>DataManager</name>
     <message>
-        <location filename="../../../../QTfrontend/util/DataManager.cpp" line="155"/>
+        <location filename="../../../../QTfrontend/util/DataManager.cpp" line="159"/>
         <source>Use Default</source>
         <translation type="unfinished"></translation>
     </message>
@@ -264,12 +317,12 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="171"/>
+        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="172"/>
         <source>Edit weapons</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="179"/>
+        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="181"/>
         <source>Game scheme will auto-select a weapon</source>
         <translation type="unfinished"></translation>
     </message>
@@ -277,22 +330,22 @@
 <context>
     <name>GameSchemeModel</name>
     <message>
-        <location filename="../../../../QTfrontend/model/gameSchemeModel.cpp" line="924"/>
+        <location filename="../../../../QTfrontend/model/gameSchemeModel.cpp" line="1025"/>
         <source>New</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/model/gameSchemeModel.cpp" line="929"/>
+        <location filename="../../../../QTfrontend/model/gameSchemeModel.cpp" line="1030"/>
         <source>New (%1)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/model/gameSchemeModel.cpp" line="938"/>
+        <location filename="../../../../QTfrontend/model/gameSchemeModel.cpp" line="1039"/>
         <source>Copy of %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/model/gameSchemeModel.cpp" line="943"/>
+        <location filename="../../../../QTfrontend/model/gameSchemeModel.cpp" line="1044"/>
         <source>Copy of %1 (%2)</source>
         <translation type="unfinished"></translation>
     </message>
@@ -300,7 +353,7 @@
 <context>
     <name>GameUIConfig</name>
     <message>
-        <location filename="../../../../QTfrontend/gameuiconfig.cpp" line="117"/>
+        <location filename="../../../../QTfrontend/gameuiconfig.cpp" line="536"/>
         <source>Guest</source>
         <translation type="unfinished"></translation>
     </message>
@@ -368,68 +421,72 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="153"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="172"/>
         <source>Usage</source>
         <comment>command-line</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="154"/>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/main.cpp" line="175"/>
         <source>OPTION</source>
         <comment>command-line</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="155"/>
-        <location filename="../../../../QTfrontend/main.cpp" line="160"/>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/main.cpp" line="178"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="185"/>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="156"/>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/main.cpp" line="181"/>
         <source>Options</source>
         <comment>command-line</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="157"/>
+        <extracomment>“Options” as in “command-line options”</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/main.cpp" line="182"/>
         <source>Display this help</source>
         <comment>command-line</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="158"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="183"/>
         <source>Custom path for configuration data and user data</source>
         <comment>command-line</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="159"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="184"/>
         <source>Custom path to the game data folder</source>
         <comment>command-line</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="160"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="185"/>
         <source>Hedgewars can use a %1 (e.g. &quot;%2&quot;) to connect on start.</source>
         <comment>command-line</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="205"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="430"/>
         <source>Malformed option argument: %1</source>
         <comment>command-line</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="245"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="439"/>
         <source>Unknown option argument: %1</source>
         <comment>command-line</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="337"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="370"/>
         <source>Failed to open data directory:
 %1
 
@@ -468,62 +525,62 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="545"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="553"/>
         <source>%1 has left</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="550"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="558"/>
         <source>%1 has left (%2)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="689"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="697"/>
         <source>%1 has been removed from your ignore list</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="699"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="707"/>
         <source>%1 has been added to your ignore list</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="729"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="737"/>
         <source>%1 has been removed from your friends list</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="738"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="746"/>
         <source>%1 has been added to your friends list</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="806"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="814"/>
         <source>Stylesheet imported from %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="807"/>
-        <source>Enter %1 if you want to use the current StyleSheet in future, enter %2 to reset!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="815"/>
-        <source>Couldn&apos;t read %1</source>
+        <source>Enter %1 if you want to use the current StyleSheet in future, enter %2 to reset!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="823"/>
+        <source>Couldn&apos;t read %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="831"/>
         <source>StyleSheet discarded</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="847"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="855"/>
         <source>StyleSheet saved to %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="850"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="858"/>
         <source>Failed to save StyleSheet to %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -531,64 +588,56 @@
 <context>
     <name>HWForm</name>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="738"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="767"/>
         <source>Game aborted</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1232"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1266"/>
         <source>Nickname</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1237"/>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1560"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1271"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1596"/>
         <source>No nickname supplied.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1232"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1266"/>
         <source>Someone already uses your nickname %1 on the server.
 Please pick another nickname:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="170"/>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="519"/>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1507"/>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1526"/>
-        <source>Guest</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="527"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="544"/>
         <source>Team 1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="532"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="549"/>
         <source>%1&apos;s Team</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="551"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="569"/>
         <source>Team %1</source>
         <extracomment>Default team name</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="562"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="581"/>
         <source>Computer %1</source>
         <extracomment>Default computer team name</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1186"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1220"/>
         <source>Hedgewars - Nick registered</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1187"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1221"/>
         <source>This nick is registered, and you haven&apos;t specified a password.
 
 If this nick isn&apos;t yours, please register your own nick at www.hedgewars.org
@@ -597,102 +646,102 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1215"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1249"/>
         <source>Your nickname is not registered.
 To prevent someone else from using it,
 please register it at www.hedgewars.org</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1220"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1254"/>
         <source>
 
 Your password wasn&apos;t saved either.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1237"/>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1560"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1271"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1596"/>
         <source>Hedgewars - Empty nickname</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1264"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1298"/>
         <source>Hedgewars - Wrong password</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1264"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1298"/>
         <source>You entered a wrong password.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1276"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1310"/>
         <source>Room password</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1276"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1310"/>
         <source>The room is protected with password.
 Please, enter the password:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1292"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1326"/>
         <source>Try Again</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1664"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1700"/>
         <source>Hedgewars - Connection error</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1664"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1700"/>
         <source>You reconnected too fast.
 Please wait a few seconds and try again.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1830"/>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2216"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1889"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2412"/>
         <source>Cannot save record to file %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2146"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2341"/>
         <source>Hedgewars Demo File</source>
         <comment>File Types</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2147"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2342"/>
         <source>Hedgewars Save File</source>
         <comment>File Types</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2208"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2404"/>
         <source>Demo name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2208"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2404"/>
         <source>Demo name:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2282"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2478"/>
         <source>Unknown network error (possibly missing SSL library).</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2286"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2482"/>
         <source>This feature requires an Internet connection, but you don&apos;t appear to be online (error code: %1).</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2291"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2487"/>
         <source>Internal error: Reply object is invalid.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -700,7 +749,7 @@
 <context>
     <name>HWGame</name>
     <message>
-        <location filename="../../../../QTfrontend/game.cpp" line="258"/>
+        <location filename="../../../../QTfrontend/game.cpp" line="433"/>
         <source>A fatal ERROR occured! The game engine had to stop.
 
 We are very sorry for the inconvenience. :-(
@@ -712,14 +761,14 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/game.cpp" line="404"/>
-        <location filename="../../../../QTfrontend/net/recorder.cpp" line="114"/>
+        <location filename="../../../../QTfrontend/game.cpp" line="587"/>
+        <location filename="../../../../QTfrontend/net/recorder.cpp" line="125"/>
         <source>en.txt</source>
         <extracomment>IMPORTANT: This text has a special meaning, do not translate it directly. This is the file name of translation files for the game engine, found in Data/Locale/. Usually, you replace “en” with the ISO-639-1 language code of your language.</extracomment>
         <translation>lt.txt</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/game.cpp" line="457"/>
+        <location filename="../../../../QTfrontend/game.cpp" line="646"/>
         <source>Cannot open demofile %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -790,168 +839,183 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="232"/>
-        <source>Load map drawing</source>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="236"/>
+        <source>Load</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="238"/>
-        <source>Edit map drawing</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="251"/>
-        <source>All</source>
+        <source>Load map drawing</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="252"/>
-        <source>Small</source>
+        <source>Edit</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="253"/>
+        <source>Edit map drawing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="271"/>
+        <source>All</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="272"/>
+        <source>Small</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="273"/>
         <source>Medium</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="254"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="274"/>
         <source>Large</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="255"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="275"/>
         <source>Cavern</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="256"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="276"/>
         <source>Wacky</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="266"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="286"/>
         <source>Large tunnels</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="267"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="287"/>
         <source>Small islands</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="268"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="288"/>
         <source>Medium islands</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="269"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="289"/>
         <source>Large islands</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="303"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="324"/>
         <source>Randomize the theme</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="313"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="334"/>
         <source>Choose a theme</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="917"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="938"/>
         <source>Randomize the map, theme and seed</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="918"/>
-        <source>Randomize the theme and seed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="919"/>
-        <source>Randomize the seed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="920"/>
-        <source>Click to randomize the map, theme and seed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="921"/>
-        <source>Click to randomize the theme and seed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="922"/>
-        <source>Adjust the complexity of the generated map</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="923"/>
-        <source>Adjust the distance between forts</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="939"/>
+        <source>Randomize the theme and seed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="940"/>
+        <source>Randomize the seed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="941"/>
+        <source>Click to randomize the map, theme and seed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="942"/>
+        <source>Click to randomize the theme and seed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="943"/>
+        <source>Adjust the complexity of the generated map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="944"/>
+        <source>Adjust the distance between forts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="945"/>
+        <source>Scale size of the drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="961"/>
         <source>Click to edit</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="971"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="994"/>
         <source>Map size:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="978"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1001"/>
         <source>Maze style:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="985"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1008"/>
         <source>Style:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1000"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1023"/>
         <source>Mission:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1020"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1043"/>
         <source>Map:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1121"/>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1313"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1140"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1342"/>
         <source>Theme: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1214"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1242"/>
         <source>Load drawn map</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1214"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1242"/>
         <source>Drawn Maps</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1214"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1242"/>
         <source>All files</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="264"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="284"/>
         <source>Small tunnels</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="265"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="285"/>
         <source>Medium tunnels</source>
         <translation type="unfinished"></translation>
     </message>
@@ -985,42 +1049,42 @@
 <context>
     <name>HWNewNet</name>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="234"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="246"/>
         <source>Remote host has closed connection</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="237"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="249"/>
         <source>The host was not found. Please check the host name and port settings.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="307"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="351"/>
         <source>The server is too old. Disconnecting now.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="579"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="632"/>
         <source>Server authentication error</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="801"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="868"/>
         <source>Room destroyed</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="558"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="611"/>
         <source>You got kicked</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="242"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="254"/>
         <source>The connection was refused by the official server or timed out. Something seems to be wrong with the official server at the moment. This might be a temporary problem. Please try again later.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="245"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="257"/>
         <source>The connection was refused by the host or timed out. This might have one of the following reasons:
 - The Hedgewars Server program does currently not run on the host
 - The specified port number is incorrect
@@ -1030,23 +1094,23 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="744"/>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="876"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="797"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="951"/>
         <source>%1 *** %2 has joined the room</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="891"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="966"/>
         <source>%1 *** %2 has left</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="895"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="970"/>
         <source>%1 *** %2 has left (%3)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1685"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1721"/>
         <source>Reason:</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1083,6 +1147,21 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <location filename="../../../../QTfrontend/net/recorder.cpp" line="83"/>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>HatButton</name>
     <message>
         <location filename="../../../../QTfrontend/ui/widget/hatbutton.cpp" line="44"/>
@@ -1116,7 +1195,12 @@
 <context>
     <name>KeyBinder</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/keybinder.cpp" line="101"/>
+        <location filename="../../../../QTfrontend/ui/widget/keybinder.cpp" line="95"/>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/keybinder.cpp" line="108"/>
         <source>Category</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1124,50 +1208,51 @@
 <context>
     <name>LibavInteraction</name>
     <message>
-        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="295"/>
+        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="293"/>
         <source>Duration: %1min %2s</source>
         <extracomment>Duration in minutes and seconds (SI units)</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="314"/>
+        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="312"/>
         <source>Video: %1x%2, %3 FPS, %4</source>
         <extracomment>Video metadata. %1 = video width, %2 = video height, %3 = frames per second = %4 = decoder name</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="319"/>
+        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="317"/>
         <source>Video: %1x%2, %3</source>
         <extracomment>Video metadata. %1 = video width, %2 = video height, %3 = decoder name</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="352"/>
+        <source>Player: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
         <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="354"/>
-        <source>Player: %1</source>
+        <source>Theme: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="356"/>
-        <source>Theme: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="358"/>
         <source>Map: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="361"/>
+        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="359"/>
         <source>Record: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="324"/>
+        <extracomment>As in ‘recording’</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="322"/>
         <source>Audio: </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="307"/>
+        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="305"/>
         <source>unknown</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1419,103 +1504,103 @@
 <context>
     <name>PageEditTeam</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="46"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="49"/>
         <source>Select an action to choose a custom key bind for this team</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="46"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="49"/>
         <source>Use my default</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="46"/>
-        <source>Reset all binds</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="48"/>
-        <source>General</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="49"/>
+        <source>Reset all binds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="51"/>
+        <source>General</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="52"/>
         <source>Custom Controls</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="67"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="70"/>
         <source>Hat</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="68"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="71"/>
         <source>Name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="79"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="82"/>
         <source>This hedgehog&apos;s name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="85"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="88"/>
         <source>Randomize this hedgehog&apos;s name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="89"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="92"/>
         <source>Random Hats</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="95"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="98"/>
         <source>Random Names</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="103"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="106"/>
         <source>Random Team</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="196"/>
-        <source>Randomize the team name</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="199"/>
-        <source>Randomize the grave</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="202"/>
+        <source>Randomize the team name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="205"/>
+        <source>Randomize the grave</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="208"/>
         <source>Randomize the flag</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="211"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="217"/>
         <source>Play a random example of this voice</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="214"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="220"/>
         <source>Randomize the voice</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="227"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="233"/>
         <source>Randomize the fort</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="432"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="438"/>
         <source>CPU %1</source>
         <extracomment>Name of a flag for computer-controlled enemies. %1 is replaced with the computer level</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="650"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="664"/>
         <source>%1 (%2)</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1523,33 +1608,33 @@
 <context>
     <name>PageGameStats</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="61"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="59"/>
         <source>Details</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="76"/>
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="167"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="74"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="177"/>
         <source>Health graph</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="94"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="93"/>
         <source>Ranking</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="120"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="119"/>
         <source>Play again</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="125"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="124"/>
         <source>Save</source>
         <translation type="unfinished"></translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="267"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="309"/>
         <source>The best shot award was won by &lt;b&gt;%1&lt;/b&gt; with &lt;b&gt;%2&lt;/b&gt; pts.</source>
         <translation type="unfinished">
             <numerusform></numerusform>
@@ -1558,7 +1643,7 @@
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="275"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="317"/>
         <source>The best killer is &lt;b&gt;%1&lt;/b&gt; with &lt;b&gt;%2&lt;/b&gt; kills in a turn.</source>
         <translation type="unfinished">
             <numerusform></numerusform>
@@ -1567,7 +1652,7 @@
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="282"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="324"/>
         <source>A total of &lt;b&gt;%1&lt;/b&gt; hedgehog(s) were killed during this round.</source>
         <translation type="unfinished">
             <numerusform></numerusform>
@@ -1576,7 +1661,7 @@
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="356"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="399"/>
         <source>(%1 kill)</source>
         <extracomment>Number of kills in stats screen, written after the team name</extracomment>
         <translation type="unfinished">
@@ -1586,7 +1671,37 @@
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="359"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="402"/>
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="405"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="409"/>
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="413"/>
+        <source>(%1 crate(s))</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="418"/>
         <source>(%1 %2)</source>
         <extracomment>For custom number of points in the stats screen, written after the team name. %1 is the number, %2 is the word. Example: “4 points”</extracomment>
         <translation type="unfinished">
@@ -1596,7 +1711,7 @@
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="373"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="433"/>
         <source>&lt;b&gt;%1&lt;/b&gt; thought it&apos;s good to shoot their own hedgehogs for &lt;b&gt;%2&lt;/b&gt; pts.</source>
         <translation type="unfinished">
             <numerusform></numerusform>
@@ -1605,7 +1720,7 @@
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="381"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="441"/>
         <source>&lt;b&gt;%1&lt;/b&gt; killed &lt;b&gt;%2&lt;/b&gt; of their own hedgehogs.</source>
         <translation type="unfinished">
             <numerusform></numerusform>
@@ -1614,7 +1729,7 @@
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="389"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="449"/>
         <source>&lt;b&gt;%1&lt;/b&gt; was scared and skipped turn &lt;b&gt;%2&lt;/b&gt; times.</source>
         <translation type="unfinished">
             <numerusform></numerusform>
@@ -1623,7 +1738,7 @@
         </translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="406"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="466"/>
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1678,46 +1793,47 @@
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="79"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="83"/>
         <source>Read about who is behind the Hedgewars Project</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="82"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="86"/>
         <source>Feedback</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="84"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="88"/>
         <source>Leave a feedback here reporting issues, suggesting features or just saying how you like Hedgewars</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="87"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="91"/>
         <source>Downloadable Content</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="89"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="93"/>
         <source>Access the user created content downloadable from our website</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="109"/>
-        <source>Exit game</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="113"/>
-        <source>Manage videos recorded from game</source>
+        <source>Exit game</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="117"/>
+        <source>Manage videos recorded from game</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="121"/>
         <source>Open the Hedgewars online game manual in your web browser</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="120"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="124"/>
         <source>Edit game preferences</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1741,6 +1857,29 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="50"/>
+        <source>Connect to the selected server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="65"/>
+        <source>Update the list of servers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="71"/>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="82"/>
+        <source>Start private server</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagenetgame.cpp" line="52"/>
@@ -1815,7 +1954,7 @@
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="97"/>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="246"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="255"/>
         <source>Game</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1860,179 +1999,180 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="149"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="150"/>
         <source>Edit team</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="157"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="159"/>
         <source>Delete team</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="165"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="168"/>
         <source>You can&apos;t edit teams from team selection. Go back to main menu to add, edit or delete teams.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="172"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="175"/>
         <source>Schemes</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="183"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="186"/>
         <source>New scheme</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="190"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="194"/>
         <source>Edit scheme</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="197"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="202"/>
         <source>Delete scheme</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="205"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="211"/>
         <source>Weapons</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="216"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="222"/>
         <source>New weapon set</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="223"/>
-        <source>Edit weapon set</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="230"/>
+        <source>Edit weapon set</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="238"/>
         <source>Delete weapon set</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="283"/>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="806"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="292"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="829"/>
         <source>x</source>
         <extracomment>Multiplication sign, to be used between two numbers. Note the “x” is only a dummy character, we recommend to use “×” if your language permits it</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="415"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="437"/>
         <source>Frontend</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="433"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="455"/>
         <source>Custom colors</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="463"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="485"/>
         <source>Reset to default colors</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="476"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="498"/>
         <source>Game audio</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="522"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="544"/>
         <source>Frontend audio</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="545"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="567"/>
         <source>Account</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="571"/>
-        <source>Proxy settings</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="577"/>
-        <source>Proxy host</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="578"/>
-        <source>Proxy port</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="579"/>
-        <source>Proxy login</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="580"/>
-        <source>Proxy password</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="593"/>
+        <source>Proxy settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="599"/>
+        <source>Proxy host</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="600"/>
+        <source>Proxy port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="601"/>
+        <source>Proxy login</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="602"/>
+        <source>Proxy password</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="615"/>
         <source>No proxy</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="594"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="616"/>
         <source>System proxy settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="595"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="617"/>
         <source>Socks5 proxy</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="596"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="618"/>
         <source>HTTP proxy</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="631"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="653"/>
         <source>Miscellaneous</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="667"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="690"/>
         <source>MISSING LANGUAGE NAME [%1]</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="699"/>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="722"/>
         <source>Updates</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="712"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="735"/>
         <source>Check for updates</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="713"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="736"/>
         <source>Check now</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="726"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="749"/>
         <source>Video recording options</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="995"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="1018"/>
         <source>Can&apos;t delete last team</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="995"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="1018"/>
         <source>You can&apos;t delete the last team!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2055,12 +2195,12 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="151"/>
+        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="152"/>
         <source>Rename dialog</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="151"/>
+        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="152"/>
         <source>Enter new file name:</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2098,7 +2238,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="544"/>
+        <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="546"/>
         <source>%1 players online</source>
         <translation type="unfinished">
             <numerusform></numerusform>
@@ -2110,262 +2250,263 @@
 <context>
     <name>PageScheme</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="81"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="84"/>
         <source>Add an indestructible border around the terrain</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="97"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="100"/>
         <source>Lower gravity</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="149"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="152"/>
         <source>Assisted aiming with laser sight</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="129"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="132"/>
         <source>All hogs have a personal forcefield</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="121"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="124"/>
         <source>All (living) hedgehogs are fully restored at the end of turn</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="113"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="116"/>
         <source>Gain 80% of the damage you do back in health</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="117"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="120"/>
         <source>Share your opponents pain, share their damage</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="109"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="112"/>
         <source>Your hogs are unable to move, put your artillery skills to the test</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="153"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="156"/>
         <source>Order of play is random instead of in room order.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="169"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="172"/>
         <source>Play with a King. If he dies, your side dies.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="157"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="160"/>
         <source>Take turns placing your hedgehogs before the start of play.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="137"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="140"/>
         <source>Ammo is shared between all teams that share a colour.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="73"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="76"/>
         <source>Disable girders when generating random maps.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="77"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="80"/>
         <source>Disable land objects when generating random maps.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="125"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="128"/>
         <source>AI respawns on death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="145"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="148"/>
         <source>Attacking does not end your turn.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="141"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="144"/>
         <source>Weapons are reset to starting values each turn.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="133"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="136"/>
         <source>Each hedgehog has its own ammo. It does not share with the team.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="101"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="104"/>
         <source>You will not have to worry about wind anymore.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="105"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="108"/>
         <source>Wind will affect almost everything.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="165"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="168"/>
         <source>Teams in each clan take successive turns sharing their turn time.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="85"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="88"/>
         <source>Add an indestructible border along the bottom</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="89"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="92"/>
         <source>Select a hedgehog at the beginning of a turn</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="93"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="96"/>
         <source>Land can not be destroyed by most weapons.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="161"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="164"/>
         <source>Each clan starts in its own part of the terrain.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="175"/>
-        <source>Overall damage and knockback in percent</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="176"/>
-        <source>Turn time in seconds</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="177"/>
-        <source>Initial health of hedgehogs</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="178"/>
-        <source>How many rounds have to be played before Sudden Death begins</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="179"/>
-        <source>How much the water rises per turn while in Sudden Death. Set to 0 along with Sudden Death Health Decrease to disable Sudden Death.</source>
+        <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="180"/>
-        <source>How much health hedgehogs lose per turn while in Sudden Death, down to 1 health. Set to 0 along with Sudden Death Water Rise to disable Sudden Death.</source>
+        <source>Turn time in seconds</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="181"/>
-        <source>Maximum rope length in percent</source>
+        <source>Initial health of hedgehogs</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="182"/>
-        <source>Likelihood of a dropped crate being a health crate. All other crates will be weapon or utility crates.</source>
+        <source>How many rounds have to be played before Sudden Death begins</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="183"/>
-        <source>Likelihood of a crate dropping before a turn</source>
+        <source>How much the water rises per turn while in Sudden Death. Set to 0 along with Sudden Death Health Decrease to disable Sudden Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="184"/>
-        <source>Health bonus for collecting a health crate</source>
+        <source>How much health hedgehogs lose per turn while in Sudden Death, down to 1 health. Set to 0 along with Sudden Death Water Rise to disable Sudden Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="185"/>
-        <source>Detonation timer of mines. The random timer lies between 0 and 5 seconds. The timer of air mines will be a quarter of the mines timer.</source>
+        <source>Maximum rope length in percent</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="186"/>
-        <source>Average number of mines to be placed a medium-sized island map. This number will be scaled for other maps.</source>
+        <source>Likelihood of a dropped crate being a health crate. All other crates will be weapon or utility crates.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="187"/>
-        <source>Likelihood of a mine being a dud. Does not affect mines placed by hedgehogs.</source>
+        <source>Likelihood of a crate dropping before a turn</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="188"/>
-        <source>Average number of barrels to be placed a medium-sized island map. This number will be scaled for other maps.</source>
+        <source>Health bonus for collecting a health crate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="189"/>
-        <source>Average number of air mines to be placed a medium-sized island map. This number will be scaled for other maps.</source>
+        <source>Detonation timer of mines. The random timer lies between 0 and 5 seconds. The timer of air mines will be a quarter of the mines timer.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="190"/>
-        <source>Affects the left and right boundaries of the map</source>
+        <source>Average number of mines to be placed a medium-sized island map. This number will be scaled for other maps.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="191"/>
-        <source>Time you get after an attack</source>
+        <source>Likelihood of a mine being a dud. Does not affect mines placed by hedgehogs.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="192"/>
+        <source>Average number of barrels to be placed a medium-sized island map. This number will be scaled for other maps.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="193"/>
+        <source>Average number of air mines to be placed a medium-sized island map. This number will be scaled for other maps.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="194"/>
+        <source>Affects the left and right boundaries of the map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="195"/>
+        <source>Time you get after an attack</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="196"/>
         <source>Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="490"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="495"/>
         <source>None (Default)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="491"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="496"/>
         <source>Wrap (World wraps)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="492"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="497"/>
         <source>Bounce (Edges reflect)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="493"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="498"/>
         <source>Sea (Edges connect to sea)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="518"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="526"/>
         <source>Name of this scheme</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="533"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="541"/>
         <source>Copy</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="534"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="543"/>
         <source>New</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="535"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="545"/>
         <source>Delete</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="699"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="713"/>
         <source>%1 (%2)</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2373,7 +2514,7 @@
 <context>
     <name>PageSelectWeapon</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageselectweapon.cpp" line="49"/>
+        <location filename="../../../../QTfrontend/ui/page/pageselectweapon.cpp" line="50"/>
         <source>Default</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2383,12 +2524,12 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageselectweapon.cpp" line="52"/>
+        <location filename="../../../../QTfrontend/ui/page/pageselectweapon.cpp" line="54"/>
         <source>Copy</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageselectweapon.cpp" line="53"/>
+        <location filename="../../../../QTfrontend/ui/page/pageselectweapon.cpp" line="56"/>
         <source>Delete</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2412,7 +2553,7 @@
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagesingleplayer.cpp" line="51"/>
-        <source>Practice your skills in a range of training missions</source>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2429,48 +2570,81 @@
 <context>
     <name>PageTraining</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="91"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="101"/>
         <source>Pick the training to play</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="94"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="104"/>
         <source>Pick the challenge to play</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="97"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="107"/>
         <source>Pick the scenario to play</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="99"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="109"/>
         <source>Trainings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="100"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="110"/>
         <source>Challenges</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="101"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="111"/>
         <source>Scenarios</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="116"/>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="315"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="114"/>
+        <source>Team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="132"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="338"/>
         <source>Start fighting</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="324"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="344"/>
         <source>No description available</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="332"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="355"/>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="360"/>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="365"/>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="370"/>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="375"/>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="383"/>
         <source>Select a mission!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2478,17 +2652,17 @@
 <context>
     <name>PageVideos</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="115"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="116"/>
         <source>Name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="116"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="117"/>
         <source>Size</source>
         <translation type="unfinished"></translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="253"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="259"/>
         <source>%1 bytes</source>
         <translation type="unfinished">
             <numerusform></numerusform>
@@ -2497,34 +2671,34 @@
         </translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="328"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="336"/>
         <source>%1%</source>
         <extracomment>Video encoding progress. %1 = number</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="496"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="544"/>
         <source>(in progress...)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="500"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="548"/>
         <source>Date: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="501"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="549"/>
         <source>Size: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="707"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="763"/>
         <source>%1 (%2%) - %3</source>
         <extracomment>Video encoding list entry. %1 = file name, %2 = percent complete, %3 = video operation type (e.g. “encoding”)</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="710"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="766"/>
         <source>encoding</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2558,23 +2732,23 @@
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="282"/>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="946"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="954"/>
         <source>Ignore</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="286"/>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="958"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="966"/>
         <source>Add friend</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="941"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="949"/>
         <source>Unignore</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="953"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="961"/>
         <source>Remove friend</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2617,146 +2791,146 @@
 <context>
     <name>QCheckBox</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="377"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="399"/>
         <source>Show ammo menu tooltips</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="371"/>
-        <source>Alternative damage show</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="392"/>
-        <source>Team</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="393"/>
+        <source>Alternative damage show</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="414"/>
+        <source>Team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="415"/>
         <source>Enable team tags by default</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="396"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="418"/>
         <source>Hog</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="397"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="419"/>
         <source>Enable hedgehog tags by default</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="400"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="422"/>
         <source>Health</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="401"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="423"/>
         <source>Enable health tags by default</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="404"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="426"/>
         <source>Translucent</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="405"/>
-        <source>Enable translucent tags by default</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="427"/>
+        <source>Enable translucent tags by default</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="449"/>
         <source>Visual effects</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="428"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="450"/>
         <source>Enable visual effects such as animated menu transitions and falling stars</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="501"/>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="526"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="523"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="548"/>
         <source>Sound</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="502"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="524"/>
         <source>In-game sound effects</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="508"/>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="531"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="530"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="553"/>
         <source>Music</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="509"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="531"/>
         <source>In-game music</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="516"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="538"/>
         <source>Dampen when losing focus</source>
         <extracomment>Checkbox text. If checked, the in-game audio volume is reduced (=dampened) when the game window loses its focus</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="517"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="539"/>
         <source>Reduce the game audio volume if the game window has lost its focus</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="527"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="549"/>
         <source>Frontend sound effects</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="532"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="554"/>
         <source>Frontend music</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="684"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="707"/>
         <source>Append date and time to record file name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="685"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="708"/>
         <source>If enabled, Hedgewars adds the date and time in the form &quot;YYYY-MM-DD_hh-mm&quot; for automatically created demos.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="705"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="728"/>
         <source>Check for updates at startup</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="421"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="443"/>
         <source>Fullscreen</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="360"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="382"/>
         <source>Show FPS</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/dialog/input_password.cpp" line="55"/>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="562"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="584"/>
         <source>Save password</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="768"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="791"/>
         <source>Record audio</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="818"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="841"/>
         <source>Use game resolution</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2764,127 +2938,127 @@
 <context>
     <name>QComboBox</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="138"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="144"/>
         <source>Human</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="142"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="148"/>
         <source>Computer (Level %1)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="400"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="406"/>
         <source>Community</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="645"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="667"/>
         <source>(System default)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="324"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="346"/>
         <source>Disabled</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="322"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="344"/>
         <source>Stereoscopy creates an illusion of depth when you wear 3D glasses.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="325"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="347"/>
         <source>Red/Cyan</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="326"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="348"/>
         <source>Cyan/Red</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="327"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="349"/>
         <source>Red/Blue</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="328"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="350"/>
         <source>Blue/Red</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="329"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="351"/>
         <source>Red/Green</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="330"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="352"/>
         <source>Green/Red</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="337"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="359"/>
         <source>Side-by-side</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="338"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="360"/>
         <source>Top-Bottom</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="828"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="851"/>
         <source>24 FPS</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="829"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="852"/>
         <source>25 FPS</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="830"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="853"/>
         <source>30 FPS</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="831"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="854"/>
         <source>50 FPS</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="832"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="855"/>
         <source>60 FPS</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="331"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="353"/>
         <source>Red/Cyan grayscale</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="332"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="354"/>
         <source>Cyan/Red grayscale</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="333"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="355"/>
         <source>Red/Blue grayscale</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="334"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="356"/>
         <source>Blue/Red grayscale</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="335"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="357"/>
         <source>Red/Green grayscale</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="336"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="358"/>
         <source>Green/Red grayscale</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2892,17 +3066,17 @@
 <context>
     <name>QGroupBox</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="62"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="65"/>
         <source>Team Members</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="109"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="112"/>
         <source>Team Settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="217"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="223"/>
         <source>Fort</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2912,27 +3086,27 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="50"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="53"/>
         <source>Game Modifiers</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="51"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="54"/>
         <source>Basic Settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/teamselect.cpp" line="295"/>
+        <location filename="../../../../QTfrontend/ui/widget/teamselect.cpp" line="296"/>
         <source>Playing teams</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="112"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="113"/>
         <source>Videos</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="148"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="152"/>
         <source>Description</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2950,7 +3124,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="156"/>
+        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="157"/>
         <source>Weapons</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2965,38 +3139,38 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="113"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="116"/>
         <source>Name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="116"/>
-        <source>Player</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="119"/>
-        <source>Grave</source>
+        <source>Player</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="122"/>
-        <source>Flag</source>
+        <source>Grave</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="125"/>
+        <source>Flag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="128"/>
         <source>Voice</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="144"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="148"/>
         <source>This development build is &apos;work in progress&apos; and may not be compatible with other versions of the game, while some features might be broken or incomplete!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="146"/>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="152"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="150"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="156"/>
         <source>Tip: %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3011,163 +3185,169 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="637"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="659"/>
         <source>Locale</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="551"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="573"/>
         <source>Nickname</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="318"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="340"/>
         <source>Stereoscopy</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="673"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="696"/>
         <source>This setting will be effective at next restart.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="794"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="817"/>
         <source>Resolution</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="839"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="862"/>
         <source>Bitrate (Kibit/s)</source>
         <extracomment>“Kibit/s” is the symbol for 1024 bits per second</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="304"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="313"/>
         <source>Quality</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="257"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="266"/>
         <source>Fullscreen</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="262"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="271"/>
         <source>Fullscreen Resolution</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="273"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="282"/>
         <source>Windowed Resolution</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="383"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="327"/>
+        <source>Zoom (%)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="405"/>
         <source>Displayed tags above hogs and translucent tags</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="484"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="506"/>
         <source>Initial sound volume</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="351"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="373"/>
         <source>FPS limit</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="195"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="199"/>
         <source>Damage Modifier</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="212"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="216"/>
         <source>Turn Time</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="229"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="233"/>
         <source>Initial Health</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="246"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="250"/>
         <source>Sudden Death Timeout</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="275"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="279"/>
         <source>Sudden Death Water Rise</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="292"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="296"/>
         <source>Sudden Death Health Decrease</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="309"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="313"/>
         <source>% Rope Length</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="326"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="330"/>
         <source>Crate Drops</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="342"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="346"/>
         <source>% Health Crates</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="359"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="363"/>
         <source>Health in Crates</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="376"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="380"/>
         <source>Mines Time</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="393"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="397"/>
         <source>Mines</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="410"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="414"/>
         <source>% Dud Mines</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="427"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="431"/>
         <source>Barrels</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="461"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="466"/>
         <source>% Retreat Time</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="444"/>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="448"/>
         <source>Air Mines</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="478"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="483"/>
         <source>World Edge</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="499"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="504"/>
         <source>Script parameter</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="515"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="520"/>
         <source>Scheme Name:</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3209,22 +3389,22 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="735"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="758"/>
         <source>Format</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="756"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="779"/>
         <source>Audio codec</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="782"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="805"/>
         <source>Video codec</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="824"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="847"/>
         <source>Framerate</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3232,27 +3412,27 @@
 <context>
     <name>QLineEdit</name>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1054"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1088"/>
         <source>unnamed</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1060"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1094"/>
         <source>unnamed (%1)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="412"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="418"/>
         <source>hedgehog %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="556"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="578"/>
         <source>anonymous</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/team.cpp" line="44"/>
+        <location filename="../../../../QTfrontend/team.cpp" line="45"/>
         <source>Hedgehog %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3268,58 +3448,69 @@
 <context>
     <name>QMessageBox</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="491"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="503"/>
         <source>Teams - Are you sure?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="492"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="504"/>
         <source>Do you really want to delete the team &apos;%1&apos;?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="658"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="672"/>
         <source>Teams - Name already taken</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="659"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="673"/>
         <source>The team name &apos;%1&apos; is already taken, so your team has been renamed to &apos;%2&apos;.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1092"/>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="643"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1126"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="655"/>
         <source>Cannot delete default scheme &apos;%1&apos;!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1118"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1152"/>
         <source>Please select a record from the list</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1213"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1247"/>
         <source>Hedgewars - Nick not registered</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1623"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1659"/>
         <source>Unable to start server</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1685"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1721"/>
         <source>The connection to the server is lost.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2299"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1736"/>
+        <source>Server redirection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1737"/>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2495"/>
         <source>Not all players are ready</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2300"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2496"/>
         <source>Are you sure you want to start this game?
 Not all players are ready.</source>
         <translation type="unfinished"></translation>
@@ -3331,75 +3522,75 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="341"/>
+        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="342"/>
         <source>System Information Preview</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="356"/>
-        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="367"/>
+        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="357"/>
+        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="368"/>
         <source>Failed to generate captcha</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="384"/>
+        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="385"/>
         <source>Failed to download captcha</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="448"/>
+        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="450"/>
         <source>Please fill out all fields. Email is optional.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2186"/>
-        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="418"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2381"/>
+        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="419"/>
         <source>Hedgewars - Success</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2187"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2382"/>
         <source>All file associations have been set</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2192"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2388"/>
         <source>File association failed.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="139"/>
-        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="166"/>
-        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="183"/>
-        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="198"/>
-        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="401"/>
+        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="167"/>
+        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="185"/>
+        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="201"/>
+        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="404"/>
         <source>Error</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="140"/>
-        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="184"/>
+        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="186"/>
         <source>Please select a file from the list.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="167"/>
+        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="168"/>
         <source>Cannot rename file to %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="199"/>
+        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="202"/>
         <source>Cannot delete file %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="118"/>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="128"/>
         <location filename="../../../../QTfrontend/ui/page/pagenetgame.cpp" line="257"/>
         <source>Netgame - Error</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="119"/>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="129"/>
         <source>Please select a server from the list</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3419,54 +3610,54 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="531"/>
+        <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="532"/>
         <source>Room Name - Are you sure?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="532"/>
+        <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="533"/>
         <source>The game you are trying to join has started.
 Do you still want to join the room?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="642"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="654"/>
         <source>Schemes - Warning</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="651"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="664"/>
         <source>Schemes - Are you sure?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="652"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="665"/>
         <source>Do you really want to delete the game scheme &apos;%1&apos;?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="712"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="726"/>
         <source>Schemes - Name already taken</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="713"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="728"/>
         <source>A scheme with the name &apos;%1&apos; already exists. Your scheme has been renamed to &apos;%2&apos;.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="587"/>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="616"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="635"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="665"/>
         <source>Videos - Are you sure?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="588"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="636"/>
         <source>Do you really want to delete the video &apos;%1&apos;?</source>
         <translation type="unfinished"></translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="617"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="666"/>
         <source>Do you really want to remove %1 file(s)?</source>
         <translation type="unfinished">
             <numerusform></numerusform>
@@ -3476,8 +3667,8 @@
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/widget/drawmapwidget.cpp" line="155"/>
-        <location filename="../../../../QTfrontend/ui/widget/drawmapwidget.cpp" line="175"/>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1224"/>
+        <location filename="../../../../QTfrontend/ui/widget/drawmapwidget.cpp" line="176"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1252"/>
         <source>File error</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3487,34 +3678,34 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/drawmapwidget.cpp" line="176"/>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1225"/>
+        <location filename="../../../../QTfrontend/ui/widget/drawmapwidget.cpp" line="177"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1253"/>
         <source>Cannot open &apos;%1&apos; for reading</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="306"/>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="351"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="312"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="358"/>
         <source>Weapons - Warning</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="307"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="313"/>
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="352"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="359"/>
         <source>Cannot delete default weapon set &apos;%1&apos;!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="361"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="369"/>
         <source>Weapons - Are you sure?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="362"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="370"/>
         <source>Do you really want to delete the weapon set &apos;%1&apos;?</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3529,19 +3720,19 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="468"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="537"/>
         <source>Welcome to Hedgewars</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="469"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="538"/>
         <source>Welcome to Hedgewars!
 
 You seem to be new around here. Would you like to play some training missions first to learn the basics of Hedgewars?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="402"/>
+        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="405"/>
         <source>Cannot use the weapon scheme &apos;%1&apos;!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3549,8 +3740,8 @@
 <context>
     <name>QObject</name>
     <message>
-        <location filename="../../../../QTfrontend/campaign.cpp" line="139"/>
-        <location filename="../../../../QTfrontend/campaign.cpp" line="161"/>
+        <location filename="../../../../QTfrontend/campaign.cpp" line="153"/>
+        <location filename="../../../../QTfrontend/campaign.cpp" line="175"/>
         <source>No description available</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3569,12 +3760,12 @@
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/dialog/input_ip.cpp" line="58"/>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="490"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="538"/>
         <source>Cancel</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="73"/>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="81"/>
         <source>Start server</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3584,13 +3775,13 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="58"/>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="64"/>
         <source>Update</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="63"/>
-        <source>Specify</source>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="70"/>
+        <source>Specify address</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -3616,7 +3807,7 @@
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagecampaign.cpp" line="96"/>
         <location filename="../../../../QTfrontend/ui/page/pagenetserver.cpp" line="99"/>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="115"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="131"/>
         <source>Start</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3626,7 +3817,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="691"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="714"/>
         <source>Associate file extensions</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3642,8 +3833,8 @@
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="48"/>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="182"/>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="490"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="186"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="538"/>
         <source>Delete</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3658,37 +3849,37 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="853"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="876"/>
         <source>Set default options</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="854"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="877"/>
         <source>Restore default coding parameters</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="134"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="138"/>
         <source>Open videos directory</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="135"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="139"/>
         <source>Open the video directory in your system</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="178"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="182"/>
         <source>Play</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="180"/>
-        <source>Play this video</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="184"/>
+        <source>Play this video</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="188"/>
         <source>Delete this video</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3696,7 +3887,7 @@
 <context>
     <name>QSpinBox</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="847"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="870"/>
         <source>Specify the bitrate of recorded videos as a multiple of 1024 bits per second</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3832,42 +4023,42 @@
 <context>
     <name>SelWeaponWidget</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="170"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="173"/>
         <source>Weapon set</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="171"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="174"/>
         <source>Probabilities</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="172"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="175"/>
         <source>Ammo in boxes</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="173"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="176"/>
         <source>Delays</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="378"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="387"/>
         <source>New</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="383"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="392"/>
         <source>New (%1)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="424"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="433"/>
         <source>Copy of %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="429"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="438"/>
         <source>Copy of %1 (%2)</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3875,18 +4066,18 @@
 <context>
     <name>TCPBase</name>
     <message>
-        <location filename="../../../../QTfrontend/net/tcpBase.cpp" line="122"/>
+        <location filename="../../../../QTfrontend/net/tcpBase.cpp" line="125"/>
         <source>Unable to start server at %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/tcpBase.cpp" line="223"/>
+        <location filename="../../../../QTfrontend/net/tcpBase.cpp" line="238"/>
         <source>Unable to run engine at %1
 Error code: %2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/tcpBase.cpp" line="242"/>
+        <location filename="../../../../QTfrontend/net/tcpBase.cpp" line="257"/>
         <source>The game engine died unexpectedly!
 (exit code %1)
 
@@ -3899,7 +4090,7 @@
 <context>
     <name>TeamSelWidget</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/teamselect.cpp" line="300"/>
+        <location filename="../../../../QTfrontend/ui/widget/teamselect.cpp" line="301"/>
         <source>At least two teams are required to play!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3931,25 +4122,25 @@
     <name>binds</name>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="23"/>
-        <location filename="../../../../QTfrontend/binds.cpp" line="51"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="57"/>
         <source>up</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="24"/>
-        <location filename="../../../../QTfrontend/binds.cpp" line="52"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="58"/>
         <source>left</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="25"/>
-        <location filename="../../../../QTfrontend/binds.cpp" line="53"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="59"/>
         <source>right</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="26"/>
-        <location filename="../../../../QTfrontend/binds.cpp" line="54"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="60"/>
         <source>down</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3959,213 +4150,273 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="30"/>
+        <source>long jump</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="31"/>
+        <source>high jump</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="54"/>
+        <source>attack</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="55"/>
+        <source>put</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="33"/>
+        <source>switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="28"/>
-        <source>long jump</source>
+        <source>stand still on slippery land</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="29"/>
-        <source>high jump</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="48"/>
-        <source>attack</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="49"/>
-        <source>put</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="30"/>
-        <source>switch</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="31"/>
-        <source>ammo menu</source>
+        <source>change direction without moving</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="32"/>
-        <source>slot 1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="33"/>
-        <source>slot 2</source>
+        <source>backwards jump</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="34"/>
-        <source>slot 3</source>
+        <source>switch backwards</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="35"/>
-        <source>slot 4</source>
+        <source>ammo menu</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="36"/>
-        <source>slot 5</source>
+        <source>slot 1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="37"/>
-        <source>slot 6</source>
+        <source>slot 2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="38"/>
-        <source>slot 7</source>
+        <source>slot 3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="39"/>
-        <source>slot 8</source>
+        <source>slot 4</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="40"/>
-        <source>slot 9</source>
+        <source>slot 5</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="41"/>
-        <source>slot 10</source>
+        <source>slot 6</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="42"/>
-        <source>timer 1 sec</source>
+        <source>slot 7</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="43"/>
-        <source>timer 2 sec</source>
+        <source>slot 8</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="44"/>
-        <source>timer 3 sec</source>
+        <source>slot 9</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="45"/>
-        <source>timer 4 sec</source>
+        <source>slot 10</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="46"/>
-        <source>timer 5 sec</source>
+        <source>unselect weapon</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="47"/>
-        <source>change timer</source>
+        <source>timer 1 sec</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="48"/>
+        <source>timer 2 sec</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="49"/>
+        <source>timer 3 sec</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="50"/>
-        <source>autocam / find hedgehog</source>
+        <source>timer 4 sec</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="51"/>
+        <source>timer 5 sec</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="52"/>
+        <source>change timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="53"/>
+        <source>change bounciness</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="56"/>
-        <source>zoom in</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="57"/>
-        <source>zoom out</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="58"/>
-        <source>reset zoom</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="59"/>
-        <source>chat</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="60"/>
-        <source>clan chat</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="61"/>
-        <source>chat history</source>
+        <source>autocam / find hedgehog</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="62"/>
-        <source>pause / auto skip</source>
+        <source>zoom in</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="63"/>
-        <source>quit</source>
+        <source>zoom out</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="64"/>
-        <source>confirmation</source>
+        <source>reset zoom to start value</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="65"/>
-        <source>volume down</source>
+        <source>set zoom to 100%</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="66"/>
-        <source>volume up</source>
+        <source>chat</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="67"/>
-        <source>mute audio</source>
+        <source>clan chat</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="68"/>
-        <source>change mode</source>
+        <source>chat history</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="69"/>
-        <source>capture</source>
+        <source>pause / auto skip</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="70"/>
-        <source>speed up replay</source>
+        <source>quit</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="71"/>
-        <source>show mission information</source>
+        <source>confirmation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="72"/>
+        <source>volume down</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="73"/>
-        <source>toggle team bars</source>
-        <extracomment>This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen</extracomment>
+        <source>volume up</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="74"/>
-        <source>toggle hedgehog tags</source>
+        <source>mute audio</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="75"/>
+        <source>change mode</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="76"/>
+        <source>screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="77"/>
+        <source>save map as image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="78"/>
+        <source>speed up replay</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="79"/>
+        <source>show mission information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="80"/>
+        <source>show object information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="82"/>
+        <source>toggle team bars</source>
+        <extracomment>This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="83"/>
+        <source>toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="84"/>
+        <source>change hedgehog tag types</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="85"/>
+        <source>toggle hedgehog tag translucency</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="87"/>
+        <source>toggle HUD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="89"/>
         <source>record</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4178,40 +4429,93 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="31"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="35"/>
         <source>Weapons</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="50"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="56"/>
         <source>Camera</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="59"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="66"/>
         <source>Miscellaneous</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="28"/>
+        <source>hold down precise</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="29"/>
+        <source>precise + left/right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="32"/>
+        <source>high jump (twice)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="34"/>
+        <source>precise + switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="53"/>
+        <source>precise + timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="65"/>
+        <source>precise + reset zoom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="77"/>
+        <source>precise + screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="84"/>
+        <source>precise + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="85"/>
+        <source>switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="87"/>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="28"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="30"/>
         <source>Traverse gaps and obstacles by jumping:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="48"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="54"/>
         <source>Fire your selected weapon or trigger an utility item:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="49"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="55"/>
         <source>Pick a weapon or a target location under the cursor:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="30"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="33"/>
         <source>Switch your currently active hog (if possible):</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4221,67 +4525,67 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="31"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="35"/>
         <source>Pick a weapon or utility item:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="42"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="47"/>
         <source>Set the timer on bombs and timed weapons:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="50"/>
-        <source>Toggle automatic camera / refocus on active hedgehog:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="51"/>
-        <source>Move the cursor or camera without using the mouse:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="56"/>
-        <source>Modify the camera&apos;s zoom level:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="59"/>
-        <source>Talk to your clan or all participants:</source>
+        <source>Toggle automatic camera / refocus on active hedgehog:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="57"/>
+        <source>Move the cursor or camera without using the mouse:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="62"/>
-        <source>Pause, continue or leave your game:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="65"/>
-        <source>Modify the game&apos;s volume while playing:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="68"/>
-        <source>Toggle fullscreen mode:</source>
+        <source>Modify the camera&apos;s zoom level:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="66"/>
+        <source>Talk to your clan or all participants:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="69"/>
-        <source>Take a screenshot:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="70"/>
-        <source>Demo replay:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="71"/>
-        <source>Heads-up display:</source>
+        <source>Pause, continue or leave your game:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="72"/>
+        <source>Modify the game&apos;s volume while playing:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="75"/>
+        <source>Toggle fullscreen mode:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="76"/>
+        <source>Take a screenshot:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="78"/>
+        <source>Demo replay:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="79"/>
+        <source>Heads-up display:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="89"/>
         <source>Record video:</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4289,442 +4593,1034 @@
 <context>
     <name>binds (keys)</name>
     <message>
-        <location filename="../../../../QTfrontend/util/DataManager.cpp" line="162"/>
+        <location filename="../../../../QTfrontend/util/DataManager.cpp" line="183"/>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/util/DataManager.cpp" line="190"/>
         <source>Keyboard</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="25"/>
-        <source>Mouse: Left button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="26"/>
-        <source>Mouse: Middle button</source>
+        <source>Mouse: Left button</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="27"/>
-        <source>Mouse: Right button</source>
+        <source>Mouse: Middle button</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="28"/>
-        <source>Mouse: Wheel up</source>
+        <source>Mouse: Right button</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="29"/>
-        <source>Mouse: Wheel down</source>
+        <source>Mouse: X1 button </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="30"/>
-        <source>Backspace</source>
+        <source>Mouse: X2 button</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="31"/>
-        <source>Tab</source>
+        <source>Mouse: Wheel up</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="32"/>
-        <source>Clear</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="33"/>
-        <source>Return</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="34"/>
-        <source>Pause</source>
+        <source>Mouse: Wheel down</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="35"/>
-        <source>Escape</source>
+        <source>Backspace</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="36"/>
+        <source>Tab</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="37"/>
+        <source>Clear</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="38"/>
+        <source>Return</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="39"/>
+        <source>Pause</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="40"/>
+        <source>Escape</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="41"/>
         <source>Space</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="100"/>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="109"/>
         <source>Delete</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="101"/>
-        <source>Numpad 0</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="102"/>
-        <source>Numpad 1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="103"/>
-        <source>Numpad 2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="104"/>
-        <source>Numpad 3</source>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="188"/>
+        <source>Up</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="105"/>
-        <source>Numpad 4</source>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="189"/>
+        <source>Down</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="106"/>
-        <source>Numpad 5</source>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="191"/>
+        <source>Right</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="107"/>
-        <source>Numpad 6</source>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="190"/>
+        <source>Left</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="108"/>
-        <source>Numpad 7</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="109"/>
-        <source>Numpad 8</source>
+        <source>Insert</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="110"/>
-        <source>Numpad 9</source>
+        <source>Home</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="111"/>
-        <source>Numpad .</source>
+        <source>End</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="88"/>
+        <source>Keypad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="89"/>
+        <source>Keypad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="90"/>
+        <source>Keypad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="91"/>
+        <source>Keypad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="92"/>
+        <source>Keypad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="93"/>
+        <source>Keypad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="94"/>
+        <source>Keypad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="95"/>
+        <source>Keypad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="96"/>
+        <source>Keypad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="97"/>
+        <source>Keypad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="98"/>
+        <source>Keypad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="99"/>
+        <source>Keypad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="100"/>
+        <source>Keypad *</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="101"/>
+        <source>Keypad -</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="102"/>
+        <source>Keypad +</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="103"/>
+        <source>Keypad Enter</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="112"/>
-        <source>Numpad /</source>
+        <source>PageUp</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="113"/>
-        <source>Numpad *</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="114"/>
-        <source>Numpad -</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="115"/>
-        <source>Numpad +</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="116"/>
-        <source>Enter</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="117"/>
-        <source>Equals</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="118"/>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="195"/>
-        <source>Up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="119"/>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="196"/>
-        <source>Down</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="120"/>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="198"/>
-        <source>Right</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="121"/>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="197"/>
-        <source>Left</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="122"/>
-        <source>Insert</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="123"/>
-        <source>Home</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="124"/>
-        <source>End</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="125"/>
-        <source>Page up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="126"/>
-        <source>Page down</source>
+        <source>PageDown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="129"/>
+        <source>Numlock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="130"/>
+        <source>CapsLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="131"/>
+        <source>ScrollLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="132"/>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="133"/>
+        <source>Right Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="134"/>
+        <source>Left Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="135"/>
+        <source>Right Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="136"/>
+        <source>Left Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="137"/>
+        <source>Right Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="138"/>
+        <source>Left Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="140"/>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="142"/>
-        <source>Num lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="143"/>
-        <source>Caps lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="144"/>
-        <source>Scroll lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="145"/>
-        <source>Right shift</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="146"/>
-        <source>Left shift</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="147"/>
-        <source>Right ctrl</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="148"/>
-        <source>Left ctrl</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="149"/>
-        <source>Right alt</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="150"/>
-        <source>Left alt</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="151"/>
-        <source>Right meta</source>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="152"/>
-        <source>Left meta</source>
+        <source>A button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="153"/>
+        <source>B button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="154"/>
+        <source>X button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="155"/>
+        <source>Y button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="156"/>
+        <source>LB button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="157"/>
+        <source>RB button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="158"/>
+        <source>Back button</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="159"/>
-        <source>A button</source>
+        <source>Start button</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="160"/>
-        <source>B button</source>
+        <source>Left stick</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="161"/>
-        <source>X button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="162"/>
-        <source>Y button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="163"/>
-        <source>LB button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="164"/>
-        <source>RB button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="165"/>
-        <source>Back button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="166"/>
-        <source>Start button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="167"/>
-        <source>Left stick</source>
+        <source>Right stick</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="168"/>
-        <source>Right stick</source>
+        <source>Left stick (Right)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="169"/>
+        <source>Left stick (Left)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="170"/>
+        <source>Left stick (Down)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="171"/>
+        <source>Left stick (Up)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="172"/>
+        <source>Left trigger</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="173"/>
+        <source>Right trigger</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="174"/>
+        <source>Right stick (Down)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="175"/>
-        <source>Left stick (Right)</source>
+        <source>Right stick (Up)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="176"/>
-        <source>Left stick (Left)</source>
+        <source>Right stick (Right)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="177"/>
-        <source>Left stick (Down)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="178"/>
-        <source>Left stick (Up)</source>
+        <source>Right stick (Left)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="179"/>
-        <source>Left trigger</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="180"/>
-        <source>Right trigger</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="181"/>
-        <source>Right stick (Down)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="182"/>
-        <source>Right stick (Up)</source>
+        <source>D-pad</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="183"/>
-        <source>Right stick (Right)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="184"/>
-        <source>Right stick (Left)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="186"/>
-        <source>D-pad</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="190"/>
         <source>Axis %1 %2</source>
         <extracomment>Game controller axis direction. %1 = axis number, %2 = direction</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="192"/>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="185"/>
         <source>Button %1</source>
         <extracomment>Game controller button. %1 = button number</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="187"/>
+        <source>D-pad %1 %2</source>
+        <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="194"/>
-        <source>D-pad %1 %2</source>
-        <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="2"/>
+        <source>Programming</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="3"/>
+        <source>Game engine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="4"/>
+        <source>Creator</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="5"/>
+        <source>Many engine improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="6"/>
+        <source>Gamepad and Lua integration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="7"/>
+        <source>Campaign support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="8"/>
+        <source>Theme customization improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="9"/>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="10"/>
+        <source>Video recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="11"/>
+        <source>Other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="12"/>
+        <source>Map generation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="13"/>
+        <source>Core map generators</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="14"/>
+        <source>Perlin maps and other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="15"/>
+        <source>Maze maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="16"/>
+        <source>Weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="17"/>
+        <source>Most core weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="18"/>
+        <source>Air mine, rubber, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="19"/>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="20"/>
+        <source>Freezer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="21"/>
+        <source>Mine number and time game settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="22"/>
+        <source>Frontend / main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="23"/>
+        <source>Many frontend improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="24"/>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="25"/>
+        <source>Login dialogs, other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="26"/>
+        <source>Missions and styles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="27"/>
+        <source>A Classic Fairytale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="28"/>
+        <source>A Space Adventure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="29"/>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="30"/>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="31"/>
+        <source>Some styles and missions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="32"/>
+        <source>Battalion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="33"/>
+        <source>Continental supplies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="34"/>
+        <source>Teamwork 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="35"/>
+        <source>Climb Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="36"/>
+        <source>Portal Mind Challenge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="37"/>
+        <source>Game server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="38"/>
+        <source>Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="39"/>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="40"/>
+        <source>Android port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="41"/>
+        <source>Android netplay, portability abstraction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="42"/>
+        <source>WebGL port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="43"/>
+        <source>iPhone/iPad ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="44"/>
+        <source>Graphics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="45"/>
+        <source>General</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="46"/>
+        <source>Themes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="47"/>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="48"/>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="49"/>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="50"/>
+        <source>Hoggywood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="51"/>
+        <source>Cave, Olympics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="52"/>
+        <source>Fruit, Cake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="53"/>
+        <source>Art</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="54"/>
+        <source>Beach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="55"/>
+        <source>Brick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="56"/>
+        <source>Hell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="57"/>
+        <source>Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="58"/>
+        <source>Sheep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="59"/>
+        <source>Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="60"/>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="61"/>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="62"/>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="63"/>
+        <source>Castle, PirateFlag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="64"/>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="65"/>
+        <source>Battlefield</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="66"/>
+        <source>CTF_Blizzard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="67"/>
+        <source>Cheese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="68"/>
+        <source>ClimbHome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="69"/>
+        <source>Lonely_Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="70"/>
+        <source>Octorama</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="71"/>
+        <source>portal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="72"/>
+        <source>Ruler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="73"/>
+        <source>Sticks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="74"/>
+        <source>Forts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="75"/>
+        <source>EvilChicken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="76"/>
+        <source>Olympic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="77"/>
+        <source>Tank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="78"/>
+        <source>Snail</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="79"/>
+        <source>SteelTower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="80"/>
+        <source>Hats, graves, other</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="81"/>
+        <source>See CREDITS text file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="82"/>
+        <source>Sounds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="83"/>
+        <source>Hedgehogs voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="84"/>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="85"/>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="86"/>
+        <source>Music</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="87"/>
+        <source>City, Rock, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="88"/>
+        <source>Compost</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="89"/>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="90"/>
+        <source>Fruit, Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="91"/>
+        <source>Nature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="92"/>
+        <source>olympics_sd</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="93"/>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="94"/>
+        <source>Translations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="95"/>
+        <source>Brazilian Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="96"/>
+        <source>Bulgarian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="97"/>
+        <source>Czech</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="98"/>
+        <source>Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="99"/>
+        <source>Finnish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="100"/>
+        <source>French</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="101"/>
+        <source>German</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="102"/>
+        <source>Greek</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="103"/>
+        <source>Italian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="104"/>
+        <source>Japanese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="105"/>
+        <source>Korean</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="106"/>
+        <source>Lithuanian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="107"/>
+        <source>Polish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="108"/>
+        <source>Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="109"/>
+        <source>Russian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="110"/>
+        <source>Scottish Gaelic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="111"/>
+        <source>Slovak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="112"/>
+        <source>Spanish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="113"/>
+        <source>Swedish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="114"/>
+        <source>Ukrainian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="115"/>
+        <source>Special thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="116"/>
+        <source>Project founder</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
     <name>server</name>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="102"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="105"/>
         <source>New voting started</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="104"/>
-        <source>kick</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="105"/>
-        <source>map</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="106"/>
-        <source>pause</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="107"/>
+        <source>kick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="108"/>
+        <source>map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="109"/>
+        <source>pause</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="110"/>
         <source>new seed</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="74"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="76"/>
         <source>/maxteams: specify number from 2 to 8</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="47"/>
-        <source>&apos;Registered only&apos; state toggled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="48"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="50"/>
         <source>Super power activated.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="46"/>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="862"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="49"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="870"/>
         <source>Unknown command or invalid parameters. Say &apos;/help&apos; in chat for a list of commands.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="77"/>
-        <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="2"/>
         <source>Nickname is already in use</source>
         <translation type="unfinished"></translation>
@@ -4786,431 +5682,456 @@
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="14"/>
-        <source>/info &lt;player&gt;: Show info about player</source>
+        <source>This server no longer allows unregistered players to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="15"/>
-        <source>/me &lt;message&gt;: Chat action, e.g. &apos;/me eats pizza&apos; becomes &apos;* Player eats pizza&apos;</source>
+        <source>This server now allows unregistered players to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="16"/>
-        <source>/rnd: Flip a virtual coin and reply with &apos;heads&apos; or &apos;tails&apos;</source>
+        <source>/info &lt;player&gt;: Show info about player</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="17"/>
-        <source>/rnd [A] [B] [C] [...]: Reply with a random word from the given list</source>
+        <source>/me &lt;message&gt;: Chat action, e.g. &apos;/me eats pizza&apos; becomes &apos;* Player eats pizza&apos;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="18"/>
-        <source>/watch &lt;id&gt;: Watch a demo stored on the server with the given ID</source>
+        <source>/rnd: Flip a virtual coin and reply with &apos;heads&apos; or &apos;tails&apos;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="19"/>
-        <source>/quit: Quit the server</source>
+        <source>/rnd [A] [B] [C] [...]: Reply with a random word from the given list</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="20"/>
-        <source>/help: Show chat command help</source>
+        <source>/watch &lt;id&gt;: Watch a demo stored on the server with the given ID</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="21"/>
-        <source>/callvote [arguments]: Start a vote</source>
+        <source>/quit: Quit the server</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="22"/>
-        <source>/vote &lt;yes/no&gt;: Vote &apos;yes&apos; or &apos;no&apos; for active vote</source>
+        <source>/help: Show chat command help</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="23"/>
+        <source>/callvote [arguments]: Start a vote</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="24"/>
-        <source>/delegate &lt;player&gt;: Surrender room control to player</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="25"/>
-        <source>/maxteams &lt;N&gt;: Limit maximum number of teams to N</source>
+        <source>/vote &lt;yes/no&gt;: Vote &apos;yes&apos; or &apos;no&apos; for active vote</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="26"/>
-        <source>/global &lt;message&gt;: Send global chat message which can be seen by everyone on the server</source>
+        <source>/delegate &lt;player&gt;: Surrender room control to player</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="27"/>
-        <source>/registered_only: Toggle &apos;registered only&apos; state. If enabled, only registered players can join server</source>
+        <source>/maxteams &lt;N&gt;: Limit maximum number of teams to N</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="28"/>
-        <source>/super_power: Activate your super power. With it you can enter any room and are protected from kicking. Expires when you leave server</source>
+        <source>/global &lt;message&gt;: Send global chat message which can be seen by everyone on the server</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="29"/>
-        <source>/stats: Query server stats</source>
+        <source>/registered_only: Toggle &apos;registered only&apos; state. If enabled, only registered players can join server</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="30"/>
-        <source>/force &lt;yes/no&gt;: Force vote result for active vote</source>
+        <source>/super_power: Activate your super power. With it you can enter any room and are protected from kicking. Expires when you leave server</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="31"/>
-        <source>/fix: Force this room to stay open when it is empty</source>
+        <source>/stats: Query server stats</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="32"/>
+        <source>/force &lt;yes/no&gt;: Force vote result for active vote</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="33"/>
+        <source>/fix: Force this room to stay open when it is empty</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="34"/>
         <source>/unfix: Undo the /fix command</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="37"/>
-        <source>List of lobby chat commands:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="38"/>
-        <source>List of room chat commands:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="39"/>
+        <source>List of lobby chat commands:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="40"/>
+        <source>List of room chat commands:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="41"/>
         <source>Commands for server admins only:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="44"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="46"/>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="47"/>
         <source>This command is only available in the lobby.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="45"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="48"/>
         <source>This command is only available in rooms.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="49"/>
-        <source>room</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="50"/>
-        <source>lobby</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="51"/>
-        <source>(playing)</source>
+        <source>room</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="52"/>
-        <source>(spectating)</source>
+        <source>lobby</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="53"/>
-        <source>Player is not online.</source>
+        <source>(playing)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="54"/>
-        <source>The game can&apos;t be started with less than two clans!</source>
+        <source>(spectating)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="55"/>
-        <source>Empty config entry.</source>
+        <source>Player is not online.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="56"/>
-        <source>Access denied.</source>
+        <source>The game can&apos;t be started with less than two clans!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="57"/>
-        <source>You&apos;re not the room master!</source>
+        <source>Empty config entry.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="58"/>
-        <source>Corrupted hedgehogs info!</source>
+        <source>Access denied.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="59"/>
-        <source>Too many teams!</source>
+        <source>You&apos;re not the room master!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="60"/>
-        <source>Too many hedgehogs!</source>
+        <source>Corrupted hedgehogs info!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="61"/>
-        <source>There&apos;s already a team with same name in the list.</source>
+        <source>Too many teams!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="62"/>
-        <source>Joining not possible: Round is in progress.</source>
+        <source>Too many hedgehogs!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="63"/>
-        <source>This room currently does not allow adding new teams.</source>
+        <source>There&apos;s already a team with same name in the list.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="64"/>
-        <source>Error: The team you tried to remove does not exist.</source>
+        <source>Joining not possible: Round is in progress.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="65"/>
-        <source>You can&apos;t remove a team you don&apos;t own.</source>
+        <source>This room currently does not allow adding new teams.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="66"/>
-        <source>Illegal room name! The room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
+        <source>Error: The team you tried to remove does not exist.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="67"/>
-        <source>A room with the same name already exists.</source>
+        <source>You can&apos;t remove a team you don&apos;t own.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="68"/>
-        <source>You can&apos;t kick yourself!</source>
+        <source>Illegal room name! The room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="69"/>
-        <source>You can&apos;t kick the only other player!</source>
+        <source>A room with the same name already exists.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="70"/>
-        <source>The player is not in your room.</source>
+        <source>You can&apos;t kick yourself!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="71"/>
-        <source>This player is protected from being kicked.</source>
+        <source>You can&apos;t kick the only other player!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="72"/>
-        <source>You&apos;re not the room master or a server admin!</source>
+        <source>The player is not in your room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="73"/>
-        <source>You&apos;re already the room master.</source>
+        <source>This player is protected from being kicked.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="74"/>
+        <source>You&apos;re not the room master or a server admin!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="75"/>
+        <source>You&apos;re already the room master.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="77"/>
         <source>Greeting message cleared.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="76"/>
-        <source>Greeting message set.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="78"/>
-        <source>/callvote kick: You need to specify a nickname.</source>
+        <source>Greeting message set.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="79"/>
-        <source>/callvote kick: This is only allowed in rooms without a room master.</source>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="81"/>
+        <source>/callvote kick: You need to specify a nickname.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="80"/>
-        <source>/callvote kick: No such user!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="81"/>
-        <source>/callvote map: No maps available.</source>
+        <source>/callvote kick: This is only allowed in rooms without a room master.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="82"/>
-        <source>/callvote map: No such map!</source>
+        <source>/callvote kick: No such user!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="83"/>
-        <source>/callvote pause: No game in progress!</source>
+        <source>/callvote map: No maps available.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="84"/>
-        <source>/callvote hedgehogs: Specify number from 1 to 8.</source>
+        <source>/callvote map: No such map!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="85"/>
-        <source>/force: Please use &apos;yes&apos; or &apos;no&apos;.</source>
+        <source>/callvote pause: No game in progress!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="86"/>
-        <source>/vote: Please use &apos;yes&apos; or &apos;no&apos;.</source>
+        <source>/callvote hedgehogs: Specify number from 1 to 8.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="87"/>
-        <source>Illegal room name! A room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
+        <source>/force: Please use &apos;yes&apos; or &apos;no&apos;.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="88"/>
-        <source>No such room.</source>
+        <source>/vote: Please use &apos;yes&apos; or &apos;no&apos;.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="89"/>
-        <source>Room version incompatible to your Hedgewars version!</source>
+        <source>Illegal room name! A room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="90"/>
-        <source>Access denied. This room currently doesn&apos;t allow joining.</source>
+        <source>No such room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="91"/>
-        <source>Access denied. This room is for registered users only.</source>
+        <source>Room version incompatible to your Hedgewars version!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="92"/>
-        <source>You are banned from this room.</source>
+        <source>Access denied. This room currently doesn&apos;t allow joining.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="93"/>
-        <source>Nickname already provided.</source>
+        <source>Access denied. This room is for registered users only.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="94"/>
-        <source>Illegal nickname! Nicknames must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
+        <source>You are banned from this room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="95"/>
-        <source>Protocol already known.</source>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="96"/>
-        <source>Bad number.</source>
+        <source>Nickname already provided.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="97"/>
-        <source>There&apos;s no voting going on.</source>
+        <source>Illegal nickname! Nicknames must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="98"/>
-        <source>You already have voted.</source>
+        <source>Protocol already known.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="99"/>
-        <source>Your vote has been counted.</source>
+        <source>Bad number.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="100"/>
-        <source>Voting closed.</source>
+        <source>There&apos;s no voting going on.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="101"/>
-        <source>Pause toggled.</source>
+        <source>You already have voted.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="102"/>
+        <source>Your vote has been counted.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="103"/>
+        <source>Voting closed.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="104"/>
+        <source>Pause toggled.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="106"/>
         <source>Voting expired.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="108"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="111"/>
         <source>hedgehogs per team: </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="109"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="112"/>
         <source>You&apos;re the new room master!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="40"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="42"/>
         <source>Warning! Chat flood protection activated</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="23"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="25"/>
         <source>/greeting [message]: Set or clear greeting message to be shown to players who join the room</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="33"/>
-        <source>/save &lt;config ID&gt; &lt;config name&gt;: Add current room configuration as votable choice for /callvote map</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="34"/>
-        <source>/delete &lt;config ID&gt;: Delete a votable room configuration</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="35"/>
-        <source>/saveroom &lt;file name&gt;: Save all votable room configurations (and the greeting) of this room into a file</source>
+        <source>/save &lt;config ID&gt; &lt;config name&gt;: Add current room configuration as votable choice for /callvote map</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="36"/>
+        <source>/delete &lt;config ID&gt;: Delete a votable room configuration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="37"/>
+        <source>/saveroom &lt;file name&gt;: Save all votable room configurations (and the greeting) of this room into a file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="38"/>
         <source>/loadroom &lt;file name&gt;: Load votable room configurations (and greeting) from a file</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="41"/>
-        <source>Excess flood</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="42"/>
-        <source>Game messages flood detected - 1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="43"/>
+        <source>Excess flood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="44"/>
+        <source>Game messages flood detected - 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="45"/>
         <source>Warning! Joins flood protection activated</source>
         <translation type="unfinished"></translation>
     </message>
--- a/share/hedgewars/Data/Locale/hedgewars_ms.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_ms.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -4,95 +4,148 @@
 <context>
     <name>About</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="76"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="92"/>
+        <source>Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="171"/>
+        <source>Other people</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="181"/>
+        <source>%1 (alias %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="202"/>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="208"/>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="217"/>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="265"/>
         <source>Hedgewars %1</source>
         <extracomment>%1 contains Hedgewars&apos; version number</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="78"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="267"/>
         <source>Revision %1 (%2)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="80"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="269"/>
         <source>Visit our homepage: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="83"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="272"/>
         <source>This program is distributed under the %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="86"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="275"/>
         <source>GNU GPL v2</source>
         <extracomment>Short for “GNU General Public License version 2”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="101"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="304"/>
+        <source>Extended Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="305"/>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="314"/>
         <source>Dependency versions:</source>
         <extracomment>For the version numbers of Hedgewars&apos; software dependencies</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="104"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="317"/>
         <source>&lt;a href=&quot;https://gcc.gnu.org&quot;&gt;GCC&lt;/a&gt;: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="107"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="319"/>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="321"/>
+        <source>Unknown Compiler: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="323"/>
         <source>Unknown Compiler</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="114"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="331"/>
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="121"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="338"/>
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_mixer&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="135"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="352"/>
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_net&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="150"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="367"/>
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_image&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="165"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="382"/>
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_ttf&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="175"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="392"/>
         <source>&lt;a href=&quot;https://www.qt.io/developers/&quot;&gt;Qt&lt;/a&gt;: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="179"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="396"/>
         <source>&lt;a href=&quot;https://libav.org&quot;&gt;libavcodec&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="184"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="401"/>
         <source>&lt;a href=&quot;https://libav.org&quot;&gt;libavformat&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="189"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="406"/>
         <source>&lt;a href=&quot;https://libav.org&quot;&gt;libavutil&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="196"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="413"/>
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
@@ -176,7 +229,7 @@
 <context>
     <name>DataManager</name>
     <message>
-        <location filename="../../../../QTfrontend/util/DataManager.cpp" line="155"/>
+        <location filename="../../../../QTfrontend/util/DataManager.cpp" line="159"/>
         <source>Use Default</source>
         <translation type="unfinished"></translation>
     </message>
@@ -262,12 +315,12 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="171"/>
+        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="172"/>
         <source>Edit weapons</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="179"/>
+        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="181"/>
         <source>Game scheme will auto-select a weapon</source>
         <translation type="unfinished"></translation>
     </message>
@@ -275,22 +328,22 @@
 <context>
     <name>GameSchemeModel</name>
     <message>
-        <location filename="../../../../QTfrontend/model/gameSchemeModel.cpp" line="924"/>
+        <location filename="../../../../QTfrontend/model/gameSchemeModel.cpp" line="1025"/>
         <source>New</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/model/gameSchemeModel.cpp" line="929"/>
+        <location filename="../../../../QTfrontend/model/gameSchemeModel.cpp" line="1030"/>
         <source>New (%1)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/model/gameSchemeModel.cpp" line="938"/>
+        <location filename="../../../../QTfrontend/model/gameSchemeModel.cpp" line="1039"/>
         <source>Copy of %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/model/gameSchemeModel.cpp" line="943"/>
+        <location filename="../../../../QTfrontend/model/gameSchemeModel.cpp" line="1044"/>
         <source>Copy of %1 (%2)</source>
         <translation type="unfinished"></translation>
     </message>
@@ -298,7 +351,7 @@
 <context>
     <name>GameUIConfig</name>
     <message>
-        <location filename="../../../../QTfrontend/gameuiconfig.cpp" line="117"/>
+        <location filename="../../../../QTfrontend/gameuiconfig.cpp" line="536"/>
         <source>Guest</source>
         <translation type="unfinished"></translation>
     </message>
@@ -356,68 +409,72 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="153"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="172"/>
         <source>Usage</source>
         <comment>command-line</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="154"/>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/main.cpp" line="175"/>
         <source>OPTION</source>
         <comment>command-line</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="155"/>
-        <location filename="../../../../QTfrontend/main.cpp" line="160"/>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/main.cpp" line="178"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="185"/>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="156"/>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/main.cpp" line="181"/>
         <source>Options</source>
         <comment>command-line</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="157"/>
+        <extracomment>“Options” as in “command-line options”</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/main.cpp" line="182"/>
         <source>Display this help</source>
         <comment>command-line</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="158"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="183"/>
         <source>Custom path for configuration data and user data</source>
         <comment>command-line</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="159"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="184"/>
         <source>Custom path to the game data folder</source>
         <comment>command-line</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="160"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="185"/>
         <source>Hedgewars can use a %1 (e.g. &quot;%2&quot;) to connect on start.</source>
         <comment>command-line</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="205"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="430"/>
         <source>Malformed option argument: %1</source>
         <comment>command-line</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="245"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="439"/>
         <source>Unknown option argument: %1</source>
         <comment>command-line</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="337"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="370"/>
         <source>Failed to open data directory:
 %1
 
@@ -456,62 +513,62 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="545"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="553"/>
         <source>%1 has left</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="550"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="558"/>
         <source>%1 has left (%2)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="689"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="697"/>
         <source>%1 has been removed from your ignore list</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="699"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="707"/>
         <source>%1 has been added to your ignore list</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="729"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="737"/>
         <source>%1 has been removed from your friends list</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="738"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="746"/>
         <source>%1 has been added to your friends list</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="806"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="814"/>
         <source>Stylesheet imported from %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="807"/>
-        <source>Enter %1 if you want to use the current StyleSheet in future, enter %2 to reset!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="815"/>
-        <source>Couldn&apos;t read %1</source>
+        <source>Enter %1 if you want to use the current StyleSheet in future, enter %2 to reset!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="823"/>
+        <source>Couldn&apos;t read %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="831"/>
         <source>StyleSheet discarded</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="847"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="855"/>
         <source>StyleSheet saved to %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="850"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="858"/>
         <source>Failed to save StyleSheet to %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -519,47 +576,39 @@
 <context>
     <name>HWForm</name>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="170"/>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="519"/>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1507"/>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1526"/>
-        <source>Guest</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="527"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="544"/>
         <source>Team 1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="532"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="549"/>
         <source>%1&apos;s Team</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="551"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="569"/>
         <source>Team %1</source>
         <extracomment>Default team name</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="562"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="581"/>
         <source>Computer %1</source>
         <extracomment>Default computer team name</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="738"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="767"/>
         <source>Game aborted</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1186"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1220"/>
         <source>Hedgewars - Nick registered</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1187"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1221"/>
         <source>This nick is registered, and you haven&apos;t specified a password.
 
 If this nick isn&apos;t yours, please register your own nick at www.hedgewars.org
@@ -568,119 +617,119 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1215"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1249"/>
         <source>Your nickname is not registered.
 To prevent someone else from using it,
 please register it at www.hedgewars.org</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1220"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1254"/>
         <source>
 
 Your password wasn&apos;t saved either.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1232"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1266"/>
         <source>Nickname</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1232"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1266"/>
         <source>Someone already uses your nickname %1 on the server.
 Please pick another nickname:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1237"/>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1560"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1271"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1596"/>
         <source>No nickname supplied.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1237"/>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1560"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1271"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1596"/>
         <source>Hedgewars - Empty nickname</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1264"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1298"/>
         <source>Hedgewars - Wrong password</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1264"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1298"/>
         <source>You entered a wrong password.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1276"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1310"/>
         <source>Room password</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1276"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1310"/>
         <source>The room is protected with password.
 Please, enter the password:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1292"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1326"/>
         <source>Try Again</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1664"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1700"/>
         <source>Hedgewars - Connection error</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1664"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1700"/>
         <source>You reconnected too fast.
 Please wait a few seconds and try again.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1830"/>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2216"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1889"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2412"/>
         <source>Cannot save record to file %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2146"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2341"/>
         <source>Hedgewars Demo File</source>
         <comment>File Types</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2147"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2342"/>
         <source>Hedgewars Save File</source>
         <comment>File Types</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2208"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2404"/>
         <source>Demo name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2208"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2404"/>
         <source>Demo name:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2282"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2478"/>
         <source>Unknown network error (possibly missing SSL library).</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2286"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2482"/>
         <source>This feature requires an Internet connection, but you don&apos;t appear to be online (error code: %1).</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2291"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2487"/>
         <source>Internal error: Reply object is invalid.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -688,7 +737,7 @@
 <context>
     <name>HWGame</name>
     <message>
-        <location filename="../../../../QTfrontend/game.cpp" line="258"/>
+        <location filename="../../../../QTfrontend/game.cpp" line="433"/>
         <source>A fatal ERROR occured! The game engine had to stop.
 
 We are very sorry for the inconvenience. :-(
@@ -700,14 +749,14 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/game.cpp" line="404"/>
-        <location filename="../../../../QTfrontend/net/recorder.cpp" line="114"/>
+        <location filename="../../../../QTfrontend/game.cpp" line="587"/>
+        <location filename="../../../../QTfrontend/net/recorder.cpp" line="125"/>
         <source>en.txt</source>
         <extracomment>IMPORTANT: This text has a special meaning, do not translate it directly. This is the file name of translation files for the game engine, found in Data/Locale/. Usually, you replace “en” with the ISO-639-1 language code of your language.</extracomment>
         <translation>ms.txt</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/game.cpp" line="457"/>
+        <location filename="../../../../QTfrontend/game.cpp" line="646"/>
         <source>Cannot open demofile %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -778,168 +827,183 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="232"/>
-        <source>Load map drawing</source>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="236"/>
+        <source>Load</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="238"/>
-        <source>Edit map drawing</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="251"/>
-        <source>All</source>
+        <source>Load map drawing</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="252"/>
-        <source>Small</source>
+        <source>Edit</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="253"/>
+        <source>Edit map drawing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="271"/>
+        <source>All</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="272"/>
+        <source>Small</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="273"/>
         <source>Medium</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="254"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="274"/>
         <source>Large</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="255"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="275"/>
         <source>Cavern</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="256"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="276"/>
         <source>Wacky</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="266"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="286"/>
         <source>Large tunnels</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="267"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="287"/>
         <source>Small islands</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="268"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="288"/>
         <source>Medium islands</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="269"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="289"/>
         <source>Large islands</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="303"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="324"/>
         <source>Randomize the theme</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="313"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="334"/>
         <source>Choose a theme</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="917"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="938"/>
         <source>Randomize the map, theme and seed</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="918"/>
-        <source>Randomize the theme and seed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="919"/>
-        <source>Randomize the seed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="920"/>
-        <source>Click to randomize the map, theme and seed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="921"/>
-        <source>Click to randomize the theme and seed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="922"/>
-        <source>Adjust the complexity of the generated map</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="923"/>
-        <source>Adjust the distance between forts</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="939"/>
+        <source>Randomize the theme and seed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="940"/>
+        <source>Randomize the seed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="941"/>
+        <source>Click to randomize the map, theme and seed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="942"/>
+        <source>Click to randomize the theme and seed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="943"/>
+        <source>Adjust the complexity of the generated map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="944"/>
+        <source>Adjust the distance between forts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="945"/>
+        <source>Scale size of the drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="961"/>
         <source>Click to edit</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="971"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="994"/>
         <source>Map size:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="978"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1001"/>
         <source>Maze style:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="985"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1008"/>
         <source>Style:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1000"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1023"/>
         <source>Mission:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1020"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1043"/>
         <source>Map:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1121"/>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1313"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1140"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1342"/>
         <source>Theme: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1214"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1242"/>
         <source>Load drawn map</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1214"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1242"/>
         <source>Drawn Maps</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1214"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1242"/>
         <source>All files</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="264"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="284"/>
         <source>Small tunnels</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="265"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="285"/>
         <source>Medium tunnels</source>
         <translation type="unfinished"></translation>
     </message>
@@ -973,53 +1037,53 @@
 <context>
     <name>HWNewNet</name>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="234"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="246"/>
         <source>Remote host has closed connection</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="237"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="249"/>
         <source>The host was not found. Please check the host name and port settings.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="307"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="351"/>
         <source>The server is too old. Disconnecting now.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="558"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="611"/>
         <source>You got kicked</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="579"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="632"/>
         <source>Server authentication error</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="891"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="966"/>
         <source>%1 *** %2 has left</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="895"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="970"/>
         <source>%1 *** %2 has left (%3)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="744"/>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="876"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="797"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="951"/>
         <source>%1 *** %2 has joined the room</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="242"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="254"/>
         <source>The connection was refused by the official server or timed out. Something seems to be wrong with the official server at the moment. This might be a temporary problem. Please try again later.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="245"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="257"/>
         <source>The connection was refused by the host or timed out. This might have one of the following reasons:
 - The Hedgewars Server program does currently not run on the host
 - The specified port number is incorrect
@@ -1029,12 +1093,12 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="801"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="868"/>
         <source>Room destroyed</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1685"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1721"/>
         <source>Reason:</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1071,6 +1135,21 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <location filename="../../../../QTfrontend/net/recorder.cpp" line="83"/>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>HatButton</name>
     <message>
         <location filename="../../../../QTfrontend/ui/widget/hatbutton.cpp" line="44"/>
@@ -1104,7 +1183,12 @@
 <context>
     <name>KeyBinder</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/keybinder.cpp" line="101"/>
+        <location filename="../../../../QTfrontend/ui/widget/keybinder.cpp" line="95"/>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/keybinder.cpp" line="108"/>
         <source>Category</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1112,50 +1196,51 @@
 <context>
     <name>LibavInteraction</name>
     <message>
-        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="295"/>
+        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="293"/>
         <source>Duration: %1min %2s</source>
         <extracomment>Duration in minutes and seconds (SI units)</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="314"/>
+        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="312"/>
         <source>Video: %1x%2, %3 FPS, %4</source>
         <extracomment>Video metadata. %1 = video width, %2 = video height, %3 = frames per second = %4 = decoder name</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="319"/>
+        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="317"/>
         <source>Video: %1x%2, %3</source>
         <extracomment>Video metadata. %1 = video width, %2 = video height, %3 = decoder name</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="352"/>
+        <source>Player: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
         <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="354"/>
-        <source>Player: %1</source>
+        <source>Theme: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="356"/>
-        <source>Theme: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="358"/>
         <source>Map: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="361"/>
+        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="359"/>
         <source>Record: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="324"/>
+        <extracomment>As in ‘recording’</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="322"/>
         <source>Audio: </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="307"/>
+        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="305"/>
         <source>unknown</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1405,103 +1490,103 @@
 <context>
     <name>PageEditTeam</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="46"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="49"/>
         <source>Select an action to choose a custom key bind for this team</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="46"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="49"/>
         <source>Use my default</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="46"/>
-        <source>Reset all binds</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="48"/>
-        <source>General</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="49"/>
+        <source>Reset all binds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="51"/>
+        <source>General</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="52"/>
         <source>Custom Controls</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="67"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="70"/>
         <source>Hat</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="68"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="71"/>
         <source>Name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="79"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="82"/>
         <source>This hedgehog&apos;s name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="85"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="88"/>
         <source>Randomize this hedgehog&apos;s name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="89"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="92"/>
         <source>Random Hats</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="95"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="98"/>
         <source>Random Names</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="103"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="106"/>
         <source>Random Team</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="196"/>
-        <source>Randomize the team name</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="199"/>
-        <source>Randomize the grave</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="202"/>
+        <source>Randomize the team name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="205"/>
+        <source>Randomize the grave</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="208"/>
         <source>Randomize the flag</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="211"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="217"/>
         <source>Play a random example of this voice</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="214"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="220"/>
         <source>Randomize the voice</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="227"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="233"/>
         <source>Randomize the fort</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="432"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="438"/>
         <source>CPU %1</source>
         <extracomment>Name of a flag for computer-controlled enemies. %1 is replaced with the computer level</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="650"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="664"/>
         <source>%1 (%2)</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1509,54 +1594,54 @@
 <context>
     <name>PageGameStats</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="61"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="59"/>
         <source>Details</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="76"/>
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="167"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="74"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="177"/>
         <source>Health graph</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="94"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="93"/>
         <source>Ranking</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="120"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="119"/>
         <source>Play again</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="125"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="124"/>
         <source>Save</source>
         <translation type="unfinished"></translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="267"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="309"/>
         <source>The best shot award was won by &lt;b&gt;%1&lt;/b&gt; with &lt;b&gt;%2&lt;/b&gt; pts.</source>
         <translation type="unfinished">
             <numerusform></numerusform>
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="275"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="317"/>
         <source>The best killer is &lt;b&gt;%1&lt;/b&gt; with &lt;b&gt;%2&lt;/b&gt; kills in a turn.</source>
         <translation type="unfinished">
             <numerusform></numerusform>
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="282"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="324"/>
         <source>A total of &lt;b&gt;%1&lt;/b&gt; hedgehog(s) were killed during this round.</source>
         <translation type="unfinished">
             <numerusform></numerusform>
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="356"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="399"/>
         <source>(%1 kill)</source>
         <extracomment>Number of kills in stats screen, written after the team name</extracomment>
         <translation type="unfinished">
@@ -1564,7 +1649,31 @@
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="359"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="402"/>
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="405"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="409"/>
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="413"/>
+        <source>(%1 crate(s))</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="418"/>
         <source>(%1 %2)</source>
         <extracomment>For custom number of points in the stats screen, written after the team name. %1 is the number, %2 is the word. Example: “4 points”</extracomment>
         <translation type="unfinished">
@@ -1572,28 +1681,28 @@
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="373"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="433"/>
         <source>&lt;b&gt;%1&lt;/b&gt; thought it&apos;s good to shoot their own hedgehogs for &lt;b&gt;%2&lt;/b&gt; pts.</source>
         <translation type="unfinished">
             <numerusform></numerusform>
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="381"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="441"/>
         <source>&lt;b&gt;%1&lt;/b&gt; killed &lt;b&gt;%2&lt;/b&gt; of their own hedgehogs.</source>
         <translation type="unfinished">
             <numerusform></numerusform>
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="389"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="449"/>
         <source>&lt;b&gt;%1&lt;/b&gt; was scared and skipped turn &lt;b&gt;%2&lt;/b&gt; times.</source>
         <translation type="unfinished">
             <numerusform></numerusform>
         </translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="406"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="466"/>
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1648,46 +1757,47 @@
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="79"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="83"/>
         <source>Read about who is behind the Hedgewars Project</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="82"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="86"/>
         <source>Feedback</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="84"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="88"/>
         <source>Leave a feedback here reporting issues, suggesting features or just saying how you like Hedgewars</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="87"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="91"/>
         <source>Downloadable Content</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="89"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="93"/>
         <source>Access the user created content downloadable from our website</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="109"/>
-        <source>Exit game</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="113"/>
-        <source>Manage videos recorded from game</source>
+        <source>Exit game</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="117"/>
+        <source>Manage videos recorded from game</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="121"/>
         <source>Open the Hedgewars online game manual in your web browser</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="120"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="124"/>
         <source>Edit game preferences</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1711,6 +1821,29 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="50"/>
+        <source>Connect to the selected server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="65"/>
+        <source>Update the list of servers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="71"/>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="82"/>
+        <source>Start private server</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagenetgame.cpp" line="52"/>
@@ -1785,7 +1918,7 @@
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="97"/>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="246"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="255"/>
         <source>Game</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1830,179 +1963,180 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="149"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="150"/>
         <source>Edit team</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="157"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="159"/>
         <source>Delete team</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="165"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="168"/>
         <source>You can&apos;t edit teams from team selection. Go back to main menu to add, edit or delete teams.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="172"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="175"/>
         <source>Schemes</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="183"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="186"/>
         <source>New scheme</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="190"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="194"/>
         <source>Edit scheme</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="197"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="202"/>
         <source>Delete scheme</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="205"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="211"/>
         <source>Weapons</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="216"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="222"/>
         <source>New weapon set</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="223"/>
-        <source>Edit weapon set</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="230"/>
+        <source>Edit weapon set</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="238"/>
         <source>Delete weapon set</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="283"/>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="806"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="292"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="829"/>
         <source>x</source>
         <extracomment>Multiplication sign, to be used between two numbers. Note the “x” is only a dummy character, we recommend to use “×” if your language permits it</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="415"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="437"/>
         <source>Frontend</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="433"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="455"/>
         <source>Custom colors</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="463"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="485"/>
         <source>Reset to default colors</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="476"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="498"/>
         <source>Game audio</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="522"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="544"/>
         <source>Frontend audio</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="545"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="567"/>
         <source>Account</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="571"/>
-        <source>Proxy settings</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="577"/>
-        <source>Proxy host</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="578"/>
-        <source>Proxy port</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="579"/>
-        <source>Proxy login</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="580"/>
-        <source>Proxy password</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="593"/>
+        <source>Proxy settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="599"/>
+        <source>Proxy host</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="600"/>
+        <source>Proxy port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="601"/>
+        <source>Proxy login</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="602"/>
+        <source>Proxy password</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="615"/>
         <source>No proxy</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="594"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="616"/>
         <source>System proxy settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="595"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="617"/>
         <source>Socks5 proxy</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="596"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="618"/>
         <source>HTTP proxy</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="631"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="653"/>
         <source>Miscellaneous</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="667"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="690"/>
         <source>MISSING LANGUAGE NAME [%1]</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="699"/>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="722"/>
         <source>Updates</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="712"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="735"/>
         <source>Check for updates</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="713"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="736"/>
         <source>Check now</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="726"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="749"/>
         <source>Video recording options</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="995"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="1018"/>
         <source>Can&apos;t delete last team</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="995"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="1018"/>
         <source>You can&apos;t delete the last team!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2025,12 +2159,12 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="151"/>
+        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="152"/>
         <source>Rename dialog</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="151"/>
+        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="152"/>
         <source>Enter new file name:</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2068,7 +2202,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="544"/>
+        <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="546"/>
         <source>%1 players online</source>
         <translation type="unfinished">
             <numerusform></numerusform>
@@ -2078,262 +2212,263 @@
 <context>
     <name>PageScheme</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="81"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="84"/>
         <source>Add an indestructible border around the terrain</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="97"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="100"/>
         <source>Lower gravity</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="149"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="152"/>
         <source>Assisted aiming with laser sight</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="129"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="132"/>
         <source>All hogs have a personal forcefield</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="121"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="124"/>
         <source>All (living) hedgehogs are fully restored at the end of turn</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="113"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="116"/>
         <source>Gain 80% of the damage you do back in health</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="117"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="120"/>
         <source>Share your opponents pain, share their damage</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="109"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="112"/>
         <source>Your hogs are unable to move, put your artillery skills to the test</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="153"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="156"/>
         <source>Order of play is random instead of in room order.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="169"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="172"/>
         <source>Play with a King. If he dies, your side dies.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="157"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="160"/>
         <source>Take turns placing your hedgehogs before the start of play.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="137"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="140"/>
         <source>Ammo is shared between all teams that share a colour.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="73"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="76"/>
         <source>Disable girders when generating random maps.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="77"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="80"/>
         <source>Disable land objects when generating random maps.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="125"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="128"/>
         <source>AI respawns on death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="145"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="148"/>
         <source>Attacking does not end your turn.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="141"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="144"/>
         <source>Weapons are reset to starting values each turn.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="133"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="136"/>
         <source>Each hedgehog has its own ammo. It does not share with the team.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="101"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="104"/>
         <source>You will not have to worry about wind anymore.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="105"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="108"/>
         <source>Wind will affect almost everything.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="165"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="168"/>
         <source>Teams in each clan take successive turns sharing their turn time.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="85"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="88"/>
         <source>Add an indestructible border along the bottom</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="89"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="92"/>
         <source>Select a hedgehog at the beginning of a turn</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="93"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="96"/>
         <source>Land can not be destroyed by most weapons.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="161"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="164"/>
         <source>Each clan starts in its own part of the terrain.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="175"/>
-        <source>Overall damage and knockback in percent</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="176"/>
-        <source>Turn time in seconds</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="177"/>
-        <source>Initial health of hedgehogs</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="178"/>
-        <source>How many rounds have to be played before Sudden Death begins</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="179"/>
-        <source>How much the water rises per turn while in Sudden Death. Set to 0 along with Sudden Death Health Decrease to disable Sudden Death.</source>
+        <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="180"/>
-        <source>How much health hedgehogs lose per turn while in Sudden Death, down to 1 health. Set to 0 along with Sudden Death Water Rise to disable Sudden Death.</source>
+        <source>Turn time in seconds</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="181"/>
-        <source>Maximum rope length in percent</source>
+        <source>Initial health of hedgehogs</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="182"/>
-        <source>Likelihood of a dropped crate being a health crate. All other crates will be weapon or utility crates.</source>
+        <source>How many rounds have to be played before Sudden Death begins</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="183"/>
-        <source>Likelihood of a crate dropping before a turn</source>
+        <source>How much the water rises per turn while in Sudden Death. Set to 0 along with Sudden Death Health Decrease to disable Sudden Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="184"/>
-        <source>Health bonus for collecting a health crate</source>
+        <source>How much health hedgehogs lose per turn while in Sudden Death, down to 1 health. Set to 0 along with Sudden Death Water Rise to disable Sudden Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="185"/>
-        <source>Detonation timer of mines. The random timer lies between 0 and 5 seconds. The timer of air mines will be a quarter of the mines timer.</source>
+        <source>Maximum rope length in percent</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="186"/>
-        <source>Average number of mines to be placed a medium-sized island map. This number will be scaled for other maps.</source>
+        <source>Likelihood of a dropped crate being a health crate. All other crates will be weapon or utility crates.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="187"/>
-        <source>Likelihood of a mine being a dud. Does not affect mines placed by hedgehogs.</source>
+        <source>Likelihood of a crate dropping before a turn</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="188"/>
-        <source>Average number of barrels to be placed a medium-sized island map. This number will be scaled for other maps.</source>
+        <source>Health bonus for collecting a health crate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="189"/>
-        <source>Average number of air mines to be placed a medium-sized island map. This number will be scaled for other maps.</source>
+        <source>Detonation timer of mines. The random timer lies between 0 and 5 seconds. The timer of air mines will be a quarter of the mines timer.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="190"/>
-        <source>Affects the left and right boundaries of the map</source>
+        <source>Average number of mines to be placed a medium-sized island map. This number will be scaled for other maps.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="191"/>
-        <source>Time you get after an attack</source>
+        <source>Likelihood of a mine being a dud. Does not affect mines placed by hedgehogs.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="192"/>
+        <source>Average number of barrels to be placed a medium-sized island map. This number will be scaled for other maps.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="193"/>
+        <source>Average number of air mines to be placed a medium-sized island map. This number will be scaled for other maps.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="194"/>
+        <source>Affects the left and right boundaries of the map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="195"/>
+        <source>Time you get after an attack</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="196"/>
         <source>Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="490"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="495"/>
         <source>None (Default)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="491"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="496"/>
         <source>Wrap (World wraps)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="492"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="497"/>
         <source>Bounce (Edges reflect)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="493"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="498"/>
         <source>Sea (Edges connect to sea)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="518"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="526"/>
         <source>Name of this scheme</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="533"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="541"/>
         <source>Copy</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="534"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="543"/>
         <source>New</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="535"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="545"/>
         <source>Delete</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="699"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="713"/>
         <source>%1 (%2)</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2346,17 +2481,17 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageselectweapon.cpp" line="49"/>
+        <location filename="../../../../QTfrontend/ui/page/pageselectweapon.cpp" line="50"/>
         <source>Default</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageselectweapon.cpp" line="52"/>
+        <location filename="../../../../QTfrontend/ui/page/pageselectweapon.cpp" line="54"/>
         <source>Copy</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageselectweapon.cpp" line="53"/>
+        <location filename="../../../../QTfrontend/ui/page/pageselectweapon.cpp" line="56"/>
         <source>Delete</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2380,7 +2515,7 @@
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagesingleplayer.cpp" line="51"/>
-        <source>Practice your skills in a range of training missions</source>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2397,48 +2532,81 @@
 <context>
     <name>PageTraining</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="91"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="101"/>
         <source>Pick the training to play</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="94"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="104"/>
         <source>Pick the challenge to play</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="97"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="107"/>
         <source>Pick the scenario to play</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="99"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="109"/>
         <source>Trainings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="100"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="110"/>
         <source>Challenges</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="101"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="111"/>
         <source>Scenarios</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="116"/>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="315"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="114"/>
+        <source>Team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="132"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="338"/>
         <source>Start fighting</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="324"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="344"/>
         <source>No description available</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="332"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="355"/>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="360"/>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="365"/>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="370"/>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="375"/>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="383"/>
         <source>Select a mission!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2446,51 +2614,51 @@
 <context>
     <name>PageVideos</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="115"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="116"/>
         <source>Name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="116"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="117"/>
         <source>Size</source>
         <translation type="unfinished"></translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="253"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="259"/>
         <source>%1 bytes</source>
         <translation type="unfinished">
             <numerusform></numerusform>
         </translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="328"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="336"/>
         <source>%1%</source>
         <extracomment>Video encoding progress. %1 = number</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="496"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="544"/>
         <source>(in progress...)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="500"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="548"/>
         <source>Date: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="501"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="549"/>
         <source>Size: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="707"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="763"/>
         <source>%1 (%2%) - %3</source>
         <extracomment>Video encoding list entry. %1 = file name, %2 = percent complete, %3 = video operation type (e.g. “encoding”)</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="710"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="766"/>
         <source>encoding</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2539,23 +2707,23 @@
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="282"/>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="946"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="954"/>
         <source>Ignore</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="286"/>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="958"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="966"/>
         <source>Add friend</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="941"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="949"/>
         <source>Unignore</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="953"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="961"/>
         <source>Remove friend</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2584,145 +2752,145 @@
     <name>QCheckBox</name>
     <message>
         <location filename="../../../../QTfrontend/ui/dialog/input_password.cpp" line="55"/>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="562"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="584"/>
         <source>Save password</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="705"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="728"/>
         <source>Check for updates at startup</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="421"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="443"/>
         <source>Fullscreen</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="371"/>
-        <source>Alternative damage show</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="360"/>
-        <source>Show FPS</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="377"/>
-        <source>Show ammo menu tooltips</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="392"/>
-        <source>Team</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="393"/>
+        <source>Alternative damage show</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="382"/>
+        <source>Show FPS</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="399"/>
+        <source>Show ammo menu tooltips</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="414"/>
+        <source>Team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="415"/>
         <source>Enable team tags by default</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="396"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="418"/>
         <source>Hog</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="397"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="419"/>
         <source>Enable hedgehog tags by default</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="400"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="422"/>
         <source>Health</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="401"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="423"/>
         <source>Enable health tags by default</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="404"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="426"/>
         <source>Translucent</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="405"/>
-        <source>Enable translucent tags by default</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="427"/>
+        <source>Enable translucent tags by default</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="449"/>
         <source>Visual effects</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="428"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="450"/>
         <source>Enable visual effects such as animated menu transitions and falling stars</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="501"/>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="526"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="523"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="548"/>
         <source>Sound</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="502"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="524"/>
         <source>In-game sound effects</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="508"/>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="531"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="530"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="553"/>
         <source>Music</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="509"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="531"/>
         <source>In-game music</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="516"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="538"/>
         <source>Dampen when losing focus</source>
         <extracomment>Checkbox text. If checked, the in-game audio volume is reduced (=dampened) when the game window loses its focus</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="517"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="539"/>
         <source>Reduce the game audio volume if the game window has lost its focus</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="527"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="549"/>
         <source>Frontend sound effects</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="532"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="554"/>
         <source>Frontend music</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="684"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="707"/>
         <source>Append date and time to record file name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="685"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="708"/>
         <source>If enabled, Hedgewars adds the date and time in the form &quot;YYYY-MM-DD_hh-mm&quot; for automatically created demos.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="768"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="791"/>
         <source>Record audio</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="818"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="841"/>
         <source>Use game resolution</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2730,127 +2898,127 @@
 <context>
     <name>QComboBox</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="138"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="144"/>
         <source>Human</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="142"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="148"/>
         <source>Computer (Level %1)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="400"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="406"/>
         <source>Community</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="645"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="667"/>
         <source>(System default)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="324"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="346"/>
         <source>Disabled</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="322"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="344"/>
         <source>Stereoscopy creates an illusion of depth when you wear 3D glasses.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="325"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="347"/>
         <source>Red/Cyan</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="326"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="348"/>
         <source>Cyan/Red</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="327"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="349"/>
         <source>Red/Blue</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="328"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="350"/>
         <source>Blue/Red</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="329"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="351"/>
         <source>Red/Green</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="330"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="352"/>
         <source>Green/Red</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="337"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="359"/>
         <source>Side-by-side</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="338"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="360"/>
         <source>Top-Bottom</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="828"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="851"/>
         <source>24 FPS</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="829"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="852"/>
         <source>25 FPS</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="830"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="853"/>
         <source>30 FPS</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="831"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="854"/>
         <source>50 FPS</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="832"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="855"/>
         <source>60 FPS</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="331"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="353"/>
         <source>Red/Cyan grayscale</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="332"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="354"/>
         <source>Cyan/Red grayscale</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="333"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="355"/>
         <source>Red/Blue grayscale</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="334"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="356"/>
         <source>Blue/Red grayscale</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="335"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="357"/>
         <source>Red/Green grayscale</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="336"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="358"/>
         <source>Green/Red grayscale</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2858,17 +3026,17 @@
 <context>
     <name>QGroupBox</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="62"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="65"/>
         <source>Team Members</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="109"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="112"/>
         <source>Team Settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="217"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="223"/>
         <source>Fort</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2878,27 +3046,27 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="50"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="53"/>
         <source>Game Modifiers</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="51"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="54"/>
         <source>Basic Settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="112"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="113"/>
         <source>Videos</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="148"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="152"/>
         <source>Description</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/teamselect.cpp" line="295"/>
+        <location filename="../../../../QTfrontend/ui/widget/teamselect.cpp" line="296"/>
         <source>Playing teams</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2923,27 +3091,27 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="113"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="116"/>
         <source>Name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="116"/>
-        <source>Player</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="119"/>
-        <source>Grave</source>
+        <source>Player</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="122"/>
-        <source>Flag</source>
+        <source>Grave</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="125"/>
+        <source>Flag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="128"/>
         <source>Voice</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2978,13 +3146,13 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="144"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="148"/>
         <source>This development build is &apos;work in progress&apos; and may not be compatible with other versions of the game, while some features might be broken or incomplete!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="146"/>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="152"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="150"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="156"/>
         <source>Tip: %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2999,188 +3167,194 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="156"/>
+        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="157"/>
         <source>Weapons</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="637"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="659"/>
         <source>Locale</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="551"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="573"/>
         <source>Nickname</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="318"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="340"/>
         <source>Stereoscopy</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="673"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="696"/>
         <source>This setting will be effective at next restart.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="794"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="817"/>
         <source>Resolution</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="839"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="862"/>
         <source>Bitrate (Kibit/s)</source>
         <extracomment>“Kibit/s” is the symbol for 1024 bits per second</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="304"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="313"/>
         <source>Quality</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="257"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="266"/>
         <source>Fullscreen</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="262"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="271"/>
         <source>Fullscreen Resolution</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="273"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="282"/>
         <source>Windowed Resolution</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="383"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="327"/>
+        <source>Zoom (%)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="405"/>
         <source>Displayed tags above hogs and translucent tags</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="484"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="506"/>
         <source>Initial sound volume</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="351"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="373"/>
         <source>FPS limit</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="195"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="199"/>
         <source>Damage Modifier</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="212"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="216"/>
         <source>Turn Time</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="229"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="233"/>
         <source>Initial Health</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="246"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="250"/>
         <source>Sudden Death Timeout</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="275"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="279"/>
         <source>Sudden Death Water Rise</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="292"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="296"/>
         <source>Sudden Death Health Decrease</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="309"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="313"/>
         <source>% Rope Length</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="326"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="330"/>
         <source>Crate Drops</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="342"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="346"/>
         <source>% Health Crates</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="359"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="363"/>
         <source>Health in Crates</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="376"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="380"/>
         <source>Mines Time</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="393"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="397"/>
         <source>Mines</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="410"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="414"/>
         <source>% Dud Mines</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="427"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="431"/>
         <source>Barrels</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="461"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="466"/>
         <source>% Retreat Time</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="444"/>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="448"/>
         <source>Air Mines</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="478"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="483"/>
         <source>World Edge</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="499"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="504"/>
         <source>Script parameter</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="515"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="520"/>
         <source>Scheme Name:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="735"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="758"/>
         <source>Format</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="756"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="779"/>
         <source>Audio codec</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="782"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="805"/>
         <source>Video codec</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="824"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="847"/>
         <source>Framerate</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3198,27 +3372,27 @@
 <context>
     <name>QLineEdit</name>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1054"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1088"/>
         <source>unnamed</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1060"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1094"/>
         <source>unnamed (%1)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="412"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="418"/>
         <source>hedgehog %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="556"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="578"/>
         <source>anonymous</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/team.cpp" line="44"/>
+        <location filename="../../../../QTfrontend/team.cpp" line="45"/>
         <source>Hedgehog %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3234,58 +3408,69 @@
 <context>
     <name>QMessageBox</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="491"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="503"/>
         <source>Teams - Are you sure?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="492"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="504"/>
         <source>Do you really want to delete the team &apos;%1&apos;?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="658"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="672"/>
         <source>Teams - Name already taken</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="659"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="673"/>
         <source>The team name &apos;%1&apos; is already taken, so your team has been renamed to &apos;%2&apos;.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1092"/>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="643"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1126"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="655"/>
         <source>Cannot delete default scheme &apos;%1&apos;!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1118"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1152"/>
         <source>Please select a record from the list</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1213"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1247"/>
         <source>Hedgewars - Nick not registered</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1623"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1659"/>
         <source>Unable to start server</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1685"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1721"/>
         <source>The connection to the server is lost.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2299"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1736"/>
+        <source>Server redirection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1737"/>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2495"/>
         <source>Not all players are ready</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2300"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2496"/>
         <source>Are you sure you want to start this game?
 Not all players are ready.</source>
         <translation type="unfinished"></translation>
@@ -3297,50 +3482,50 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="341"/>
+        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="342"/>
         <source>System Information Preview</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="356"/>
-        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="367"/>
+        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="357"/>
+        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="368"/>
         <source>Failed to generate captcha</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="384"/>
+        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="385"/>
         <source>Failed to download captcha</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="448"/>
+        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="450"/>
         <source>Please fill out all fields. Email is optional.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2186"/>
-        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="418"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2381"/>
+        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="419"/>
         <source>Hedgewars - Success</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2187"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2382"/>
         <source>All file associations have been set</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2192"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2388"/>
         <source>File association failed.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="118"/>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="128"/>
         <location filename="../../../../QTfrontend/ui/page/pagenetgame.cpp" line="257"/>
         <source>Netgame - Error</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="119"/>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="129"/>
         <source>Please select a server from the list</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3360,54 +3545,54 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="531"/>
+        <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="532"/>
         <source>Room Name - Are you sure?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="532"/>
+        <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="533"/>
         <source>The game you are trying to join has started.
 Do you still want to join the room?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="642"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="654"/>
         <source>Schemes - Warning</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="651"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="664"/>
         <source>Schemes - Are you sure?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="652"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="665"/>
         <source>Do you really want to delete the game scheme &apos;%1&apos;?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="712"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="726"/>
         <source>Schemes - Name already taken</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="713"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="728"/>
         <source>A scheme with the name &apos;%1&apos; already exists. Your scheme has been renamed to &apos;%2&apos;.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="587"/>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="616"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="635"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="665"/>
         <source>Videos - Are you sure?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="588"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="636"/>
         <source>Do you really want to delete the video &apos;%1&apos;?</source>
         <translation type="unfinished"></translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="617"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="666"/>
         <source>Do you really want to remove %1 file(s)?</source>
         <translation type="unfinished">
             <numerusform></numerusform>
@@ -3415,8 +3600,8 @@
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/widget/drawmapwidget.cpp" line="155"/>
-        <location filename="../../../../QTfrontend/ui/widget/drawmapwidget.cpp" line="175"/>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1224"/>
+        <location filename="../../../../QTfrontend/ui/widget/drawmapwidget.cpp" line="176"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1252"/>
         <source>File error</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3426,59 +3611,59 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/drawmapwidget.cpp" line="176"/>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1225"/>
+        <location filename="../../../../QTfrontend/ui/widget/drawmapwidget.cpp" line="177"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1253"/>
         <source>Cannot open &apos;%1&apos; for reading</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="139"/>
-        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="166"/>
-        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="183"/>
-        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="198"/>
-        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="401"/>
+        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="167"/>
+        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="185"/>
+        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="201"/>
+        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="404"/>
         <source>Error</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="140"/>
-        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="184"/>
+        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="186"/>
         <source>Please select a file from the list.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="167"/>
+        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="168"/>
         <source>Cannot rename file to %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="199"/>
+        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="202"/>
         <source>Cannot delete file %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="306"/>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="351"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="312"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="358"/>
         <source>Weapons - Warning</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="307"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="313"/>
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="352"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="359"/>
         <source>Cannot delete default weapon set &apos;%1&apos;!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="361"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="369"/>
         <source>Weapons - Are you sure?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="362"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="370"/>
         <source>Do you really want to delete the weapon set &apos;%1&apos;?</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3493,19 +3678,19 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="468"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="537"/>
         <source>Welcome to Hedgewars</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="469"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="538"/>
         <source>Welcome to Hedgewars!
 
 You seem to be new around here. Would you like to play some training missions first to learn the basics of Hedgewars?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="402"/>
+        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="405"/>
         <source>Cannot use the weapon scheme &apos;%1&apos;!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3513,8 +3698,8 @@
 <context>
     <name>QObject</name>
     <message>
-        <location filename="../../../../QTfrontend/campaign.cpp" line="139"/>
-        <location filename="../../../../QTfrontend/campaign.cpp" line="161"/>
+        <location filename="../../../../QTfrontend/campaign.cpp" line="153"/>
+        <location filename="../../../../QTfrontend/campaign.cpp" line="175"/>
         <source>No description available</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3538,7 +3723,7 @@
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/dialog/input_ip.cpp" line="58"/>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="490"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="538"/>
         <source>Cancel</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3548,17 +3733,17 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="58"/>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="64"/>
         <source>Update</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="63"/>
-        <source>Specify</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="73"/>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="70"/>
+        <source>Specify address</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="81"/>
         <source>Start server</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3585,7 +3770,7 @@
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagecampaign.cpp" line="96"/>
         <location filename="../../../../QTfrontend/ui/page/pagenetserver.cpp" line="99"/>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="115"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="131"/>
         <source>Start</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3595,7 +3780,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="691"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="714"/>
         <source>Associate file extensions</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3611,8 +3796,8 @@
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="48"/>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="182"/>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="490"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="186"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="538"/>
         <source>Delete</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3622,37 +3807,37 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="853"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="876"/>
         <source>Set default options</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="854"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="877"/>
         <source>Restore default coding parameters</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="134"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="138"/>
         <source>Open videos directory</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="135"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="139"/>
         <source>Open the video directory in your system</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="178"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="182"/>
         <source>Play</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="180"/>
-        <source>Play this video</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="184"/>
+        <source>Play this video</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="188"/>
         <source>Delete this video</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3660,7 +3845,7 @@
 <context>
     <name>QSpinBox</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="847"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="870"/>
         <source>Specify the bitrate of recorded videos as a multiple of 1024 bits per second</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3796,42 +3981,42 @@
 <context>
     <name>SelWeaponWidget</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="170"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="173"/>
         <source>Weapon set</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="171"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="174"/>
         <source>Probabilities</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="172"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="175"/>
         <source>Ammo in boxes</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="173"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="176"/>
         <source>Delays</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="378"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="387"/>
         <source>New</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="383"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="392"/>
         <source>New (%1)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="424"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="433"/>
         <source>Copy of %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="429"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="438"/>
         <source>Copy of %1 (%2)</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3839,18 +4024,18 @@
 <context>
     <name>TCPBase</name>
     <message>
-        <location filename="../../../../QTfrontend/net/tcpBase.cpp" line="122"/>
+        <location filename="../../../../QTfrontend/net/tcpBase.cpp" line="125"/>
         <source>Unable to start server at %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/tcpBase.cpp" line="223"/>
+        <location filename="../../../../QTfrontend/net/tcpBase.cpp" line="238"/>
         <source>Unable to run engine at %1
 Error code: %2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/tcpBase.cpp" line="242"/>
+        <location filename="../../../../QTfrontend/net/tcpBase.cpp" line="257"/>
         <source>The game engine died unexpectedly!
 (exit code %1)
 
@@ -3863,7 +4048,7 @@
 <context>
     <name>TeamSelWidget</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/teamselect.cpp" line="300"/>
+        <location filename="../../../../QTfrontend/ui/widget/teamselect.cpp" line="301"/>
         <source>At least two teams are required to play!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3895,25 +4080,25 @@
     <name>binds</name>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="23"/>
-        <location filename="../../../../QTfrontend/binds.cpp" line="51"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="57"/>
         <source>up</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="24"/>
-        <location filename="../../../../QTfrontend/binds.cpp" line="52"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="58"/>
         <source>left</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="25"/>
-        <location filename="../../../../QTfrontend/binds.cpp" line="53"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="59"/>
         <source>right</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="26"/>
-        <location filename="../../../../QTfrontend/binds.cpp" line="54"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="60"/>
         <source>down</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3923,213 +4108,273 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="30"/>
+        <source>long jump</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="31"/>
+        <source>high jump</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="54"/>
+        <source>attack</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="55"/>
+        <source>put</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="33"/>
+        <source>switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="28"/>
-        <source>long jump</source>
+        <source>stand still on slippery land</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="29"/>
-        <source>high jump</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="48"/>
-        <source>attack</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="49"/>
-        <source>put</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="30"/>
-        <source>switch</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="31"/>
-        <source>ammo menu</source>
+        <source>change direction without moving</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="32"/>
-        <source>slot 1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="33"/>
-        <source>slot 2</source>
+        <source>backwards jump</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="34"/>
-        <source>slot 3</source>
+        <source>switch backwards</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="35"/>
-        <source>slot 4</source>
+        <source>ammo menu</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="36"/>
-        <source>slot 5</source>
+        <source>slot 1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="37"/>
-        <source>slot 6</source>
+        <source>slot 2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="38"/>
-        <source>slot 7</source>
+        <source>slot 3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="39"/>
-        <source>slot 8</source>
+        <source>slot 4</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="40"/>
-        <source>slot 9</source>
+        <source>slot 5</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="41"/>
-        <source>slot 10</source>
+        <source>slot 6</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="42"/>
-        <source>timer 1 sec</source>
+        <source>slot 7</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="43"/>
-        <source>timer 2 sec</source>
+        <source>slot 8</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="44"/>
-        <source>timer 3 sec</source>
+        <source>slot 9</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="45"/>
-        <source>timer 4 sec</source>
+        <source>slot 10</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="46"/>
-        <source>timer 5 sec</source>
+        <source>unselect weapon</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="47"/>
-        <source>change timer</source>
+        <source>timer 1 sec</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="48"/>
+        <source>timer 2 sec</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="49"/>
+        <source>timer 3 sec</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="50"/>
-        <source>autocam / find hedgehog</source>
+        <source>timer 4 sec</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="51"/>
+        <source>timer 5 sec</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="52"/>
+        <source>change timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="53"/>
+        <source>change bounciness</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="56"/>
-        <source>zoom in</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="57"/>
-        <source>zoom out</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="58"/>
-        <source>reset zoom</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="59"/>
-        <source>chat</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="60"/>
-        <source>clan chat</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="61"/>
-        <source>chat history</source>
+        <source>autocam / find hedgehog</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="62"/>
-        <source>pause / auto skip</source>
+        <source>zoom in</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="63"/>
-        <source>quit</source>
+        <source>zoom out</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="64"/>
-        <source>confirmation</source>
+        <source>reset zoom to start value</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="65"/>
-        <source>volume down</source>
+        <source>set zoom to 100%</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="66"/>
-        <source>volume up</source>
+        <source>chat</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="67"/>
-        <source>mute audio</source>
+        <source>clan chat</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="68"/>
-        <source>change mode</source>
+        <source>chat history</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="69"/>
-        <source>capture</source>
+        <source>pause / auto skip</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="70"/>
-        <source>speed up replay</source>
+        <source>quit</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="71"/>
-        <source>show mission information</source>
+        <source>confirmation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="72"/>
+        <source>volume down</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="73"/>
-        <source>toggle team bars</source>
-        <extracomment>This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen</extracomment>
+        <source>volume up</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="74"/>
-        <source>toggle hedgehog tags</source>
+        <source>mute audio</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="75"/>
+        <source>change mode</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="76"/>
+        <source>screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="77"/>
+        <source>save map as image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="78"/>
+        <source>speed up replay</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="79"/>
+        <source>show mission information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="80"/>
+        <source>show object information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="82"/>
+        <source>toggle team bars</source>
+        <extracomment>This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="83"/>
+        <source>toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="84"/>
+        <source>change hedgehog tag types</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="85"/>
+        <source>toggle hedgehog tag translucency</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="87"/>
+        <source>toggle HUD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="89"/>
         <source>record</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4142,40 +4387,93 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="31"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="35"/>
         <source>Weapons</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="50"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="56"/>
         <source>Camera</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="59"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="66"/>
         <source>Miscellaneous</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="28"/>
+        <source>hold down precise</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="29"/>
+        <source>precise + left/right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="32"/>
+        <source>high jump (twice)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="34"/>
+        <source>precise + switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="53"/>
+        <source>precise + timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="65"/>
+        <source>precise + reset zoom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="77"/>
+        <source>precise + screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="84"/>
+        <source>precise + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="85"/>
+        <source>switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="87"/>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="28"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="30"/>
         <source>Traverse gaps and obstacles by jumping:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="48"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="54"/>
         <source>Fire your selected weapon or trigger an utility item:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="49"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="55"/>
         <source>Pick a weapon or a target location under the cursor:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="30"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="33"/>
         <source>Switch your currently active hog (if possible):</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4185,67 +4483,67 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="31"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="35"/>
         <source>Pick a weapon or utility item:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="42"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="47"/>
         <source>Set the timer on bombs and timed weapons:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="50"/>
-        <source>Toggle automatic camera / refocus on active hedgehog:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="51"/>
-        <source>Move the cursor or camera without using the mouse:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="56"/>
-        <source>Modify the camera&apos;s zoom level:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="59"/>
-        <source>Talk to your clan or all participants:</source>
+        <source>Toggle automatic camera / refocus on active hedgehog:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="57"/>
+        <source>Move the cursor or camera without using the mouse:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="62"/>
-        <source>Pause, continue or leave your game:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="65"/>
-        <source>Modify the game&apos;s volume while playing:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="68"/>
-        <source>Toggle fullscreen mode:</source>
+        <source>Modify the camera&apos;s zoom level:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="66"/>
+        <source>Talk to your clan or all participants:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="69"/>
-        <source>Take a screenshot:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="70"/>
-        <source>Demo replay:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="71"/>
-        <source>Heads-up display:</source>
+        <source>Pause, continue or leave your game:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="72"/>
+        <source>Modify the game&apos;s volume while playing:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="75"/>
+        <source>Toggle fullscreen mode:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="76"/>
+        <source>Take a screenshot:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="78"/>
+        <source>Demo replay:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="79"/>
+        <source>Heads-up display:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="89"/>
         <source>Record video:</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4253,442 +4551,1034 @@
 <context>
     <name>binds (keys)</name>
     <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="25"/>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="26"/>
         <source>Mouse: Left button</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="26"/>
-        <source>Mouse: Middle button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="27"/>
-        <source>Mouse: Right button</source>
+        <source>Mouse: Middle button</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="28"/>
-        <source>Mouse: Wheel up</source>
+        <source>Mouse: Right button</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="29"/>
-        <source>Mouse: Wheel down</source>
+        <source>Mouse: X1 button </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="30"/>
-        <source>Backspace</source>
+        <source>Mouse: X2 button</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="31"/>
-        <source>Tab</source>
+        <source>Mouse: Wheel up</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="32"/>
-        <source>Clear</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="33"/>
-        <source>Return</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="34"/>
-        <source>Pause</source>
+        <source>Mouse: Wheel down</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="35"/>
-        <source>Escape</source>
+        <source>Backspace</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="36"/>
+        <source>Tab</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="37"/>
+        <source>Clear</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="38"/>
+        <source>Return</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="39"/>
+        <source>Pause</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="40"/>
+        <source>Escape</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="41"/>
         <source>Space</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="109"/>
+        <source>Delete</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="104"/>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="188"/>
+        <source>Up</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="105"/>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="189"/>
+        <source>Down</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="106"/>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="191"/>
+        <source>Right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="107"/>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="190"/>
+        <source>Left</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="108"/>
+        <source>Insert</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="110"/>
+        <source>Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="111"/>
+        <source>End</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="88"/>
+        <source>Keypad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="89"/>
+        <source>Keypad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="90"/>
+        <source>Keypad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="91"/>
+        <source>Keypad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="92"/>
+        <source>Keypad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="93"/>
+        <source>Keypad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="94"/>
+        <source>Keypad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="95"/>
+        <source>Keypad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="96"/>
+        <source>Keypad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="97"/>
+        <source>Keypad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="98"/>
+        <source>Keypad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="99"/>
+        <source>Keypad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="100"/>
-        <source>Delete</source>
+        <source>Keypad *</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="101"/>
-        <source>Numpad 0</source>
+        <source>Keypad -</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="102"/>
-        <source>Numpad 1</source>
+        <source>Keypad +</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="103"/>
-        <source>Numpad 2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="104"/>
-        <source>Numpad 3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="105"/>
-        <source>Numpad 4</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="106"/>
-        <source>Numpad 5</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="107"/>
-        <source>Numpad 6</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="108"/>
-        <source>Numpad 7</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="109"/>
-        <source>Numpad 8</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="110"/>
-        <source>Numpad 9</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="111"/>
-        <source>Numpad .</source>
+        <source>Keypad Enter</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="112"/>
-        <source>Numpad /</source>
+        <source>PageUp</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="113"/>
-        <source>Numpad *</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="114"/>
-        <source>Numpad -</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="115"/>
-        <source>Numpad +</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="116"/>
-        <source>Enter</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="117"/>
-        <source>Equals</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="118"/>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="195"/>
-        <source>Up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="119"/>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="196"/>
-        <source>Down</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="120"/>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="198"/>
-        <source>Right</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="121"/>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="197"/>
-        <source>Left</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="122"/>
-        <source>Insert</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="123"/>
-        <source>Home</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="124"/>
-        <source>End</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="125"/>
-        <source>Page up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="126"/>
-        <source>Page down</source>
+        <source>PageDown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="129"/>
+        <source>Numlock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="130"/>
+        <source>CapsLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="131"/>
+        <source>ScrollLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="132"/>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="133"/>
+        <source>Right Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="134"/>
+        <source>Left Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="135"/>
+        <source>Right Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="136"/>
+        <source>Left Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="137"/>
+        <source>Right Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="138"/>
+        <source>Left Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="140"/>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="142"/>
-        <source>Num lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="143"/>
-        <source>Caps lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="144"/>
-        <source>Scroll lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="145"/>
-        <source>Right shift</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="146"/>
-        <source>Left shift</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="147"/>
-        <source>Right ctrl</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="148"/>
-        <source>Left ctrl</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="149"/>
-        <source>Right alt</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="150"/>
-        <source>Left alt</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="151"/>
-        <source>Right meta</source>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="152"/>
-        <source>Left meta</source>
+        <source>A button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="153"/>
+        <source>B button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="154"/>
+        <source>X button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="155"/>
+        <source>Y button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="156"/>
+        <source>LB button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="157"/>
+        <source>RB button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="158"/>
+        <source>Back button</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="159"/>
-        <source>A button</source>
+        <source>Start button</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="160"/>
-        <source>B button</source>
+        <source>Left stick</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="161"/>
-        <source>X button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="162"/>
-        <source>Y button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="163"/>
-        <source>LB button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="164"/>
-        <source>RB button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="165"/>
-        <source>Back button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="166"/>
-        <source>Start button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="167"/>
-        <source>Left stick</source>
+        <source>Right stick</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="168"/>
-        <source>Right stick</source>
+        <source>Left stick (Right)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="169"/>
+        <source>Left stick (Left)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="170"/>
+        <source>Left stick (Down)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="171"/>
+        <source>Left stick (Up)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="172"/>
+        <source>Left trigger</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="173"/>
+        <source>Right trigger</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="174"/>
+        <source>Right stick (Down)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="175"/>
-        <source>Left stick (Right)</source>
+        <source>Right stick (Up)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="176"/>
-        <source>Left stick (Left)</source>
+        <source>Right stick (Right)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="177"/>
-        <source>Left stick (Down)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="178"/>
-        <source>Left stick (Up)</source>
+        <source>Right stick (Left)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="179"/>
-        <source>Left trigger</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="180"/>
-        <source>Right trigger</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="181"/>
-        <source>Right stick (Down)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="182"/>
-        <source>Right stick (Up)</source>
+        <source>D-pad</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="183"/>
-        <source>Right stick (Right)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="184"/>
-        <source>Right stick (Left)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="186"/>
-        <source>D-pad</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="190"/>
         <source>Axis %1 %2</source>
         <extracomment>Game controller axis direction. %1 = axis number, %2 = direction</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="192"/>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="185"/>
         <source>Button %1</source>
         <extracomment>Game controller button. %1 = button number</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="187"/>
+        <source>D-pad %1 %2</source>
+        <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="194"/>
-        <source>D-pad %1 %2</source>
-        <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/util/DataManager.cpp" line="162"/>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/util/DataManager.cpp" line="183"/>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/util/DataManager.cpp" line="190"/>
         <source>Keyboard</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
+    <name>credits</name>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="2"/>
+        <source>Programming</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="3"/>
+        <source>Game engine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="4"/>
+        <source>Creator</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="5"/>
+        <source>Many engine improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="6"/>
+        <source>Gamepad and Lua integration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="7"/>
+        <source>Campaign support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="8"/>
+        <source>Theme customization improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="9"/>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="10"/>
+        <source>Video recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="11"/>
+        <source>Other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="12"/>
+        <source>Map generation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="13"/>
+        <source>Core map generators</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="14"/>
+        <source>Perlin maps and other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="15"/>
+        <source>Maze maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="16"/>
+        <source>Weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="17"/>
+        <source>Most core weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="18"/>
+        <source>Air mine, rubber, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="19"/>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="20"/>
+        <source>Freezer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="21"/>
+        <source>Mine number and time game settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="22"/>
+        <source>Frontend / main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="23"/>
+        <source>Many frontend improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="24"/>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="25"/>
+        <source>Login dialogs, other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="26"/>
+        <source>Missions and styles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="27"/>
+        <source>A Classic Fairytale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="28"/>
+        <source>A Space Adventure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="29"/>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="30"/>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="31"/>
+        <source>Some styles and missions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="32"/>
+        <source>Battalion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="33"/>
+        <source>Continental supplies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="34"/>
+        <source>Teamwork 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="35"/>
+        <source>Climb Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="36"/>
+        <source>Portal Mind Challenge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="37"/>
+        <source>Game server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="38"/>
+        <source>Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="39"/>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="40"/>
+        <source>Android port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="41"/>
+        <source>Android netplay, portability abstraction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="42"/>
+        <source>WebGL port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="43"/>
+        <source>iPhone/iPad ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="44"/>
+        <source>Graphics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="45"/>
+        <source>General</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="46"/>
+        <source>Themes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="47"/>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="48"/>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="49"/>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="50"/>
+        <source>Hoggywood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="51"/>
+        <source>Cave, Olympics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="52"/>
+        <source>Fruit, Cake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="53"/>
+        <source>Art</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="54"/>
+        <source>Beach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="55"/>
+        <source>Brick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="56"/>
+        <source>Hell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="57"/>
+        <source>Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="58"/>
+        <source>Sheep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="59"/>
+        <source>Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="60"/>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="61"/>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="62"/>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="63"/>
+        <source>Castle, PirateFlag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="64"/>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="65"/>
+        <source>Battlefield</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="66"/>
+        <source>CTF_Blizzard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="67"/>
+        <source>Cheese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="68"/>
+        <source>ClimbHome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="69"/>
+        <source>Lonely_Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="70"/>
+        <source>Octorama</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="71"/>
+        <source>portal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="72"/>
+        <source>Ruler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="73"/>
+        <source>Sticks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="74"/>
+        <source>Forts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="75"/>
+        <source>EvilChicken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="76"/>
+        <source>Olympic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="77"/>
+        <source>Tank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="78"/>
+        <source>Snail</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="79"/>
+        <source>SteelTower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="80"/>
+        <source>Hats, graves, other</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="81"/>
+        <source>See CREDITS text file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="82"/>
+        <source>Sounds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="83"/>
+        <source>Hedgehogs voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="84"/>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="85"/>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="86"/>
+        <source>Music</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="87"/>
+        <source>City, Rock, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="88"/>
+        <source>Compost</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="89"/>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="90"/>
+        <source>Fruit, Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="91"/>
+        <source>Nature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="92"/>
+        <source>olympics_sd</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="93"/>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="94"/>
+        <source>Translations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="95"/>
+        <source>Brazilian Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="96"/>
+        <source>Bulgarian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="97"/>
+        <source>Czech</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="98"/>
+        <source>Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="99"/>
+        <source>Finnish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="100"/>
+        <source>French</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="101"/>
+        <source>German</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="102"/>
+        <source>Greek</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="103"/>
+        <source>Italian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="104"/>
+        <source>Japanese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="105"/>
+        <source>Korean</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="106"/>
+        <source>Lithuanian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="107"/>
+        <source>Polish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="108"/>
+        <source>Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="109"/>
+        <source>Russian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="110"/>
+        <source>Scottish Gaelic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="111"/>
+        <source>Slovak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="112"/>
+        <source>Spanish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="113"/>
+        <source>Swedish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="114"/>
+        <source>Ukrainian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="115"/>
+        <source>Special thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="116"/>
+        <source>Project founder</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>server</name>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="102"/>
-        <source>New voting started</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="104"/>
-        <source>kick</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="105"/>
-        <source>map</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="106"/>
-        <source>pause</source>
+        <source>New voting started</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="107"/>
+        <source>kick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="108"/>
+        <source>map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="109"/>
+        <source>pause</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="110"/>
         <source>new seed</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="74"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="76"/>
         <source>/maxteams: specify number from 2 to 8</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="47"/>
-        <source>&apos;Registered only&apos; state toggled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="48"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="50"/>
         <source>Super power activated.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="46"/>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="862"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="49"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="870"/>
         <source>Unknown command or invalid parameters. Say &apos;/help&apos; in chat for a list of commands.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="77"/>
-        <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="2"/>
         <source>Nickname is already in use</source>
         <translation type="unfinished"></translation>
@@ -4750,431 +5640,456 @@
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="14"/>
-        <source>/info &lt;player&gt;: Show info about player</source>
+        <source>This server no longer allows unregistered players to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="15"/>
-        <source>/me &lt;message&gt;: Chat action, e.g. &apos;/me eats pizza&apos; becomes &apos;* Player eats pizza&apos;</source>
+        <source>This server now allows unregistered players to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="16"/>
-        <source>/rnd: Flip a virtual coin and reply with &apos;heads&apos; or &apos;tails&apos;</source>
+        <source>/info &lt;player&gt;: Show info about player</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="17"/>
-        <source>/rnd [A] [B] [C] [...]: Reply with a random word from the given list</source>
+        <source>/me &lt;message&gt;: Chat action, e.g. &apos;/me eats pizza&apos; becomes &apos;* Player eats pizza&apos;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="18"/>
-        <source>/watch &lt;id&gt;: Watch a demo stored on the server with the given ID</source>
+        <source>/rnd: Flip a virtual coin and reply with &apos;heads&apos; or &apos;tails&apos;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="19"/>
-        <source>/quit: Quit the server</source>
+        <source>/rnd [A] [B] [C] [...]: Reply with a random word from the given list</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="20"/>
-        <source>/help: Show chat command help</source>
+        <source>/watch &lt;id&gt;: Watch a demo stored on the server with the given ID</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="21"/>
-        <source>/callvote [arguments]: Start a vote</source>
+        <source>/quit: Quit the server</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="22"/>
-        <source>/vote &lt;yes/no&gt;: Vote &apos;yes&apos; or &apos;no&apos; for active vote</source>
+        <source>/help: Show chat command help</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="23"/>
+        <source>/callvote [arguments]: Start a vote</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="24"/>
-        <source>/delegate &lt;player&gt;: Surrender room control to player</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="25"/>
-        <source>/maxteams &lt;N&gt;: Limit maximum number of teams to N</source>
+        <source>/vote &lt;yes/no&gt;: Vote &apos;yes&apos; or &apos;no&apos; for active vote</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="26"/>
-        <source>/global &lt;message&gt;: Send global chat message which can be seen by everyone on the server</source>
+        <source>/delegate &lt;player&gt;: Surrender room control to player</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="27"/>
-        <source>/registered_only: Toggle &apos;registered only&apos; state. If enabled, only registered players can join server</source>
+        <source>/maxteams &lt;N&gt;: Limit maximum number of teams to N</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="28"/>
-        <source>/super_power: Activate your super power. With it you can enter any room and are protected from kicking. Expires when you leave server</source>
+        <source>/global &lt;message&gt;: Send global chat message which can be seen by everyone on the server</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="29"/>
-        <source>/stats: Query server stats</source>
+        <source>/registered_only: Toggle &apos;registered only&apos; state. If enabled, only registered players can join server</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="30"/>
-        <source>/force &lt;yes/no&gt;: Force vote result for active vote</source>
+        <source>/super_power: Activate your super power. With it you can enter any room and are protected from kicking. Expires when you leave server</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="31"/>
-        <source>/fix: Force this room to stay open when it is empty</source>
+        <source>/stats: Query server stats</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="32"/>
+        <source>/force &lt;yes/no&gt;: Force vote result for active vote</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="33"/>
+        <source>/fix: Force this room to stay open when it is empty</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="34"/>
         <source>/unfix: Undo the /fix command</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="37"/>
-        <source>List of lobby chat commands:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="38"/>
-        <source>List of room chat commands:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="39"/>
+        <source>List of lobby chat commands:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="40"/>
+        <source>List of room chat commands:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="41"/>
         <source>Commands for server admins only:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="44"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="46"/>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="47"/>
         <source>This command is only available in the lobby.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="45"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="48"/>
         <source>This command is only available in rooms.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="49"/>
-        <source>room</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="50"/>
-        <source>lobby</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="51"/>
-        <source>(playing)</source>
+        <source>room</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="52"/>
-        <source>(spectating)</source>
+        <source>lobby</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="53"/>
-        <source>Player is not online.</source>
+        <source>(playing)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="54"/>
-        <source>The game can&apos;t be started with less than two clans!</source>
+        <source>(spectating)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="55"/>
-        <source>Empty config entry.</source>
+        <source>Player is not online.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="56"/>
-        <source>Access denied.</source>
+        <source>The game can&apos;t be started with less than two clans!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="57"/>
-        <source>You&apos;re not the room master!</source>
+        <source>Empty config entry.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="58"/>
-        <source>Corrupted hedgehogs info!</source>
+        <source>Access denied.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="59"/>
-        <source>Too many teams!</source>
+        <source>You&apos;re not the room master!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="60"/>
-        <source>Too many hedgehogs!</source>
+        <source>Corrupted hedgehogs info!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="61"/>
-        <source>There&apos;s already a team with same name in the list.</source>
+        <source>Too many teams!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="62"/>
-        <source>Joining not possible: Round is in progress.</source>
+        <source>Too many hedgehogs!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="63"/>
-        <source>This room currently does not allow adding new teams.</source>
+        <source>There&apos;s already a team with same name in the list.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="64"/>
-        <source>Error: The team you tried to remove does not exist.</source>
+        <source>Joining not possible: Round is in progress.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="65"/>
-        <source>You can&apos;t remove a team you don&apos;t own.</source>
+        <source>This room currently does not allow adding new teams.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="66"/>
-        <source>Illegal room name! The room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
+        <source>Error: The team you tried to remove does not exist.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="67"/>
-        <source>A room with the same name already exists.</source>
+        <source>You can&apos;t remove a team you don&apos;t own.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="68"/>
-        <source>You can&apos;t kick yourself!</source>
+        <source>Illegal room name! The room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="69"/>
-        <source>You can&apos;t kick the only other player!</source>
+        <source>A room with the same name already exists.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="70"/>
-        <source>The player is not in your room.</source>
+        <source>You can&apos;t kick yourself!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="71"/>
-        <source>This player is protected from being kicked.</source>
+        <source>You can&apos;t kick the only other player!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="72"/>
-        <source>You&apos;re not the room master or a server admin!</source>
+        <source>The player is not in your room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="73"/>
-        <source>You&apos;re already the room master.</source>
+        <source>This player is protected from being kicked.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="74"/>
+        <source>You&apos;re not the room master or a server admin!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="75"/>
+        <source>You&apos;re already the room master.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="77"/>
         <source>Greeting message cleared.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="76"/>
-        <source>Greeting message set.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="78"/>
-        <source>/callvote kick: You need to specify a nickname.</source>
+        <source>Greeting message set.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="79"/>
-        <source>/callvote kick: This is only allowed in rooms without a room master.</source>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="81"/>
+        <source>/callvote kick: You need to specify a nickname.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="80"/>
-        <source>/callvote kick: No such user!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="81"/>
-        <source>/callvote map: No maps available.</source>
+        <source>/callvote kick: This is only allowed in rooms without a room master.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="82"/>
-        <source>/callvote map: No such map!</source>
+        <source>/callvote kick: No such user!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="83"/>
-        <source>/callvote pause: No game in progress!</source>
+        <source>/callvote map: No maps available.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="84"/>
-        <source>/callvote hedgehogs: Specify number from 1 to 8.</source>
+        <source>/callvote map: No such map!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="85"/>
-        <source>/force: Please use &apos;yes&apos; or &apos;no&apos;.</source>
+        <source>/callvote pause: No game in progress!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="86"/>
-        <source>/vote: Please use &apos;yes&apos; or &apos;no&apos;.</source>
+        <source>/callvote hedgehogs: Specify number from 1 to 8.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="87"/>
-        <source>Illegal room name! A room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
+        <source>/force: Please use &apos;yes&apos; or &apos;no&apos;.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="88"/>
-        <source>No such room.</source>
+        <source>/vote: Please use &apos;yes&apos; or &apos;no&apos;.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="89"/>
-        <source>Room version incompatible to your Hedgewars version!</source>
+        <source>Illegal room name! A room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="90"/>
-        <source>Access denied. This room currently doesn&apos;t allow joining.</source>
+        <source>No such room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="91"/>
-        <source>Access denied. This room is for registered users only.</source>
+        <source>Room version incompatible to your Hedgewars version!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="92"/>
-        <source>You are banned from this room.</source>
+        <source>Access denied. This room currently doesn&apos;t allow joining.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="93"/>
-        <source>Nickname already provided.</source>
+        <source>Access denied. This room is for registered users only.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="94"/>
-        <source>Illegal nickname! Nicknames must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
+        <source>You are banned from this room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="95"/>
-        <source>Protocol already known.</source>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="96"/>
-        <source>Bad number.</source>
+        <source>Nickname already provided.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="97"/>
-        <source>There&apos;s no voting going on.</source>
+        <source>Illegal nickname! Nicknames must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="98"/>
-        <source>You already have voted.</source>
+        <source>Protocol already known.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="99"/>
-        <source>Your vote has been counted.</source>
+        <source>Bad number.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="100"/>
-        <source>Voting closed.</source>
+        <source>There&apos;s no voting going on.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="101"/>
-        <source>Pause toggled.</source>
+        <source>You already have voted.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="102"/>
+        <source>Your vote has been counted.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="103"/>
+        <source>Voting closed.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="104"/>
+        <source>Pause toggled.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="106"/>
         <source>Voting expired.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="108"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="111"/>
         <source>hedgehogs per team: </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="109"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="112"/>
         <source>You&apos;re the new room master!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="40"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="42"/>
         <source>Warning! Chat flood protection activated</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="23"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="25"/>
         <source>/greeting [message]: Set or clear greeting message to be shown to players who join the room</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="33"/>
-        <source>/save &lt;config ID&gt; &lt;config name&gt;: Add current room configuration as votable choice for /callvote map</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="34"/>
-        <source>/delete &lt;config ID&gt;: Delete a votable room configuration</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="35"/>
-        <source>/saveroom &lt;file name&gt;: Save all votable room configurations (and the greeting) of this room into a file</source>
+        <source>/save &lt;config ID&gt; &lt;config name&gt;: Add current room configuration as votable choice for /callvote map</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="36"/>
+        <source>/delete &lt;config ID&gt;: Delete a votable room configuration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="37"/>
+        <source>/saveroom &lt;file name&gt;: Save all votable room configurations (and the greeting) of this room into a file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="38"/>
         <source>/loadroom &lt;file name&gt;: Load votable room configurations (and greeting) from a file</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="41"/>
-        <source>Excess flood</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="42"/>
-        <source>Game messages flood detected - 1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="43"/>
+        <source>Excess flood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="44"/>
+        <source>Game messages flood detected - 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="45"/>
         <source>Warning! Joins flood protection activated</source>
         <translation type="unfinished"></translation>
     </message>
--- a/share/hedgewars/Data/Locale/hedgewars_nl.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_nl.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -78,6 +78,49 @@
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>AbstractPage</name>
@@ -305,21 +348,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -522,10 +569,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Guest</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Room password</source>
         <translation type="unfinished"></translation>
     </message>
@@ -774,6 +817,18 @@
         <source>Click to edit</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
@@ -875,6 +930,20 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>HatButton</name>
     <message>
         <source>Change hat (%1)</source>
@@ -906,6 +975,10 @@
         <source>Category</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>LibavInteraction</name>
@@ -946,6 +1019,7 @@
     </message>
     <message>
         <source>Record: %1</source>
+        <extracomment>As in ‘recording’</extracomment>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -1314,6 +1388,29 @@
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
 </context>
 <context>
     <name>PageInGame</name>
@@ -1408,6 +1505,25 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <source>Edit game preferences</source>
@@ -1630,6 +1746,7 @@
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -1826,6 +1943,7 @@
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -1947,10 +2065,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Practice your skills in a range of training missions</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Watch recorded demos</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1958,6 +2072,10 @@
         <source>Load a previously saved game</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -1997,6 +2115,33 @@
         <source>Scenarios</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageVideos</name>
@@ -2585,6 +2730,7 @@
     </message>
     <message>
         <source>% Retreat Time</source>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2600,6 +2746,10 @@
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QLineEdit</name>
@@ -2844,6 +2994,15 @@
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Server redirection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
@@ -2879,10 +3038,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Specify</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Start</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2958,6 +3113,10 @@
         <source>Start private server</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
@@ -3271,10 +3430,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>capture</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>quit</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3287,10 +3442,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>reset zoom</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>long jump</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3343,6 +3494,62 @@
         <source>clan chat</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>binds (categories)</name>
@@ -3364,6 +3571,49 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -3497,74 +3747,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Numpad 0</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 4</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 5</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 6</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 7</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 8</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 9</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad .</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad /</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad *</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad -</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad +</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Enter</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Equals</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Up</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3593,58 +3775,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Page up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Page down</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Num lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Caps lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Scroll lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right shift</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left shift</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right ctrl</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left ctrl</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right alt</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left alt</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right meta</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left meta</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>A button</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3743,6 +3873,609 @@
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -3815,10 +4548,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>The game can&apos;t be started with less than two clans!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4111,10 +4840,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>&apos;Registered only&apos; state toggled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Super power activated.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4178,5 +4903,25 @@
         <source>This command is only available in rooms.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 </TS>
--- a/share/hedgewars/Data/Locale/hedgewars_pl.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_pl.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -78,6 +78,49 @@
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</translation>
     </message>
+    <message>
+        <source>Credits</source>
+        <translation>Twórcy</translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation>Inni ludzie</translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation>%1 (alias %2)</translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation>%1 &amp;lt;%2&amp;gt;</translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation>%1: %2</translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation>%1: %2 &amp;lt;%3&amp;gt;</translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation>Reszta twórców</translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation>Lista reszty twórców znajduje się w pliku CREDITS.</translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation>Nieznany kompilator: %1</translation>
+    </message>
 </context>
 <context>
     <name>AbstractPage</name>
@@ -336,21 +379,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation>Użycie</translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation>OPCJA</translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
         <translation>CONNECTSTRING</translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation>Opcje</translation>
     </message>
     <message>
@@ -576,7 +623,7 @@
     </message>
     <message>
         <source>Guest</source>
-        <translation>Gość</translation>
+        <translation type="vanished">Gość</translation>
     </message>
     <message>
         <source>Room password</source>
@@ -885,6 +932,18 @@
         <source>Click to edit</source>
         <translation>Kliknij aby edytować</translation>
     </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation>Skaluj rozmiar narysowanej mapy</translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation>Wczytaj</translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation>Edytuj</translation>
+    </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
@@ -1018,6 +1077,27 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation>Wystąpił fatalny BŁĄD podczas przetwarzania nagrania wideo! Wideo nie mogło zostać zapisane.
+
+Jako obejście, możesz spróbować zresetować ustawienia nagrywania wideo Hedgewars do domyślnych.
+
+By zgłosić ten błąd, kliknij przycisk &quot;Twoja opinia&quot; w menu głównym!
+
+Ostatnia wiadomość silnika:
+%1</translation>
+    </message>
+</context>
+<context>
     <name>HWUploadVideoDialog</name>
     <message>
         <source>Upload video</source>
@@ -1067,6 +1147,10 @@
         <source>Category</source>
         <translation>Kategoria</translation>
     </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation>Ostrzeżenie: Ten sam klawisz jest przypisany wielokrotnie!</translation>
+    </message>
 </context>
 <context>
     <name>LibavInteraction</name>
@@ -1133,6 +1217,7 @@
     </message>
     <message>
         <source>Record: %1</source>
+        <extracomment>As in ‘recording’</extracomment>
         <translation>Rekord: %1</translation>
     </message>
 </context>
@@ -1522,6 +1607,32 @@
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation>Ponieważ każdy miał taki sam kolor klanu, nie było powodu do walki. I tak jeże żyły w pokoju długo i szczęśliwie.</translation>
     </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation>
+            <numerusform>(%1 punkty/ów)</numerusform>
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation>
+            <numerusform>(%L1 sekund(y))</numerusform>
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation>
+            <numerusform>(%1 skrzyń)</numerusform>
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
 </context>
 <context>
     <name>PageInGame</name>
@@ -1616,6 +1727,25 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation>Połącz z wybranym serwerem</translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation>Zaktualizuj listę serwerów</translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation>Podaj adres i numer portu znanego serwera i połącz się bezpośrednio</translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation>Uruchom prywatny serwer</translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <source>Control</source>
@@ -1842,6 +1972,7 @@
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
         <translation>BRAKUJĄCA NAZWA JĘZYKA [%1]</translation>
     </message>
     <message>
@@ -2091,6 +2222,7 @@
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation>Ogólne obrażenia i odrzut w procentach</translation>
     </message>
     <message>
@@ -2213,7 +2345,7 @@
     </message>
     <message>
         <source>Practice your skills in a range of training missions</source>
-        <translation>Sprawdź swoje umiejętności przwechodząc kilka misji</translation>
+        <translation type="vanished">Sprawdź swoje umiejętności przwechodząc kilka misji</translation>
     </message>
     <message>
         <source>Watch recorded demos</source>
@@ -2223,6 +2355,10 @@
         <source>Load a previously saved game</source>
         <translation>Wczytaj zapisaną grę</translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation>Misje dla jednego gracza: Naucz się jak grać przez trening, poćwicz swoje zdolności w wyzwaniach lub spróbuj ukończyć cele w scenariuszach.</translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -2266,6 +2402,33 @@
         <source>Scenarios</source>
         <translation>Scenariusze</translation>
     </message>
+    <message>
+        <source>Team</source>
+        <translation>Drużyna</translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation>Najlepszy wynik drużyny: %1</translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation>Najgorszy wynik drużyny: %1</translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation>Najlepsza celność drużyny: %1%</translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation>Najlepszy czas drużyny: %L1s</translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation>Najgorszy czas drużyny: %L1s</translation>
+    </message>
 </context>
 <context>
     <name>PageVideos</name>
@@ -2965,6 +3128,7 @@
     </message>
     <message>
         <source>% Retreat Time</source>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
         <translation>% czasu odwrotu</translation>
     </message>
     <message>
@@ -2980,6 +3144,10 @@
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
         <translation>Ładowanie&lt;br&gt;CAPTCHA...</translation>
     </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation>Przybliżenie (%)</translation>
+    </message>
 </context>
 <context>
     <name>QLineEdit</name>
@@ -3331,6 +3499,16 @@
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation>Schemat broni z nazwą &apos;%1&apos; już istnieje. Zmiany dokonane w schemacie broni zostały odrzucone.</translation>
     </message>
+    <message>
+        <source>Server redirection</source>
+        <translation>Przekierowanie serwera</translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation>Ten serwer obsługuje bezpecznie połączenia na porcie %1.
+Czy zechcesz połączyć się ponownie bezpiecznie?</translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
@@ -3371,7 +3549,7 @@
     </message>
     <message>
         <source>Specify</source>
-        <translation>Ustawienia własne</translation>
+        <translation type="vanished">Ustawienia własne</translation>
     </message>
     <message>
         <source>Start</source>
@@ -3465,6 +3643,10 @@
         <source>Upload this video to your YouTube account</source>
         <translation type="vanished">Prześlij to wideo na swoje konto YouTube</translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation>Podaj adres</translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
@@ -3802,7 +3984,7 @@
     </message>
     <message>
         <source>capture</source>
-        <translation>zrzut ekranu</translation>
+        <translation type="vanished">zrzut ekranu</translation>
     </message>
     <message>
         <source>quit</source>
@@ -3834,7 +4016,7 @@
     </message>
     <message>
         <source>reset zoom</source>
-        <translation>zeruj przybliżenie</translation>
+        <translation type="vanished">zeruj przybliżenie</translation>
     </message>
     <message>
         <source>long jump</source>
@@ -3897,6 +4079,62 @@
         <source>clan chat</source>
         <translation>czat klanu</translation>
     </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation>schowaj broń</translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation>stój nieruchomo na śliskim terenie</translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation>zmień kierunek bez poruszania się</translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation>zmień w przeciwną stronę</translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation>zmień sprężystość</translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation>zresetuj przybliżenie do wartości początkowej</translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation>ustaw przybliżenie na 100%</translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation>zapisz mapę jako obrazek</translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation>pokaż informacje o obiekcie</translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation>zmień tym tagów jeży</translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation>zmień przezroczystość tagów jeży</translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation>przełącz HUD</translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation>skok w tył</translation>
+    </message>
+    <message>
+        <source>screenshot</source>
+        <translation>zrzut ekranu</translation>
+    </message>
 </context>
 <context>
     <name>binds (categories)</name>
@@ -3918,6 +4156,49 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation>przytrzymaj precyzję</translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation>precyzja + lewo/prawo</translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation>precyzja + zmiana</translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation>precyzja + zapalnik</translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation>precyzja + resetuj przybliżenie</translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation>precyzja + przełącz tagi jeży</translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation>zmiana + przełącz tagi jeży</translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation>precyzja + zmiana + przełącz tagi jeży</translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation>wysoki skok (dwukrotnie)</translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation>precyzja + zrzut ekranu</translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -4068,7 +4349,7 @@
     </message>
     <message>
         <source>Equals</source>
-        <translation>Znak równości</translation>
+        <translation type="vanished">Znak równości</translation>
     </message>
     <message>
         <source>Up</source>
@@ -4088,35 +4369,35 @@
     </message>
     <message>
         <source>Right shift</source>
-        <translation>Prawy shift</translation>
+        <translation type="vanished">Prawy shift</translation>
     </message>
     <message>
         <source>Left shift</source>
-        <translation>Lewy Shift</translation>
+        <translation type="vanished">Lewy Shift</translation>
     </message>
     <message>
         <source>Right ctrl</source>
-        <translation>Prawy ctrl</translation>
+        <translation type="vanished">Prawy ctrl</translation>
     </message>
     <message>
         <source>Left ctrl</source>
-        <translation>Lewy ctrl</translation>
+        <translation type="vanished">Lewy ctrl</translation>
     </message>
     <message>
         <source>Right alt</source>
-        <translation>Prawy Alt</translation>
+        <translation type="vanished">Prawy Alt</translation>
     </message>
     <message>
         <source>Left alt</source>
-        <translation>Lewy Alt</translation>
+        <translation type="vanished">Lewy Alt</translation>
     </message>
     <message>
         <source>Right meta</source>
-        <translation>Prawy kl. WIN</translation>
+        <translation type="vanished">Prawy kl. WIN</translation>
     </message>
     <message>
         <source>Left meta</source>
-        <translation>Lewy kl. WIN</translation>
+        <translation type="vanished">Lewy kl. WIN</translation>
     </message>
     <message>
         <source>Backspace</source>
@@ -4144,67 +4425,67 @@
     </message>
     <message>
         <source>Numpad 0</source>
-        <translation>Kl. Num. 0</translation>
+        <translation type="vanished">Kl. Num. 0</translation>
     </message>
     <message>
         <source>Numpad 1</source>
-        <translation>Kl. Num. 1</translation>
+        <translation type="vanished">Kl. Num. 1</translation>
     </message>
     <message>
         <source>Numpad 2</source>
-        <translation>Kl. Num. 2</translation>
+        <translation type="vanished">Kl. Num. 2</translation>
     </message>
     <message>
         <source>Numpad 3</source>
-        <translation>Kl. Num. 3</translation>
+        <translation type="vanished">Kl. Num. 3</translation>
     </message>
     <message>
         <source>Numpad 4</source>
-        <translation>Kl. Num. 4</translation>
+        <translation type="vanished">Kl. Num. 4</translation>
     </message>
     <message>
         <source>Numpad 5</source>
-        <translation>Kl. Num. 5</translation>
+        <translation type="vanished">Kl. Num. 5</translation>
     </message>
     <message>
         <source>Numpad 6</source>
-        <translation>Kl. Num. 6</translation>
+        <translation type="vanished">Kl. Num. 6</translation>
     </message>
     <message>
         <source>Numpad 7</source>
-        <translation>Kl. Num. 7</translation>
+        <translation type="vanished">Kl. Num. 7</translation>
     </message>
     <message>
         <source>Numpad 8</source>
-        <translation>Kl. Num. 8</translation>
+        <translation type="vanished">Kl. Num. 8</translation>
     </message>
     <message>
         <source>Numpad 9</source>
-        <translation>Kl. Num. 9</translation>
+        <translation type="vanished">Kl. Num. 9</translation>
     </message>
     <message>
         <source>Numpad .</source>
-        <translation>Kl. Num. .</translation>
+        <translation type="vanished">Kl. Num. .</translation>
     </message>
     <message>
         <source>Numpad /</source>
-        <translation>Kl. Num. /</translation>
+        <translation type="vanished">Kl. Num. /</translation>
     </message>
     <message>
         <source>Numpad *</source>
-        <translation>Kl. Num. *</translation>
+        <translation type="vanished">Kl. Num. *</translation>
     </message>
     <message>
         <source>Numpad -</source>
-        <translation>Kl. Num. -</translation>
+        <translation type="vanished">Kl. Num. -</translation>
     </message>
     <message>
         <source>Numpad +</source>
-        <translation>Kl. Num.+</translation>
+        <translation type="vanished">Kl. Num.+</translation>
     </message>
     <message>
         <source>Enter</source>
-        <translation>Enter</translation>
+        <translation type="vanished">Enter</translation>
     </message>
     <message>
         <source>Insert</source>
@@ -4220,23 +4501,23 @@
     </message>
     <message>
         <source>Page up</source>
-        <translation>Page Up</translation>
+        <translation type="vanished">Page Up</translation>
     </message>
     <message>
         <source>Page down</source>
-        <translation>Page down</translation>
+        <translation type="vanished">Page down</translation>
     </message>
     <message>
         <source>Num lock</source>
-        <translation>Num Lock</translation>
+        <translation type="vanished">Num Lock</translation>
     </message>
     <message>
         <source>Caps lock</source>
-        <translation>Caps lock</translation>
+        <translation type="vanished">Caps lock</translation>
     </message>
     <message>
         <source>Scroll lock</source>
-        <translation>Scroll lock</translation>
+        <translation type="vanished">Scroll lock</translation>
     </message>
     <message>
         <source>A button</source>
@@ -4341,6 +4622,609 @@
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
         <translation>D-pad %1 %2</translation>
     </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation>(Nie przypisane)</translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
+        <translation>Mysz: przycisk X1</translation>
+    </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation>Mysz: przycisk X2</translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation>0 numeryczne</translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation>1 numeryczne</translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation>2 numeryczne</translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation>3 numeryczne</translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation>4 numeryczne</translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation>5 numeryczne</translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation>6 numeryczne</translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation>7 numeryczne</translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation>8 numeryczne</translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation>9 numeryczne</translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation>. numeryczna</translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation>/ numeryczny</translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation> numeryczna</translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation>- numeryczny</translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation>+ numeryczny</translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation>Enter numeryczny</translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation>PageUp</translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation>PageDown</translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation>NumLock</translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation>CapsLock</translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation>ScrollLock</translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation>Prawy Shift</translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation>Lewy Shift</translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation>Prawy Ctrl</translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation>Lewy Ctrl</translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation>Prawy Alt</translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation>Lewy Alt</translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation>Prawe GUI</translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation>Lewe GUI</translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation>(QWERTY)</translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation>Menu</translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation>Programowanie</translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation>Silnik gry</translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation>Twórca</translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation>Wiele ulepszeń silnika</translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation>Integracja gamepadów i LUA</translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation>Obsługa kampanii</translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation>Więcej opcji dostosowania motywów</translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation>Usprawnienia przy Pas2C i GLES2</translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation>Nagrywanie wideo</translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation>Inne usprawnienia</translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation>Generowanie mapy</translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation>Główne generatory mapy</translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation>Mapy Perlina i inne ulepszenia</translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation>Mapy labiryntów</translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation>Bronie</translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation>Większość głównych broni</translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation>Mina powietrzna, guma, inne</translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation>Wiertnicza rakieta, pistolet na kulki, zdalnie sterowany samolot</translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation>Zamrażarka</translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation>Czas min i czasowe ustawienia gry</translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation>Frontend / menu główne</translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation>Wiele ulepszeń frontendu</translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation>Sterowanie, opinie, mapy i interfejsy kapeluszy</translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation>Dialogi logowania; inne usprawnienia</translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation>Misje i style</translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation>Klasyczna Bajka</translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation>Kosmiczna Przygoda</translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation>Stworzył Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation>Trening, wyzwania ćwiczebne na czas i celność; Bazookowe pole bitwy, Mackowy terror, Wielka zbrojownia; poprawki błędów i konserwacja</translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation>Jakieś style i misje</translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation>Battalion</translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation>Continental supplies</translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation>Praca zespołowa 2</translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation>Wspinaczka do domu</translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation>Łamigłówka z portalami</translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation>Serwer gry</translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation>Porty</translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation>Port na macOS/iPhone; konwersja na OpenGL ES</translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation>Gra sieciowa na Androidzie; abstrakcja przenośności</translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation>Port WebGL</translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation>porty iPhone/iPad</translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation>Grafika</translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation>Ogólne</translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation>Motywy</translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation>Nature, Snow, City, Castle, Halloween, Island</translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation>Bamboo, EarthRise, BambooPlinko</translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation>Golf, Hoggywood, Stage</translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation>Hoggywood</translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation>Cave, Olympics</translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation>Fruit, Cake</translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation>Art</translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation>Beach</translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation>Brick</translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation>Hell</translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation>Jungle</translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation>Sheep</translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation>Mapy</translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation>Castle, PirateFlag</translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation>ShoppaKing, TrophyRace</translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation>Battlefield</translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation>CTF_Blizzard</translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation>Cheese</translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation>ClimbHome</translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation>Lonely_Island</translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation>Octorama</translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation>portal</translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation>Ruler</translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation>Sticks</translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation>Forty</translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation>EvilChicken</translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation>Olympic</translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation>Tank</translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation>Snail</translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation>SteelTower</translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation>Kapelusze, nagrobki, inne</translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation>Zobacz plik CREDITS</translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation>Dźwięki</translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation>Głos jeży</translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation>Głosy Default_pl, Russian_pl</translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation>Różni autorzy z www.freesound.org (zobacz plik CREDITS)</translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation>Muzyka</translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation>City, Rock, inne</translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation>Compost</translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation>EarthRise, oriental, Pirate, snow</translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation>Fruit, Jungle</translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation>Nature</translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation>olympics_sd</translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation>sdmusic (Hitman [edycja sheepluvy])</translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation>Tłumaczenia</translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation>Brazylijski portugalski</translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation>Bułgarski</translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation>Czeski</translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation>Chiński</translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation>Fiński</translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation>Francuski</translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation>Niemiecki</translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation>Grecki</translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation>Włoski</translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation>Japński</translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation>Koreański</translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation>Litwijski</translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation>Polski</translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation>Portugalski</translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation>Rosyjski</translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation>Szkocki gaelicki</translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation>Słowacki</translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation>Hiszpański</translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation>Szwedzki</translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation>Ukraiński</translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation>Specjalne podziękowania</translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation>Fundator projektu</translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -4538,7 +5422,7 @@
     </message>
     <message>
         <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation>Dostępne komendy callvote: kick &lt;nick&gt;, map &lt;nazwa&gt;, pauza, newseed, hedgehogs</translation>
+        <translation type="vanished">Dostępne komendy callvote: kick &lt;nick&gt;, map &lt;nazwa&gt;, pauza, newseed, hedgehogs</translation>
     </message>
     <message>
         <source>callvote kick: specify nickname</source>
@@ -4882,7 +5766,7 @@
     </message>
     <message>
         <source>&apos;Registered only&apos; state toggled.</source>
-        <translation>Stan &apos;tylko zarejestrowani&apos; przełączony.</translation>
+        <translation type="vanished">Stan &apos;tylko zarejestrowani&apos; przełączony.</translation>
     </message>
     <message>
         <source>Super power activated.</source>
@@ -4948,5 +5832,25 @@
         <source>This command is only available in rooms.</source>
         <translation>Ta komenda jest dostępna tylko w pokojach.</translation>
     </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation>Ten serwer nie pozwala już na dołączanie niezarejestrowanych graczy</translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation>Ten serwer teraz pozwala na dołączanie niezarejestrowanych graczy</translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation>Dostępne komendy callvote: hedgehogs &lt;numer&gt;, pause, newseed, map &lt;nazwa&gt;, kick &lt;gracz&gt;</translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation>Potwierdź restart serwera używając &quot;&apos;/restart_server yes&quot;.</translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation>Ostrzeżenie! Ochrona przez floodem zmiany nazwy pokoju aktywowana</translation>
+    </message>
 </context>
 </TS>
--- a/share/hedgewars/Data/Locale/hedgewars_pt_BR.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_pt_BR.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -78,6 +78,49 @@
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>AbstractPage</name>
@@ -324,21 +367,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -559,10 +606,6 @@
         <translation type="vanished">Esta página exige uma conexão com a Internet.</translation>
     </message>
     <message>
-        <source>Guest</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Room password</source>
         <translation type="unfinished"></translation>
     </message>
@@ -812,6 +855,18 @@
         <source>Click to edit</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation type="unfinished">Carregar</translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
@@ -932,6 +987,20 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>HWUploadVideoDialog</name>
     <message>
         <source>Upload video</source>
@@ -981,6 +1050,10 @@
         <source>Category</source>
         <translation>Categoria</translation>
     </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>LibavInteraction</name>
@@ -1034,6 +1107,7 @@
     </message>
     <message>
         <source>Record: %1</source>
+        <extracomment>As in ‘recording’</extracomment>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -1420,6 +1494,29 @@
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
 </context>
 <context>
     <name>PageInGame</name>
@@ -1514,6 +1611,25 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation type="unfinished">Iniciar servidor privado</translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <source>Control</source>
@@ -1740,6 +1856,7 @@
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -1988,6 +2105,7 @@
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2110,7 +2228,7 @@
     </message>
     <message>
         <source>Practice your skills in a range of training missions</source>
-        <translation>Pratique suas perícias em missões de treinamento</translation>
+        <translation type="vanished">Pratique suas perícias em missões de treinamento</translation>
     </message>
     <message>
         <source>Watch recorded demos</source>
@@ -2120,6 +2238,10 @@
         <source>Load a previously saved game</source>
         <translation>Carregue um jogo salvo</translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -2163,6 +2285,33 @@
         <source>Scenarios</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageVideos</name>
@@ -2855,6 +3004,7 @@
     </message>
     <message>
         <source>% Retreat Time</source>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2870,6 +3020,10 @@
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QLineEdit</name>
@@ -3178,6 +3332,15 @@
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Server redirection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
@@ -3218,7 +3381,7 @@
     </message>
     <message>
         <source>Specify</source>
-        <translation>Especificar</translation>
+        <translation type="vanished">Especificar</translation>
     </message>
     <message>
         <source>Start</source>
@@ -3308,6 +3471,10 @@
         <source>Start private server</source>
         <translation>Iniciar servidor privado</translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
@@ -3630,7 +3797,7 @@
     </message>
     <message>
         <source>capture</source>
-        <translation>capturar</translation>
+        <translation type="vanished">capturar</translation>
     </message>
     <message>
         <source>quit</source>
@@ -3662,7 +3829,7 @@
     </message>
     <message>
         <source>reset zoom</source>
-        <translation>zoom padrão</translation>
+        <translation type="vanished">zoom padrão</translation>
     </message>
     <message>
         <source>long jump</source>
@@ -3721,6 +3888,62 @@
         <source>clan chat</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>binds (categories)</name>
@@ -3742,6 +3965,49 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -3916,71 +4182,71 @@
     </message>
     <message>
         <source>Numpad 0</source>
-        <translation>Numpad 0</translation>
+        <translation type="vanished">Numpad 0</translation>
     </message>
     <message>
         <source>Numpad 1</source>
-        <translation>Numpad 1</translation>
+        <translation type="vanished">Numpad 1</translation>
     </message>
     <message>
         <source>Numpad 2</source>
-        <translation>Numpad 2</translation>
+        <translation type="vanished">Numpad 2</translation>
     </message>
     <message>
         <source>Numpad 3</source>
-        <translation>Numpad 3</translation>
+        <translation type="vanished">Numpad 3</translation>
     </message>
     <message>
         <source>Numpad 4</source>
-        <translation>Numpad 4</translation>
+        <translation type="vanished">Numpad 4</translation>
     </message>
     <message>
         <source>Numpad 5</source>
-        <translation>Numpad 5</translation>
+        <translation type="vanished">Numpad 5</translation>
     </message>
     <message>
         <source>Numpad 6</source>
-        <translation>Numpad 6</translation>
+        <translation type="vanished">Numpad 6</translation>
     </message>
     <message>
         <source>Numpad 7</source>
-        <translation>Numpad 7</translation>
+        <translation type="vanished">Numpad 7</translation>
     </message>
     <message>
         <source>Numpad 8</source>
-        <translation>Numpad 8</translation>
+        <translation type="vanished">Numpad 8</translation>
     </message>
     <message>
         <source>Numpad 9</source>
-        <translation>Numpad 9</translation>
+        <translation type="vanished">Numpad 9</translation>
     </message>
     <message>
         <source>Numpad .</source>
-        <translation>Numpad .</translation>
+        <translation type="vanished">Numpad .</translation>
     </message>
     <message>
         <source>Numpad /</source>
-        <translation>Numpad /</translation>
+        <translation type="vanished">Numpad /</translation>
     </message>
     <message>
         <source>Numpad *</source>
-        <translation>Numpad *</translation>
+        <translation type="vanished">Numpad *</translation>
     </message>
     <message>
         <source>Numpad -</source>
-        <translation>Numpad -</translation>
+        <translation type="vanished">Numpad -</translation>
     </message>
     <message>
         <source>Numpad +</source>
-        <translation>Numpad +</translation>
+        <translation type="vanished">Numpad +</translation>
     </message>
     <message>
         <source>Enter</source>
-        <translation>Numpad Enter</translation>
+        <translation type="vanished">Numpad Enter</translation>
     </message>
     <message>
         <source>Equals</source>
-        <translation>Igual</translation>
+        <translation type="vanished">Igual</translation>
     </message>
     <message>
         <source>Up</source>
@@ -4012,55 +4278,55 @@
     </message>
     <message>
         <source>Page up</source>
-        <translation>Page up</translation>
+        <translation type="vanished">Page up</translation>
     </message>
     <message>
         <source>Page down</source>
-        <translation>Page down</translation>
+        <translation type="vanished">Page down</translation>
     </message>
     <message>
         <source>Num lock</source>
-        <translation>Num lock</translation>
+        <translation type="vanished">Num lock</translation>
     </message>
     <message>
         <source>Caps lock</source>
-        <translation>Caps lock</translation>
+        <translation type="vanished">Caps lock</translation>
     </message>
     <message>
         <source>Scroll lock</source>
-        <translation>Scroll lock</translation>
+        <translation type="vanished">Scroll lock</translation>
     </message>
     <message>
         <source>Right shift</source>
-        <translation>Shift direito</translation>
+        <translation type="vanished">Shift direito</translation>
     </message>
     <message>
         <source>Left shift</source>
-        <translation>Shift esquerdo</translation>
+        <translation type="vanished">Shift esquerdo</translation>
     </message>
     <message>
         <source>Right ctrl</source>
-        <translation>Control direito</translation>
+        <translation type="vanished">Control direito</translation>
     </message>
     <message>
         <source>Left ctrl</source>
-        <translation>Control esquerdo</translation>
+        <translation type="vanished">Control esquerdo</translation>
     </message>
     <message>
         <source>Right alt</source>
-        <translation>Alt direito</translation>
+        <translation type="vanished">Alt direito</translation>
     </message>
     <message>
         <source>Left alt</source>
-        <translation>Alt esquerdo</translation>
+        <translation type="vanished">Alt esquerdo</translation>
     </message>
     <message>
         <source>Right meta</source>
-        <translation>Meta direito (Windows)</translation>
+        <translation type="vanished">Meta direito (Windows)</translation>
     </message>
     <message>
         <source>Left meta</source>
-        <translation>Meta esquerdo (Menus)</translation>
+        <translation type="vanished">Meta esquerdo (Menus)</translation>
     </message>
     <message>
         <source>A button</source>
@@ -4167,6 +4433,609 @@
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation type="unfinished">Armas</translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation type="unfinished">Gráficos</translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation type="unfinished">Geral</translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation type="unfinished">Música</translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -4239,10 +5108,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>The game can&apos;t be started with less than two clans!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4535,10 +5400,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>&apos;Registered only&apos; state toggled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Super power activated.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4602,5 +5463,25 @@
         <source>This command is only available in rooms.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 </TS>
--- a/share/hedgewars/Data/Locale/hedgewars_pt_PT.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_pt_PT.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -78,6 +78,49 @@
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>AbstractPage</name>
@@ -328,21 +371,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -563,10 +610,6 @@
         <translation type="vanished">Esta página requer ligação à internet</translation>
     </message>
     <message>
-        <source>Guest</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Room password</source>
         <translation type="unfinished"></translation>
     </message>
@@ -819,6 +862,18 @@
         <source>Click to edit</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation type="unfinished">Carregar</translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
@@ -939,6 +994,20 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>HWUploadVideoDialog</name>
     <message>
         <source>Upload video</source>
@@ -988,6 +1057,10 @@
         <source>Category</source>
         <translation>Categoria</translation>
     </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>LibavInteraction</name>
@@ -1042,6 +1115,7 @@
     </message>
     <message>
         <source>Record: %1</source>
+        <extracomment>As in ‘recording’</extracomment>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -1428,6 +1502,29 @@
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
 </context>
 <context>
     <name>PageInGame</name>
@@ -1522,6 +1619,25 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation type="unfinished">Iniciar o servidor privado</translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <source>Edit game preferences</source>
@@ -1744,6 +1860,7 @@
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -1972,6 +2089,7 @@
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2094,7 +2212,7 @@
     </message>
     <message>
         <source>Practice your skills in a range of training missions</source>
-        <translation>Pratica as tuas habilidades numa variedade de missões de treino</translation>
+        <translation type="vanished">Pratica as tuas habilidades numa variedade de missões de treino</translation>
     </message>
     <message>
         <source>Watch recorded demos</source>
@@ -2104,6 +2222,10 @@
         <source>Load a previously saved game</source>
         <translation>Carrega um jogo gravado anteriormente</translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -2147,6 +2269,33 @@
         <source>Scenarios</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageVideos</name>
@@ -2827,6 +2976,7 @@
     </message>
     <message>
         <source>% Retreat Time</source>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2842,6 +2992,10 @@
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QLineEdit</name>
@@ -3182,6 +3336,15 @@
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Server redirection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
@@ -3218,7 +3381,7 @@
     </message>
     <message>
         <source>Specify</source>
-        <translation>Especificar</translation>
+        <translation type="vanished">Especificar</translation>
     </message>
     <message>
         <source>Start</source>
@@ -3312,6 +3475,10 @@
         <source>Start private server</source>
         <translation>Iniciar o servidor privado</translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
@@ -3650,7 +3817,7 @@
     </message>
     <message>
         <source>capture</source>
-        <translation>capturar</translation>
+        <translation type="vanished">capturar</translation>
     </message>
     <message>
         <source>quit</source>
@@ -3666,7 +3833,7 @@
     </message>
     <message>
         <source>reset zoom</source>
-        <translation>reiniciar zoom</translation>
+        <translation type="vanished">reiniciar zoom</translation>
     </message>
     <message>
         <source>long jump</source>
@@ -3725,6 +3892,62 @@
         <source>clan chat</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>binds (categories)</name>
@@ -3746,6 +3969,49 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -3920,71 +4186,71 @@
     </message>
     <message>
         <source>Numpad 0</source>
-        <translation>Numpad 0</translation>
+        <translation type="vanished">Numpad 0</translation>
     </message>
     <message>
         <source>Numpad 1</source>
-        <translation>Numpad 1</translation>
+        <translation type="vanished">Numpad 1</translation>
     </message>
     <message>
         <source>Numpad 2</source>
-        <translation>Numpad 2</translation>
+        <translation type="vanished">Numpad 2</translation>
     </message>
     <message>
         <source>Numpad 3</source>
-        <translation>Numpad 3</translation>
+        <translation type="vanished">Numpad 3</translation>
     </message>
     <message>
         <source>Numpad 4</source>
-        <translation>Numpad 4</translation>
+        <translation type="vanished">Numpad 4</translation>
     </message>
     <message>
         <source>Numpad 5</source>
-        <translation>Numpad 5</translation>
+        <translation type="vanished">Numpad 5</translation>
     </message>
     <message>
         <source>Numpad 6</source>
-        <translation>Numpad 6</translation>
+        <translation type="vanished">Numpad 6</translation>
     </message>
     <message>
         <source>Numpad 7</source>
-        <translation>Numpad 7</translation>
+        <translation type="vanished">Numpad 7</translation>
     </message>
     <message>
         <source>Numpad 8</source>
-        <translation>Numpad 8</translation>
+        <translation type="vanished">Numpad 8</translation>
     </message>
     <message>
         <source>Numpad 9</source>
-        <translation>Numpad 9</translation>
+        <translation type="vanished">Numpad 9</translation>
     </message>
     <message>
         <source>Numpad .</source>
-        <translation>Numpad .</translation>
+        <translation type="vanished">Numpad .</translation>
     </message>
     <message>
         <source>Numpad /</source>
-        <translation>Numpad /</translation>
+        <translation type="vanished">Numpad /</translation>
     </message>
     <message>
         <source>Numpad *</source>
-        <translation>Numpad *</translation>
+        <translation type="vanished">Numpad *</translation>
     </message>
     <message>
         <source>Numpad -</source>
-        <translation>Numpad -</translation>
+        <translation type="vanished">Numpad -</translation>
     </message>
     <message>
         <source>Numpad +</source>
-        <translation>Numpad +</translation>
+        <translation type="vanished">Numpad +</translation>
     </message>
     <message>
         <source>Enter</source>
-        <translation>Enter</translation>
+        <translation type="vanished">Enter</translation>
     </message>
     <message>
         <source>Equals</source>
-        <translation>Igual</translation>
+        <translation type="vanished">Igual</translation>
     </message>
     <message>
         <source>Up</source>
@@ -4016,55 +4282,55 @@
     </message>
     <message>
         <source>Page up</source>
-        <translation>Page uo</translation>
+        <translation type="vanished">Page uo</translation>
     </message>
     <message>
         <source>Page down</source>
-        <translation>Page down</translation>
+        <translation type="vanished">Page down</translation>
     </message>
     <message>
         <source>Num lock</source>
-        <translation>Num lock</translation>
+        <translation type="vanished">Num lock</translation>
     </message>
     <message>
         <source>Caps lock</source>
-        <translation>Caps lock</translation>
+        <translation type="vanished">Caps lock</translation>
     </message>
     <message>
         <source>Scroll lock</source>
-        <translation>Scroll lock</translation>
+        <translation type="vanished">Scroll lock</translation>
     </message>
     <message>
         <source>Right shift</source>
-        <translation>Shift direito</translation>
+        <translation type="vanished">Shift direito</translation>
     </message>
     <message>
         <source>Left shift</source>
-        <translation>Shift esquerdo</translation>
+        <translation type="vanished">Shift esquerdo</translation>
     </message>
     <message>
         <source>Right ctrl</source>
-        <translation>Ctrl direito</translation>
+        <translation type="vanished">Ctrl direito</translation>
     </message>
     <message>
         <source>Left ctrl</source>
-        <translation>Ctrl esquerdo</translation>
+        <translation type="vanished">Ctrl esquerdo</translation>
     </message>
     <message>
         <source>Right alt</source>
-        <translation>Alt direito</translation>
+        <translation type="vanished">Alt direito</translation>
     </message>
     <message>
         <source>Left alt</source>
-        <translation>Alt esquerdo</translation>
+        <translation type="vanished">Alt esquerdo</translation>
     </message>
     <message>
         <source>Right meta</source>
-        <translation>Meta direito</translation>
+        <translation type="vanished">Meta direito</translation>
     </message>
     <message>
         <source>Left meta</source>
-        <translation>Meta esquerdo</translation>
+        <translation type="vanished">Meta esquerdo</translation>
     </message>
     <message>
         <source>A button</source>
@@ -4169,6 +4435,609 @@
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation type="unfinished">Armamento</translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation type="unfinished">Gráficos</translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation type="unfinished">Geral</translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation type="unfinished">Musica</translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -4329,10 +5198,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>The game can&apos;t be started with less than two clans!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4625,10 +5490,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>&apos;Registered only&apos; state toggled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Super power activated.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4692,5 +5553,25 @@
         <source>This command is only available in rooms.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 </TS>
--- a/share/hedgewars/Data/Locale/hedgewars_ro.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_ro.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -78,6 +78,49 @@
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>AbstractPage</name>
@@ -315,21 +358,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -536,10 +583,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Guest</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Room password</source>
         <translation type="unfinished"></translation>
     </message>
@@ -788,6 +831,18 @@
         <source>Click to edit</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation type="unfinished">Load</translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
@@ -901,6 +956,20 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>HatButton</name>
     <message>
         <source>Change hat (%1)</source>
@@ -939,6 +1008,10 @@
         <source>Category</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>LibavInteraction</name>
@@ -979,6 +1052,7 @@
     </message>
     <message>
         <source>Record: %1</source>
+        <extracomment>As in ‘recording’</extracomment>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -1356,6 +1430,32 @@
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
 </context>
 <context>
     <name>PageInGame</name>
@@ -1450,6 +1550,25 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <source>Control</source>
@@ -1676,6 +1795,7 @@
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -1905,6 +2025,7 @@
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2026,10 +2147,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Practice your skills in a range of training missions</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Watch recorded demos</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2037,6 +2154,10 @@
         <source>Load a previously saved game</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -2076,6 +2197,33 @@
         <source>Scenarios</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageVideos</name>
@@ -2685,6 +2833,7 @@
     </message>
     <message>
         <source>% Retreat Time</source>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2700,6 +2849,10 @@
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QLineEdit</name>
@@ -2962,6 +3115,15 @@
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Server redirection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
@@ -2998,7 +3160,7 @@
     </message>
     <message>
         <source>Specify</source>
-        <translation>Specify</translation>
+        <translation type="vanished">Specify</translation>
     </message>
     <message>
         <source>Start</source>
@@ -3080,6 +3242,10 @@
         <source>Start private server</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
@@ -3406,7 +3572,7 @@
     </message>
     <message>
         <source>capture</source>
-        <translation>capture</translation>
+        <translation type="vanished">capture</translation>
     </message>
     <message>
         <source>quit</source>
@@ -3422,7 +3588,7 @@
     </message>
     <message>
         <source>reset zoom</source>
-        <translation>reset zoom</translation>
+        <translation type="vanished">reset zoom</translation>
     </message>
     <message>
         <source>long jump</source>
@@ -3477,6 +3643,62 @@
         <source>clan chat</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>binds (categories)</name>
@@ -3498,6 +3720,49 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -3643,74 +3908,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Numpad 0</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 4</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 5</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 6</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 7</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 8</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad 9</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad .</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad /</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad *</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad -</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Numpad +</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Enter</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Equals</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Up</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3739,58 +3936,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Page up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Page down</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Num lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Caps lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Scroll lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right shift</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left shift</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right ctrl</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left ctrl</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right alt</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left alt</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right meta</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left meta</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>A button</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3889,6 +4034,609 @@
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation type="unfinished">Weapons</translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation type="unfinished">General</translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -3961,10 +4709,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>The game can&apos;t be started with less than two clans!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4257,10 +5001,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>&apos;Registered only&apos; state toggled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Super power activated.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4324,5 +5064,25 @@
         <source>This command is only available in rooms.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 </TS>
--- a/share/hedgewars/Data/Locale/hedgewars_ru.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_ru.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -27,7 +27,7 @@
     <message>
         <source>GNU GPL v2</source>
         <extracomment>Short for “GNU General Public License version 2”</extracomment>
-        <translation></translation><!--Non-translatable text-->
+        <translation></translation>
     </message>
     <message>
         <source>Dependency versions:</source>
@@ -36,47 +36,90 @@
     </message>
     <message>
         <source>&lt;a href=&quot;https://gcc.gnu.org&quot;&gt;GCC&lt;/a&gt;: %1</source>
-        <translation></translation><!--Non-translatable text-->
+        <translation></translation>
     </message>
     <message>
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2&lt;/a&gt;: %1.%2.%3</source>
-        <translation></translation><!--Non-translatable text-->
+        <translation></translation>
     </message>
     <message>
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_mixer&lt;/a&gt;: %1.%2.%3</source>
-        <translation></translation><!--Non-translatable text-->
+        <translation></translation>
     </message>
     <message>
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_net&lt;/a&gt;: %1.%2.%3</source>
-        <translation></translation><!--Non-translatable text-->
+        <translation></translation>
     </message>
     <message>
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_image&lt;/a&gt;: %1.%2.%3</source>
-        <translation></translation><!--Non-translatable text-->
+        <translation></translation>
     </message>
     <message>
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_ttf&lt;/a&gt;: %1.%2.%3</source>
-        <translation></translation><!--Non-translatable text-->
+        <translation></translation>
     </message>
     <message>
         <source>&lt;a href=&quot;https://www.qt.io/developers/&quot;&gt;Qt&lt;/a&gt;: %1</source>
-        <translation></translation><!--Non-translatable text-->
+        <translation></translation>
     </message>
     <message>
         <source>&lt;a href=&quot;https://libav.org&quot;&gt;libavcodec&lt;/a&gt;: %1.%2.%3</source>
-        <translation></translation><!--Non-translatable text-->
+        <translation></translation>
     </message>
     <message>
         <source>&lt;a href=&quot;https://libav.org&quot;&gt;libavformat&lt;/a&gt;: %1.%2.%3</source>
-        <translation></translation><!--Non-translatable text-->
+        <translation></translation>
     </message>
     <message>
         <source>&lt;a href=&quot;https://libav.org&quot;&gt;libavutil&lt;/a&gt;: %1.%2.%3</source>
-        <translation></translation><!--Non-translatable text-->
+        <translation></translation>
     </message>
     <message>
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
-        <translation></translation><!--Non-translatable text-->
+        <translation></translation>
+    </message>
+    <message>
+        <source>Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -330,21 +373,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation>Использование</translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation>ОПЦИЯ</translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
         <translation>СТРОКА ПОДКЛЮЧЕНИЯ</translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation>Опции</translation>
     </message>
     <message>
@@ -556,7 +603,7 @@
     </message>
     <message>
         <source>Guest</source>
-        <translation>Гость</translation>
+        <translation type="vanished">Гость</translation>
     </message>
     <message>
         <source>Room password</source>
@@ -815,6 +862,18 @@
         <source>Click to edit</source>
         <translation>Нажмите для изменения</translation>
     </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation type="unfinished">Загрузить</translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
@@ -928,6 +987,20 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>HatButton</name>
     <message>
         <source>Change hat (%1)</source>
@@ -966,6 +1039,10 @@
         <source>Category</source>
         <translation>Категория</translation>
     </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>LibavInteraction</name>
@@ -1019,6 +1096,7 @@
     </message>
     <message>
         <source>Record: %1</source>
+        <extracomment>As in ‘recording’</extracomment>
         <translation>Запись: %1</translation>
     </message>
 </context>
@@ -1297,11 +1375,11 @@
     <message>
         <source>CPU %1</source>
         <extracomment>Name of a flag for computer-controlled enemies. %1 is replaced with the computer level</extracomment>
-        <translation>CPU %1</translation><!--Intended. This is better, than ЦП or ИИ, in my opinion-->
+        <translation>CPU %1</translation>
     </message>
     <message>
         <source>%1 (%2)</source>
-        <translation></translation><!--Non-translatable text-->
+        <translation></translation>
     </message>
 </context>
 <context>
@@ -1396,6 +1474,32 @@
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation>Когда все имеют один и тот же цвет клана, нет причины воевать. И так ёжики жили долго и и счастливо в мире и согласии.</translation>
     </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
 </context>
 <context>
     <name>PageInGame</name>
@@ -1490,6 +1594,25 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation type="unfinished">Запустить личный сервер</translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <source>Control</source>
@@ -1716,6 +1839,7 @@
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
         <translation>ОТСУТСТВУЕТ ЯЗЫК [%1]</translation>
     </message>
     <message>
@@ -1961,6 +2085,7 @@
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation>Процент урона и силы отбрасывания</translation>
     </message>
     <message>
@@ -2045,7 +2170,7 @@
     </message>
     <message>
         <source>%1 (%2)</source>
-        <translation></translation><!--Non-translatable text-->
+        <translation></translation>
     </message>
 </context>
 <context>
@@ -2083,7 +2208,7 @@
     </message>
     <message>
         <source>Practice your skills in a range of training missions</source>
-        <translation>Тренировка мастерства в тренировочных миссиях</translation>
+        <translation type="vanished">Тренировка мастерства в тренировочных миссиях</translation>
     </message>
     <message>
         <source>Watch recorded demos</source>
@@ -2093,6 +2218,10 @@
         <source>Load a previously saved game</source>
         <translation>Загрузить сохранённую игру</translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -2136,6 +2265,33 @@
         <source>Scenarios</source>
         <translation>Сценарии</translation>
     </message>
+    <message>
+        <source>Team</source>
+        <translation type="unfinished">Команда</translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageVideos</name>
@@ -2479,23 +2635,23 @@
     </message>
     <message>
         <source>24 FPS</source>
-        <translation></translation><!--Non-translatable text-->
+        <translation></translation>
     </message>
     <message>
         <source>25 FPS</source>
-        <translation></translation><!--Non-translatable text-->
+        <translation></translation>
     </message>
     <message>
         <source>30 FPS</source>
-        <translation></translation><!--Non-translatable text-->
+        <translation></translation>
     </message>
     <message>
         <source>50 FPS</source>
-        <translation></translation><!--Non-translatable text-->
+        <translation></translation>
     </message>
     <message>
         <source>60 FPS</source>
-        <translation></translation><!--Non-translatable text-->
+        <translation></translation>
     </message>
 </context>
 <context>
@@ -2781,6 +2937,7 @@
     </message>
     <message>
         <source>% Retreat Time</source>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
         <translation>% времени на отход</translation>
     </message>
     <message>
@@ -2796,6 +2953,10 @@
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
         <translation>Загружается&lt;br&gt;капча ...</translation>
     </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QLineEdit</name>
@@ -3053,6 +3214,15 @@
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation>Схема с названием &apos;%1&apos; уже существует. Изменения схемы оружия будут сброшены.</translation>
     </message>
+    <message>
+        <source>Server redirection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
@@ -3093,7 +3263,7 @@
     </message>
     <message>
         <source>Specify</source>
-        <translation>Указать</translation>
+        <translation type="vanished">Указать</translation>
     </message>
     <message>
         <source>default</source>
@@ -3171,6 +3341,10 @@
         <source>Start private server</source>
         <translation>Запустить личный сервер</translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
@@ -3474,7 +3648,7 @@
     </message>
     <message>
         <source>capture</source>
-        <translation>снимок</translation>
+        <translation type="vanished">снимок</translation>
     </message>
     <message>
         <source>quit</source>
@@ -3530,7 +3704,7 @@
     </message>
     <message>
         <source>reset zoom</source>
-        <translation>сбросить увеличение</translation>
+        <translation type="vanished">сбросить увеличение</translation>
     </message>
     <message>
         <source>long jump</source>
@@ -3585,6 +3759,62 @@
         <source>clan chat</source>
         <translation>чат клана</translation>
     </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>binds (categories)</name>
@@ -3606,6 +3836,49 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -3760,95 +4033,95 @@
     </message>
     <message>
         <source>Right shift</source>
-        <translation>Правый shift</translation>
+        <translation type="vanished">Правый shift</translation>
     </message>
     <message>
         <source>Left shift</source>
-        <translation>Левый shift</translation>
+        <translation type="vanished">Левый shift</translation>
     </message>
     <message>
         <source>Right ctrl</source>
-        <translation>Правый ctrl</translation>
+        <translation type="vanished">Правый ctrl</translation>
     </message>
     <message>
         <source>Left ctrl</source>
-        <translation>Левый ctrl</translation>
+        <translation type="vanished">Левый ctrl</translation>
     </message>
     <message>
         <source>Right alt</source>
-        <translation>Правый alt</translation>
+        <translation type="vanished">Правый alt</translation>
     </message>
     <message>
         <source>Left alt</source>
-        <translation>Левый alt</translation>
+        <translation type="vanished">Левый alt</translation>
     </message>
     <message>
         <source>Numpad 0</source>
-        <translation>Цифровая клавиатура 0</translation>
+        <translation type="vanished">Цифровая клавиатура 0</translation>
     </message>
     <message>
         <source>Numpad 1</source>
-        <translation>Цифровая клавиатура 1</translation>
+        <translation type="vanished">Цифровая клавиатура 1</translation>
     </message>
     <message>
         <source>Numpad 2</source>
-        <translation>Цифровая клавиатура 2</translation>
+        <translation type="vanished">Цифровая клавиатура 2</translation>
     </message>
     <message>
         <source>Numpad 3</source>
-        <translation>Цифровая клавиатура 3</translation>
+        <translation type="vanished">Цифровая клавиатура 3</translation>
     </message>
     <message>
         <source>Numpad 4</source>
-        <translation>Цифровая клавиатура 4</translation>
+        <translation type="vanished">Цифровая клавиатура 4</translation>
     </message>
     <message>
         <source>Numpad 5</source>
-        <translation>Цифровая клавиатура 5</translation>
+        <translation type="vanished">Цифровая клавиатура 5</translation>
     </message>
     <message>
         <source>Numpad 6</source>
-        <translation>Цифровая клавиатура 6</translation>
+        <translation type="vanished">Цифровая клавиатура 6</translation>
     </message>
     <message>
         <source>Numpad 7</source>
-        <translation>Цифровая клавиатура 7</translation>
+        <translation type="vanished">Цифровая клавиатура 7</translation>
     </message>
     <message>
         <source>Numpad 8</source>
-        <translation>Цифровая клавиатура 8</translation>
+        <translation type="vanished">Цифровая клавиатура 8</translation>
     </message>
     <message>
         <source>Numpad 9</source>
-        <translation>Цифровая клавиатура 9</translation>
+        <translation type="vanished">Цифровая клавиатура 9</translation>
     </message>
     <message>
         <source>Numpad .</source>
-        <translation>Цифровая клавиатура .</translation>
+        <translation type="vanished">Цифровая клавиатура .</translation>
     </message>
     <message>
         <source>Numpad /</source>
-        <translation>Цифровая клавиатура /</translation>
+        <translation type="vanished">Цифровая клавиатура /</translation>
     </message>
     <message>
         <source>Numpad *</source>
-        <translation>Цифровая клавиатура *</translation>
+        <translation type="vanished">Цифровая клавиатура *</translation>
     </message>
     <message>
         <source>Numpad -</source>
-        <translation>Цифровая клавиатура -</translation>
+        <translation type="vanished">Цифровая клавиатура -</translation>
     </message>
     <message>
         <source>Numpad +</source>
-        <translation>Цифровая клавиатура +</translation>
+        <translation type="vanished">Цифровая клавиатура +</translation>
     </message>
     <message>
         <source>Enter</source>
-        <translation>Enter</translation>
+        <translation type="vanished">Enter</translation>
     </message>
     <message>
         <source>Equals</source>
-        <translation>=</translation>
+        <translation type="vanished">=</translation>
     </message>
     <message>
         <source>Insert</source>
@@ -3864,31 +4137,31 @@
     </message>
     <message>
         <source>Page up</source>
-        <translation>Page up</translation>
+        <translation type="vanished">Page up</translation>
     </message>
     <message>
         <source>Page down</source>
-        <translation>Page down</translation>
+        <translation type="vanished">Page down</translation>
     </message>
     <message>
         <source>Num lock</source>
-        <translation>Num lock</translation>
+        <translation type="vanished">Num lock</translation>
     </message>
     <message>
         <source>Caps lock</source>
-        <translation>Caps lock</translation>
+        <translation type="vanished">Caps lock</translation>
     </message>
     <message>
         <source>Scroll lock</source>
-        <translation>Scroll lock</translation>
+        <translation type="vanished">Scroll lock</translation>
     </message>
     <message>
         <source>Right meta</source>
-        <translation>Правая метаклавиша</translation>
+        <translation type="vanished">Правая метаклавиша</translation>
     </message>
     <message>
         <source>Left meta</source>
-        <translation>Левая метаклавишa</translation>
+        <translation type="vanished">Левая метаклавишa</translation>
     </message>
     <message>
         <source>A button</source>
@@ -3916,11 +4189,11 @@
     </message>
     <message>
         <source>Back button</source>
-        <translation>Кнопка "назад"</translation>
+        <translation>Кнопка &quot;назад&quot;</translation>
     </message>
     <message>
         <source>Start button</source>
-        <translation>Кнопка "старт"</translation>
+        <translation>Кнопка &quot;старт&quot;</translation>
     </message>
     <message>
         <source>Left stick</source>
@@ -3989,6 +4262,609 @@
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation type="unfinished">Оружие</translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation type="unfinished">Графика</translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation type="unfinished">Основные настройки</translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation type="unfinished">Форты</translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation type="unfinished">Музыка</translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -4062,7 +4938,7 @@
     </message>
     <message>
         <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation>Доступные для голосования команды: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</translation>
+        <translation type="vanished">Доступные для голосования команды: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</translation>
     </message>
     <message>
         <source>The game can&apos;t be started with less than two clans!</source>
@@ -4358,7 +5234,7 @@
     </message>
     <message>
         <source>&apos;Registered only&apos; state toggled.</source>
-        <translation>Режим &apos;только для зарегистрированных&apos; переключён</translation>
+        <translation type="vanished">Режим &apos;только для зарегистрированных&apos; переключён</translation>
     </message>
     <message>
         <source>Super power activated.</source>
@@ -4424,5 +5300,25 @@
         <source>This command is only available in rooms.</source>
         <translation>Эта команда доступна только в комнате.</translation>
     </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 </TS>
--- a/share/hedgewars/Data/Locale/hedgewars_sk.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_sk.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -78,6 +78,49 @@
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</translation>
     </message>
+    <message>
+        <source>Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>AbstractPage</name>
@@ -326,21 +369,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation>Syntax</translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation>VOĽBA</translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
         <translation>PRIPOJOVACI_RETAZEC</translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation>Voľby</translation>
     </message>
     <message>
@@ -552,7 +599,7 @@
     </message>
     <message>
         <source>Guest</source>
-        <translation>Hosť</translation>
+        <translation type="vanished">Hosť</translation>
     </message>
     <message>
         <source>Room password</source>
@@ -804,6 +851,18 @@
         <source>Click to edit</source>
         <translation>Kliknite pre úpravy</translation>
     </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation type="unfinished">Načítať</translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
@@ -921,6 +980,20 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>HWUploadVideoDialog</name>
     <message>
         <source>Upload video</source>
@@ -970,6 +1043,10 @@
         <source>Category</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>LibavInteraction</name>
@@ -1023,6 +1100,7 @@
     </message>
     <message>
         <source>Record: %1</source>
+        <extracomment>As in ‘recording’</extracomment>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -1416,6 +1494,32 @@
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
 </context>
 <context>
     <name>PageInGame</name>
@@ -1510,6 +1614,25 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <source>Control</source>
@@ -1736,6 +1859,7 @@
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -1981,6 +2105,7 @@
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2103,7 +2228,7 @@
     </message>
     <message>
         <source>Practice your skills in a range of training missions</source>
-        <translation>Cibrite si svoje schopnosti v rade tréningových misií</translation>
+        <translation type="vanished">Cibrite si svoje schopnosti v rade tréningových misií</translation>
     </message>
     <message>
         <source>Watch recorded demos</source>
@@ -2113,6 +2238,10 @@
         <source>Load a previously saved game</source>
         <translation>Načítať uloženú hru</translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -2156,6 +2285,33 @@
         <source>Scenarios</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageVideos</name>
@@ -2833,6 +2989,7 @@
     </message>
     <message>
         <source>% Retreat Time</source>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2848,6 +3005,10 @@
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QLineEdit</name>
@@ -3178,6 +3339,15 @@
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Server redirection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
@@ -3218,7 +3388,7 @@
     </message>
     <message>
         <source>Specify</source>
-        <translation>Nastaviť</translation>
+        <translation type="vanished">Nastaviť</translation>
     </message>
     <message>
         <source>Start</source>
@@ -3308,6 +3478,10 @@
         <source>Start private server</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
@@ -3622,7 +3796,7 @@
     </message>
     <message>
         <source>capture</source>
-        <translation>snímať</translation>
+        <translation type="vanished">snímať</translation>
     </message>
     <message>
         <source>quit</source>
@@ -3654,7 +3828,7 @@
     </message>
     <message>
         <source>reset zoom</source>
-        <translation>reštartovať priblíženie</translation>
+        <translation type="vanished">reštartovať priblíženie</translation>
     </message>
     <message>
         <source>long jump</source>
@@ -3709,6 +3883,62 @@
         <source>clan chat</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>binds (categories)</name>
@@ -3730,6 +3960,49 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -3904,71 +4177,71 @@
     </message>
     <message>
         <source>Numpad 0</source>
-        <translation>Numpad 0</translation>
+        <translation type="vanished">Numpad 0</translation>
     </message>
     <message>
         <source>Numpad 1</source>
-        <translation>Numpad 1</translation>
+        <translation type="vanished">Numpad 1</translation>
     </message>
     <message>
         <source>Numpad 2</source>
-        <translation>Numpad 2</translation>
+        <translation type="vanished">Numpad 2</translation>
     </message>
     <message>
         <source>Numpad 3</source>
-        <translation>Numpad 3</translation>
+        <translation type="vanished">Numpad 3</translation>
     </message>
     <message>
         <source>Numpad 4</source>
-        <translation>Numpad 4</translation>
+        <translation type="vanished">Numpad 4</translation>
     </message>
     <message>
         <source>Numpad 5</source>
-        <translation>Numpad 5</translation>
+        <translation type="vanished">Numpad 5</translation>
     </message>
     <message>
         <source>Numpad 6</source>
-        <translation>Numpad 6</translation>
+        <translation type="vanished">Numpad 6</translation>
     </message>
     <message>
         <source>Numpad 7</source>
-        <translation>Numpad 7</translation>
+        <translation type="vanished">Numpad 7</translation>
     </message>
     <message>
         <source>Numpad 8</source>
-        <translation>Numpad 8</translation>
+        <translation type="vanished">Numpad 8</translation>
     </message>
     <message>
         <source>Numpad 9</source>
-        <translation>Numpad 9</translation>
+        <translation type="vanished">Numpad 9</translation>
     </message>
     <message>
         <source>Numpad .</source>
-        <translation>Numpad .</translation>
+        <translation type="vanished">Numpad .</translation>
     </message>
     <message>
         <source>Numpad /</source>
-        <translation>Numpad /</translation>
+        <translation type="vanished">Numpad /</translation>
     </message>
     <message>
         <source>Numpad *</source>
-        <translation>Numpad *</translation>
+        <translation type="vanished">Numpad *</translation>
     </message>
     <message>
         <source>Numpad -</source>
-        <translation>Numpad -</translation>
+        <translation type="vanished">Numpad -</translation>
     </message>
     <message>
         <source>Numpad +</source>
-        <translation>Numpad +</translation>
+        <translation type="vanished">Numpad +</translation>
     </message>
     <message>
         <source>Enter</source>
-        <translation>Enter</translation>
+        <translation type="vanished">Enter</translation>
     </message>
     <message>
         <source>Equals</source>
-        <translation>Rovná sa</translation>
+        <translation type="vanished">Rovná sa</translation>
     </message>
     <message>
         <source>Up</source>
@@ -4000,55 +4273,55 @@
     </message>
     <message>
         <source>Page up</source>
-        <translation>Page up</translation>
+        <translation type="vanished">Page up</translation>
     </message>
     <message>
         <source>Page down</source>
-        <translation>Page down</translation>
+        <translation type="vanished">Page down</translation>
     </message>
     <message>
         <source>Num lock</source>
-        <translation>Num lock</translation>
+        <translation type="vanished">Num lock</translation>
     </message>
     <message>
         <source>Caps lock</source>
-        <translation>Caps lock</translation>
+        <translation type="vanished">Caps lock</translation>
     </message>
     <message>
         <source>Scroll lock</source>
-        <translation>Scroll lock</translation>
+        <translation type="vanished">Scroll lock</translation>
     </message>
     <message>
         <source>Right shift</source>
-        <translation>Pravý shift</translation>
+        <translation type="vanished">Pravý shift</translation>
     </message>
     <message>
         <source>Left shift</source>
-        <translation>Ľavý shift</translation>
+        <translation type="vanished">Ľavý shift</translation>
     </message>
     <message>
         <source>Right ctrl</source>
-        <translation>Pravý ctrl</translation>
+        <translation type="vanished">Pravý ctrl</translation>
     </message>
     <message>
         <source>Left ctrl</source>
-        <translation>Ľavý ctrl</translation>
+        <translation type="vanished">Ľavý ctrl</translation>
     </message>
     <message>
         <source>Right alt</source>
-        <translation>Pravý alt</translation>
+        <translation type="vanished">Pravý alt</translation>
     </message>
     <message>
         <source>Left alt</source>
-        <translation>Ľavý alt</translation>
+        <translation type="vanished">Ľavý alt</translation>
     </message>
     <message>
         <source>Right meta</source>
-        <translation>Pravý meta</translation>
+        <translation type="vanished">Pravý meta</translation>
     </message>
     <message>
         <source>Left meta</source>
-        <translation>Ľavý meta</translation>
+        <translation type="vanished">Ľavý meta</translation>
     </message>
     <message>
         <source>A button</source>
@@ -4153,6 +4426,609 @@
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation type="unfinished">Výzbroj</translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation type="unfinished">Všeobecné</translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation type="unfinished">Pevnosti</translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -4225,10 +5101,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>The game can&apos;t be started with less than two clans!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4521,10 +5393,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>&apos;Registered only&apos; state toggled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Super power activated.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4588,5 +5456,25 @@
         <source>This command is only available in rooms.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 </TS>
--- a/share/hedgewars/Data/Locale/hedgewars_sv.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_sv.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -78,6 +78,49 @@
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>AbstractPage</name>
@@ -317,21 +360,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -538,10 +585,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Guest</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Room password</source>
         <translation type="unfinished"></translation>
     </message>
@@ -790,6 +833,18 @@
         <source>Click to edit</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation type="unfinished">Läs in</translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
@@ -903,6 +958,20 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>HatButton</name>
     <message>
         <source>Change hat (%1)</source>
@@ -941,6 +1010,10 @@
         <source>Category</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>LibavInteraction</name>
@@ -981,6 +1054,7 @@
     </message>
     <message>
         <source>Record: %1</source>
+        <extracomment>As in ‘recording’</extracomment>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -1363,6 +1437,29 @@
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+            <numerusform></numerusform>
+        </translation>
+    </message>
 </context>
 <context>
     <name>PageInGame</name>
@@ -1457,6 +1554,25 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <source>Control</source>
@@ -1683,6 +1799,7 @@
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -1927,6 +2044,7 @@
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2048,10 +2166,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Practice your skills in a range of training missions</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Watch recorded demos</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2059,6 +2173,10 @@
         <source>Load a previously saved game</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -2098,6 +2216,33 @@
         <source>Scenarios</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageVideos</name>
@@ -2730,6 +2875,7 @@
     </message>
     <message>
         <source>% Retreat Time</source>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2745,6 +2891,10 @@
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QLineEdit</name>
@@ -3006,6 +3156,15 @@
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Server redirection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
@@ -3046,7 +3205,7 @@
     </message>
     <message>
         <source>Specify</source>
-        <translation>Ange</translation>
+        <translation type="vanished">Ange</translation>
     </message>
     <message>
         <source>Start</source>
@@ -3124,6 +3283,10 @@
         <source>Start private server</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
@@ -3438,7 +3601,7 @@
     </message>
     <message>
         <source>capture</source>
-        <translation>ta bild</translation>
+        <translation type="vanished">ta bild</translation>
     </message>
     <message>
         <source>quit</source>
@@ -3470,7 +3633,7 @@
     </message>
     <message>
         <source>reset zoom</source>
-        <translation>återställ zoom</translation>
+        <translation type="vanished">återställ zoom</translation>
     </message>
     <message>
         <source>long jump</source>
@@ -3525,6 +3688,62 @@
         <source>clan chat</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>binds (categories)</name>
@@ -3546,6 +3765,49 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -3720,71 +3982,71 @@
     </message>
     <message>
         <source>Numpad 0</source>
-        <translation>Numpad 0</translation>
+        <translation type="vanished">Numpad 0</translation>
     </message>
     <message>
         <source>Numpad 1</source>
-        <translation>Numpad 1</translation>
+        <translation type="vanished">Numpad 1</translation>
     </message>
     <message>
         <source>Numpad 2</source>
-        <translation>Numpad 2</translation>
+        <translation type="vanished">Numpad 2</translation>
     </message>
     <message>
         <source>Numpad 3</source>
-        <translation>Numpad 3</translation>
+        <translation type="vanished">Numpad 3</translation>
     </message>
     <message>
         <source>Numpad 4</source>
-        <translation>Numpad 4</translation>
+        <translation type="vanished">Numpad 4</translation>
     </message>
     <message>
         <source>Numpad 5</source>
-        <translation>Numpad 5</translation>
+        <translation type="vanished">Numpad 5</translation>
     </message>
     <message>
         <source>Numpad 6</source>
-        <translation>Numpad 6</translation>
+        <translation type="vanished">Numpad 6</translation>
     </message>
     <message>
         <source>Numpad 7</source>
-        <translation>Numpad 7</translation>
+        <translation type="vanished">Numpad 7</translation>
     </message>
     <message>
         <source>Numpad 8</source>
-        <translation>Numpad 8</translation>
+        <translation type="vanished">Numpad 8</translation>
     </message>
     <message>
         <source>Numpad 9</source>
-        <translation>Numpad 9</translation>
+        <translation type="vanished">Numpad 9</translation>
     </message>
     <message>
         <source>Numpad .</source>
-        <translation>Numpad .</translation>
+        <translation type="vanished">Numpad .</translation>
     </message>
     <message>
         <source>Numpad /</source>
-        <translation>Numpad /</translation>
+        <translation type="vanished">Numpad /</translation>
     </message>
     <message>
         <source>Numpad *</source>
-        <translation>Numpad *</translation>
+        <translation type="vanished">Numpad *</translation>
     </message>
     <message>
         <source>Numpad -</source>
-        <translation>Numpad -</translation>
+        <translation type="vanished">Numpad -</translation>
     </message>
     <message>
         <source>Numpad +</source>
-        <translation>Numpad +</translation>
+        <translation type="vanished">Numpad +</translation>
     </message>
     <message>
         <source>Enter</source>
-        <translation>Retur</translation>
+        <translation type="vanished">Retur</translation>
     </message>
     <message>
         <source>Equals</source>
-        <translation>Lika med</translation>
+        <translation type="vanished">Lika med</translation>
     </message>
     <message>
         <source>Up</source>
@@ -3816,55 +4078,55 @@
     </message>
     <message>
         <source>Page up</source>
-        <translation>Page up</translation>
+        <translation type="vanished">Page up</translation>
     </message>
     <message>
         <source>Page down</source>
-        <translation>Page down</translation>
+        <translation type="vanished">Page down</translation>
     </message>
     <message>
         <source>Num lock</source>
-        <translation>Num lock</translation>
+        <translation type="vanished">Num lock</translation>
     </message>
     <message>
         <source>Caps lock</source>
-        <translation>Caps lock</translation>
+        <translation type="vanished">Caps lock</translation>
     </message>
     <message>
         <source>Scroll lock</source>
-        <translation>Scroll lock</translation>
+        <translation type="vanished">Scroll lock</translation>
     </message>
     <message>
         <source>Right shift</source>
-        <translation>Höger shift</translation>
+        <translation type="vanished">Höger shift</translation>
     </message>
     <message>
         <source>Left shift</source>
-        <translation>Vänster shift</translation>
+        <translation type="vanished">Vänster shift</translation>
     </message>
     <message>
         <source>Right ctrl</source>
-        <translation>Höger ctrl</translation>
+        <translation type="vanished">Höger ctrl</translation>
     </message>
     <message>
         <source>Left ctrl</source>
-        <translation>Vänster ctrl</translation>
+        <translation type="vanished">Vänster ctrl</translation>
     </message>
     <message>
         <source>Right alt</source>
-        <translation>Höger alt</translation>
+        <translation type="vanished">Höger alt</translation>
     </message>
     <message>
         <source>Left alt</source>
-        <translation>Vänster alt</translation>
+        <translation type="vanished">Vänster alt</translation>
     </message>
     <message>
         <source>Right meta</source>
-        <translation>Höger meta</translation>
+        <translation type="vanished">Höger meta</translation>
     </message>
     <message>
         <source>Left meta</source>
-        <translation>Vänster meta</translation>
+        <translation type="vanished">Vänster meta</translation>
     </message>
     <message>
         <source>A button</source>
@@ -3969,6 +4231,609 @@
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation type="unfinished">Vapen</translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation type="unfinished">Allmänt</translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -4041,10 +4906,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>The game can&apos;t be started with less than two clans!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4337,10 +5198,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>&apos;Registered only&apos; state toggled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Super power activated.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4404,5 +5261,25 @@
         <source>This command is only available in rooms.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 </TS>
--- a/share/hedgewars/Data/Locale/hedgewars_tr_TR.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_tr_TR.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -78,6 +78,49 @@
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>AbstractPage</name>
@@ -330,21 +373,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -564,10 +611,6 @@
 Birkaç saniye bekle ve yeniden dene.</translation>
     </message>
     <message>
-        <source>Guest</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Room password</source>
         <translation type="unfinished"></translation>
     </message>
@@ -820,6 +863,18 @@
         <source>Click to edit</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation type="unfinished">Yükle</translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
@@ -940,6 +995,20 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>HWUploadVideoDialog</name>
     <message>
         <source>Upload video</source>
@@ -989,6 +1058,10 @@
         <source>Category</source>
         <translation>Kategori</translation>
     </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>LibavInteraction</name>
@@ -1043,6 +1116,7 @@
     </message>
     <message>
         <source>Record: %1</source>
+        <extracomment>As in ‘recording’</extracomment>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -1414,6 +1488,26 @@
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+        </translation>
+    </message>
 </context>
 <context>
     <name>PageInGame</name>
@@ -1508,6 +1602,25 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation type="unfinished">Özel sunucuyu başlat</translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <source>Control</source>
@@ -1734,6 +1847,7 @@
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -1969,6 +2083,7 @@
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2091,7 +2206,7 @@
     </message>
     <message>
         <source>Practice your skills in a range of training missions</source>
-        <translation>Yeteneklerini çeşitli eğitim görevleri ile geliştir</translation>
+        <translation type="vanished">Yeteneklerini çeşitli eğitim görevleri ile geliştir</translation>
     </message>
     <message>
         <source>Watch recorded demos</source>
@@ -2101,6 +2216,10 @@
         <source>Load a previously saved game</source>
         <translation>Önceden kayıtlı bir oyun yükle</translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -2144,6 +2263,33 @@
         <source>Scenarios</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PageVideos</name>
@@ -2831,6 +2977,7 @@
     </message>
     <message>
         <source>% Retreat Time</source>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2846,6 +2993,10 @@
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QLineEdit</name>
@@ -3179,6 +3330,15 @@
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Server redirection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
@@ -3215,7 +3375,7 @@
     </message>
     <message>
         <source>Specify</source>
-        <translation>Elle Belirt</translation>
+        <translation type="vanished">Elle Belirt</translation>
     </message>
     <message>
         <source>Start</source>
@@ -3313,6 +3473,10 @@
         <source>Click to copy your unique server URL to your clipboard. Send this link to your friends and they will be able to join you.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
@@ -3651,7 +3815,7 @@
     </message>
     <message>
         <source>capture</source>
-        <translation>yakala</translation>
+        <translation type="vanished">yakala</translation>
     </message>
     <message>
         <source>quit</source>
@@ -3675,7 +3839,7 @@
     </message>
     <message>
         <source>reset zoom</source>
-        <translation>yakınlaştırmayı sıfırla</translation>
+        <translation type="vanished">yakınlaştırmayı sıfırla</translation>
     </message>
     <message>
         <source>slot 10</source>
@@ -3726,6 +3890,62 @@
         <source>clan chat</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>binds (categories)</name>
@@ -3747,6 +3967,49 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -3921,71 +4184,71 @@
     </message>
     <message>
         <source>Numpad 0</source>
-        <translation>Nümerik 0</translation>
+        <translation type="vanished">Nümerik 0</translation>
     </message>
     <message>
         <source>Numpad 1</source>
-        <translation>Nümerik 1</translation>
+        <translation type="vanished">Nümerik 1</translation>
     </message>
     <message>
         <source>Numpad 2</source>
-        <translation>Nümerik 2</translation>
+        <translation type="vanished">Nümerik 2</translation>
     </message>
     <message>
         <source>Numpad 3</source>
-        <translation>Nümerik 3</translation>
+        <translation type="vanished">Nümerik 3</translation>
     </message>
     <message>
         <source>Numpad 4</source>
-        <translation>Nümerik 4</translation>
+        <translation type="vanished">Nümerik 4</translation>
     </message>
     <message>
         <source>Numpad 5</source>
-        <translation>Nümerik 5</translation>
+        <translation type="vanished">Nümerik 5</translation>
     </message>
     <message>
         <source>Numpad 6</source>
-        <translation>Nümerik 6</translation>
+        <translation type="vanished">Nümerik 6</translation>
     </message>
     <message>
         <source>Numpad 7</source>
-        <translation>Nümerik 7</translation>
+        <translation type="vanished">Nümerik 7</translation>
     </message>
     <message>
         <source>Numpad 8</source>
-        <translation>Nümerik 8</translation>
+        <translation type="vanished">Nümerik 8</translation>
     </message>
     <message>
         <source>Numpad 9</source>
-        <translation>Nümerik 9</translation>
+        <translation type="vanished">Nümerik 9</translation>
     </message>
     <message>
         <source>Numpad .</source>
-        <translation>Nümerik .</translation>
+        <translation type="vanished">Nümerik .</translation>
     </message>
     <message>
         <source>Numpad /</source>
-        <translation>Nümerik /</translation>
+        <translation type="vanished">Nümerik /</translation>
     </message>
     <message>
         <source>Numpad *</source>
-        <translation>Nümerik *</translation>
+        <translation type="vanished">Nümerik *</translation>
     </message>
     <message>
         <source>Numpad -</source>
-        <translation>Nümerik -</translation>
+        <translation type="vanished">Nümerik -</translation>
     </message>
     <message>
         <source>Numpad +</source>
-        <translation>Nümerik +</translation>
+        <translation type="vanished">Nümerik +</translation>
     </message>
     <message>
         <source>Enter</source>
-        <translation>Enter</translation>
+        <translation type="vanished">Enter</translation>
     </message>
     <message>
         <source>Equals</source>
-        <translation>Eşittir</translation>
+        <translation type="vanished">Eşittir</translation>
     </message>
     <message>
         <source>Up</source>
@@ -4017,55 +4280,55 @@
     </message>
     <message>
         <source>Page up</source>
-        <translation>Sayfa yukarı</translation>
+        <translation type="vanished">Sayfa yukarı</translation>
     </message>
     <message>
         <source>Page down</source>
-        <translation>Sayfa aşağı</translation>
+        <translation type="vanished">Sayfa aşağı</translation>
     </message>
     <message>
         <source>Num lock</source>
-        <translation>Nümerik kilit</translation>
+        <translation type="vanished">Nümerik kilit</translation>
     </message>
     <message>
         <source>Caps lock</source>
-        <translation>Büyük harf</translation>
+        <translation type="vanished">Büyük harf</translation>
     </message>
     <message>
         <source>Scroll lock</source>
-        <translation>Kaydırma kilidi</translation>
+        <translation type="vanished">Kaydırma kilidi</translation>
     </message>
     <message>
         <source>Right shift</source>
-        <translation>Sağ üst karakter</translation>
+        <translation type="vanished">Sağ üst karakter</translation>
     </message>
     <message>
         <source>Left shift</source>
-        <translation>Sol üst karakter</translation>
+        <translation type="vanished">Sol üst karakter</translation>
     </message>
     <message>
         <source>Right ctrl</source>
-        <translation>Sağ kontrol</translation>
+        <translation type="vanished">Sağ kontrol</translation>
     </message>
     <message>
         <source>Left ctrl</source>
-        <translation>Sol kontrol</translation>
+        <translation type="vanished">Sol kontrol</translation>
     </message>
     <message>
         <source>Right alt</source>
-        <translation>Sağ alt</translation>
+        <translation type="vanished">Sağ alt</translation>
     </message>
     <message>
         <source>Left alt</source>
-        <translation>Sol alt</translation>
+        <translation type="vanished">Sol alt</translation>
     </message>
     <message>
         <source>Right meta</source>
-        <translation>Sağ meta</translation>
+        <translation type="vanished">Sağ meta</translation>
     </message>
     <message>
         <source>Left meta</source>
-        <translation>Sol meta</translation>
+        <translation type="vanished">Sol meta</translation>
     </message>
     <message>
         <source>A button</source>
@@ -4170,6 +4433,609 @@
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation type="unfinished">Silahlar</translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation type="unfinished">Grafik</translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation type="unfinished">Genel</translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation type="unfinished">Müzik</translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -4330,10 +5196,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>The game can&apos;t be started with less than two clans!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4626,10 +5488,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>&apos;Registered only&apos; state toggled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Super power activated.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4693,5 +5551,25 @@
         <source>This command is only available in rooms.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 </TS>
--- a/share/hedgewars/Data/Locale/hedgewars_uk.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_uk.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -78,6 +78,49 @@
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</translation>
     </message>
+    <message>
+        <source>Credits</source>
+        <translation>Автори</translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation>Інші люди</translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation>%1 (псевдо %2)</translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation>%1 &amp;lt;%2&amp;gt;</translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation>%1: %2</translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation>%1: %2 &amp;lt;%3&amp;gt;</translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation>Розширений список</translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation>Розширений список можна знайти в файлі з назвою CREDITS</translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation>Невідомий компілятор: %1</translation>
+    </message>
 </context>
 <context>
     <name>AbstractPage</name>
@@ -230,7 +273,7 @@
     </message>
     <message>
         <source>Map</source>
-        <translation>Карта</translation>
+        <translation>Мапа</translation>
     </message>
     <message>
         <source>Game options</source>
@@ -334,21 +377,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation>Використання</translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation>OPTION</translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
         <translation>CONNECTSTRING</translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation>Опції</translation>
     </message>
     <message>
@@ -570,7 +617,7 @@
     </message>
     <message>
         <source>Guest</source>
-        <translation>Гість</translation>
+        <translation type="vanished">Гість</translation>
     </message>
     <message>
         <source>Room password</source>
@@ -687,11 +734,11 @@
     </message>
     <message>
         <source>Map type:</source>
-        <translation>Тип карти:</translation>
+        <translation>Тип мапи:</translation>
     </message>
     <message>
         <source>Image map</source>
-        <translation>Картинка</translation>
+        <translation>Мапа з картинки</translation>
     </message>
     <message>
         <source>Mission map</source>
@@ -715,15 +762,15 @@
     </message>
     <message>
         <source>Map preview:</source>
-        <translation>Огляд карти:</translation>
+        <translation>Огляд мапи:</translation>
     </message>
     <message>
         <source>Load map drawing</source>
-        <translation>Завантажити карту</translation>
+        <translation>Завантажити мапу</translation>
     </message>
     <message>
         <source>Edit map drawing</source>
-        <translation>Редагувати карту</translation>
+        <translation>Редагувати мапу</translation>
     </message>
     <message>
         <source>Small islands</source>
@@ -739,7 +786,7 @@
     </message>
     <message>
         <source>Map size:</source>
-        <translation>Розмір карти:</translation>
+        <translation>Розмір мапи:</translation>
     </message>
     <message>
         <source>Maze style:</source>
@@ -751,15 +798,15 @@
     </message>
     <message>
         <source>Map:</source>
-        <translation>Карта:</translation>
+        <translation>Мапа:</translation>
     </message>
     <message>
         <source>Load drawn map</source>
-        <translation>Завантажити намальовану карту</translation>
+        <translation>Завантажити намальовану мапу</translation>
     </message>
     <message>
         <source>Drawn Maps</source>
-        <translation>Намальовані карти</translation>
+        <translation>Намальовані мапи</translation>
     </message>
     <message>
         <source>All files</source>
@@ -767,7 +814,7 @@
     </message>
     <message>
         <source>Large tunnels</source>
-        <translation>Великі тунелі:</translation>
+        <translation>Великі тунелі</translation>
     </message>
     <message>
         <source>Theme: %1</source>
@@ -775,7 +822,7 @@
     </message>
     <message>
         <source>Random perlin</source>
-        <translation type="unfinished"></translation>
+        <translation>Випадковий шум</translation>
     </message>
     <message>
         <source>Style:</source>
@@ -787,7 +834,7 @@
     </message>
     <message>
         <source>View and edit the seed, the source of randomness in the game</source>
-        <translation type="unfinished"></translation>
+        <translation>Перегляд та зміна висіву, джерела випадковості в грі</translation>
     </message>
     <message>
         <source>Randomize the theme</source>
@@ -799,23 +846,23 @@
     </message>
     <message>
         <source>Randomize the map, theme and seed</source>
-        <translation type="unfinished"></translation>
+        <translation>Змінити мапу, тему і висів</translation>
     </message>
     <message>
         <source>Randomize the theme and seed</source>
-        <translation type="unfinished"></translation>
+        <translation>Змінити тему і висів</translation>
     </message>
     <message>
         <source>Randomize the seed</source>
-        <translation type="unfinished"></translation>
+        <translation>Змінити висів</translation>
     </message>
     <message>
         <source>Click to randomize the map, theme and seed</source>
-        <translation type="unfinished"></translation>
+        <translation>Натисність, щоб вибрати випадкові мапу, тему і висів</translation>
     </message>
     <message>
         <source>Click to randomize the theme and seed</source>
-        <translation type="unfinished"></translation>
+        <translation>Натисність, щоб вибрати випадкові тему і висів</translation>
     </message>
     <message>
         <source>Adjust the complexity of the generated map</source>
@@ -829,6 +876,18 @@
         <source>Click to edit</source>
         <translation>Клацніть для зміни</translation>
     </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation>Масштабування намальованої мапи</translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation>Завантажити</translation>
+    </message>
+    <message>
+        <source>Edit</source>
+        <translation>Змінити</translation>
+    </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
@@ -954,6 +1013,27 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation>Під час обробки відеозапису сталася фатальна помилка! Відео не вдалося зберегти.
+
+Як обхідний шлях, ви можете спробувати скинути налаштування відеозапису Hedgewars до стандартних значень.
+
+Щоб повідомити про цю помилку, натисніть кнопку &apos;Відгук&apos; у головному меню!
+
+Останнє повідомлення рушія:
+%1</translation>
+    </message>
+</context>
+<context>
     <name>HWUploadVideoDialog</name>
     <message>
         <source>Upload video</source>
@@ -1003,6 +1083,10 @@
         <source>Category</source>
         <translation>Категорія</translation>
     </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation>Увага: Та сама клавіша призначена кілька разів!</translation>
+    </message>
 </context>
 <context>
     <name>LibavInteraction</name>
@@ -1055,6 +1139,7 @@
     </message>
     <message>
         <source>Record: %1</source>
+        <extracomment>As in ‘recording’</extracomment>
         <translation>Рекорд: %1</translation>
     </message>
 </context>
@@ -1205,7 +1290,7 @@
     <name>PageDrawMap</name>
     <message>
         <source>Undo</source>
-        <translation>Повернути</translation>
+        <translation>Анулювати</translation>
     </message>
     <message>
         <source>Clear</source>
@@ -1221,15 +1306,15 @@
     </message>
     <message>
         <source>Load drawn map</source>
-        <translation>Завантажити намальовану карту</translation>
+        <translation>Завантажити намальовану мапу</translation>
     </message>
     <message>
         <source>Save drawn map</source>
-        <translation>Зберегти намальовану карту</translation>
+        <translation>Зберегти намальовану мапу</translation>
     </message>
     <message>
         <source>Drawn Maps</source>
-        <translation>Намальовані карти</translation>
+        <translation>Намальовані мапи</translation>
     </message>
     <message>
         <source>All files</source>
@@ -1320,7 +1405,7 @@
     </message>
     <message>
         <source>Randomize the grave</source>
-        <translation>Випадкова могила</translation>
+        <translation>Випадковий надгробок</translation>
     </message>
     <message>
         <source>Randomize the flag</source>
@@ -1434,16 +1519,16 @@
     </message>
     <message numerus="yes">
         <source>&lt;b&gt;%1&lt;/b&gt; thought it&apos;s good to shoot their own hedgehogs for &lt;b&gt;%2&lt;/b&gt; pts.</source>
-        <translation type="unfinished">
-            <numerusform></numerusform>
+        <translation>
+            <numerusform>&lt;b&gt;%1&lt;/b&gt; вирішив, що це нормально вбивати власних їжаків за &lt;b&gt;%2&lt;/b&gt; очків.</numerusform>
             <numerusform></numerusform>
             <numerusform></numerusform>
         </translation>
     </message>
     <message numerus="yes">
         <source>&lt;b&gt;%1&lt;/b&gt; killed &lt;b&gt;%2&lt;/b&gt; of their own hedgehogs.</source>
-        <translation type="unfinished">
-            <numerusform></numerusform>
+        <translation>
+            <numerusform>&lt;b&gt;%1&lt;/b&gt; вбив &lt;b&gt;%2&lt;/b&gt; з власних їжаків.</numerusform>
             <numerusform></numerusform>
             <numerusform></numerusform>
         </translation>
@@ -1452,6 +1537,32 @@
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation>Оскільки клани мали той самий колір, не було причин для бою. Тому їжаки довго жили в мирі і щасті.</translation>
     </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation>
+            <numerusform>(%1 очко)</numerusform>
+            <numerusform>(%1 очки)</numerusform>
+            <numerusform>(%1 очок)</numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation>
+            <numerusform>(%L1 секунда)</numerusform>
+            <numerusform>(%L1 секунди)</numerusform>
+            <numerusform>(%L1 секунд)</numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation>
+            <numerusform>(%1 ящик)</numerusform>
+            <numerusform>(%1 ящики)</numerusform>
+            <numerusform>(%1 ящиків)</numerusform>
+        </translation>
+    </message>
 </context>
 <context>
     <name>PageInGame</name>
@@ -1546,6 +1657,25 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation>Під&apos;єднатись до вибраного сервера</translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation>Оновити список серверів</translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation>Вкажіть адресу та номер порту відомого сервера та підключіться до нього</translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation>Запутити приватний сервер</translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <source>Control</source>
@@ -1772,7 +1902,8 @@
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
-        <translation type="unfinished"></translation>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
+        <translation>ВІДСУТНЯ НАЗВА МОВИ [%1]</translation>
     </message>
     <message>
         <source>Check now</source>
@@ -1945,11 +2076,11 @@
     </message>
     <message>
         <source>Disable girders when generating random maps.</source>
-        <translation>Вимкнути балки при генеруванні випадкових карт.</translation>
+        <translation>Вимкнути балки при генеруванні випадкових мап.</translation>
     </message>
     <message>
         <source>Disable land objects when generating random maps.</source>
-        <translation>Вимкнути декорації при генеруванні випадкової карти</translation>
+        <translation>Вимкнути декорації при генеруванні випадкової мапи</translation>
     </message>
     <message>
         <source>AI respawns on death.</source>
@@ -2017,11 +2148,12 @@
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
-        <translation type="unfinished"></translation>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
+        <translation>Загальна шкода і відкидання у відсотках</translation>
     </message>
     <message>
         <source>Turn time in seconds</source>
-        <translation type="unfinished"></translation>
+        <translation>Час ходу в секундах</translation>
     </message>
     <message>
         <source>Initial health of hedgehogs</source>
@@ -2029,15 +2161,15 @@
     </message>
     <message>
         <source>How many rounds have to be played before Sudden Death begins</source>
-        <translation type="unfinished"></translation>
+        <translation>Кількість  раундів до початку дії Раптовоі Смерті</translation>
     </message>
     <message>
         <source>How much the water rises per turn while in Sudden Death. Set to 0 along with Sudden Death Health Decrease to disable Sudden Death.</source>
-        <translation type="unfinished"></translation>
+        <translation>Скільки води піднімається за хід під час Раптової Смерті. Встановіть 0 тут і на Зменшення Здоров&apos;я, щоб вимкнути Раптову Смерть.</translation>
     </message>
     <message>
         <source>How much health hedgehogs lose per turn while in Sudden Death, down to 1 health. Set to 0 along with Sudden Death Water Rise to disable Sudden Death.</source>
-        <translation type="unfinished"></translation>
+        <translation>Скільки здоров&apos;я втрачають іжаки за хід під час Раптової Смерті, аж до 1. Встановіть 0 тут і на Підйом Води, щоб вимкнути Раптову Смерть.</translation>
     </message>
     <message>
         <source>Maximum rope length in percent</source>
@@ -2045,11 +2177,11 @@
     </message>
     <message>
         <source>Likelihood of a dropped crate being a health crate. All other crates will be weapon or utility crates.</source>
-        <translation type="unfinished"></translation>
+        <translation>Ймовірність того, що кинутий ящик - з аптечкою. Інші ящики містять зброю або пристрої.</translation>
     </message>
     <message>
         <source>Likelihood of a crate dropping before a turn</source>
-        <translation type="unfinished"></translation>
+        <translation>Ймовірність падіння ящика перед ходом</translation>
     </message>
     <message>
         <source>Health bonus for collecting a health crate</source>
@@ -2057,27 +2189,27 @@
     </message>
     <message>
         <source>Detonation timer of mines. The random timer lies between 0 and 5 seconds. The timer of air mines will be a quarter of the mines timer.</source>
-        <translation type="unfinished"></translation>
+        <translation>Таймер детонації мін. Випадковий таймер знаходиться в діапазоні від 0 до 5 секунд. Таймер повітряних мін складає чверть таймера мін.</translation>
     </message>
     <message>
         <source>Average number of mines to be placed a medium-sized island map. This number will be scaled for other maps.</source>
-        <translation type="unfinished"></translation>
+        <translation>Середня кількість мін для розміщення на острівній мапі середнього розміру. Кількість масштабується для інших мап.</translation>
     </message>
     <message>
         <source>Likelihood of a mine being a dud. Does not affect mines placed by hedgehogs.</source>
-        <translation type="unfinished"></translation>
+        <translation>Ймовірність того, що міна зіпсована. Не впливає на міни, розміщені їжаками.</translation>
     </message>
     <message>
         <source>Average number of barrels to be placed a medium-sized island map. This number will be scaled for other maps.</source>
-        <translation type="unfinished"></translation>
+        <translation>Середня кількість бочок для розміщення на острівній мапі середнього розміру. Кількість масштабується для інших мап.</translation>
     </message>
     <message>
         <source>Average number of air mines to be placed a medium-sized island map. This number will be scaled for other maps.</source>
-        <translation type="unfinished"></translation>
+        <translation>Середня кількість повітряних мін для розміщення на острівній мапі середнього розміру. Кількість масштабується для інших мап.</translation>
     </message>
     <message>
         <source>Affects the left and right boundaries of the map</source>
-        <translation type="unfinished"></translation>
+        <translation>Впливає на лівий і правий край мапи</translation>
     </message>
     <message>
         <source>Time you get after an attack</source>
@@ -2085,7 +2217,7 @@
     </message>
     <message>
         <source>Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty.</source>
-        <translation type="unfinished"></translation>
+        <translation>Додатковий параметр для налаштування стилів гри. Значення залежить від  стилю, зверніться до документації. Або залиште його порожнім.</translation>
     </message>
     <message>
         <source>Name of this scheme</source>
@@ -2139,7 +2271,7 @@
     </message>
     <message>
         <source>Practice your skills in a range of training missions</source>
-        <translation>Відточіть навики в тренувальних місіях</translation>
+        <translation type="vanished">Відточіть навики в тренувальних місіях</translation>
     </message>
     <message>
         <source>Watch recorded demos</source>
@@ -2149,6 +2281,10 @@
         <source>Load a previously saved game</source>
         <translation>Завантажити збережену гру</translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation>Місії одного гравця: Навчіться грі в тренуванні, тренуйте свої навички у викликах або спробуйте виконати цілі за сценаріями.</translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -2192,6 +2328,33 @@
         <source>Scenarios</source>
         <translation>Сценарії</translation>
     </message>
+    <message>
+        <source>Team</source>
+        <translation>Команда</translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation>Найкращий результат команди: %1</translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation>Найгірший результат команди: %1</translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation>Найвища точність команди: %1%</translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation>Кращий час команди: %L1 с</translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation>Найдовший час команди: %L1 с</translation>
+    </message>
 </context>
 <context>
     <name>PageVideos</name>
@@ -2643,7 +2806,7 @@
     </message>
     <message>
         <source>Damage Modifier</source>
-        <translation>Модифікатор Пошкодженнь</translation>
+        <translation>Модифікатор Пошкоджень</translation>
     </message>
     <message>
         <source>Turn Time</source>
@@ -2859,7 +3022,7 @@
     </message>
     <message>
         <source>Script parameter</source>
-        <translation type="unfinished"></translation>
+        <translation>Скриптовий параметр</translation>
     </message>
     <message>
         <source>Air Mines</source>
@@ -2875,7 +3038,8 @@
     </message>
     <message>
         <source>% Retreat Time</source>
-        <translation type="unfinished"></translation>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
+        <translation>% Часу Відступу</translation>
     </message>
     <message>
         <source>Stereoscopy</source>
@@ -2888,7 +3052,11 @@
     </message>
     <message>
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
-        <translation type="unfinished"></translation>
+        <translation>Завантажую&lt;br&gt;CAPTCHA ...</translation>
+    </message>
+    <message>
+        <source>Zoom (%)</source>
+        <translation>Масштаб (%)</translation>
     </message>
 </context>
 <context>
@@ -3199,6 +3367,16 @@
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation>Схема зброї з назвою &apos;%1&apos; вже існує. Зміни, внесені до схеми зброї, були відхилені.</translation>
     </message>
+    <message>
+        <source>Server redirection</source>
+        <translation>Перенаправлення сервера</translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation>Цей сервер підтримує безпечне з&apos;єднання на порту %1.
+Хочете з&apos;єднатися надійно?</translation>
+    </message>
 </context>
 <context>
     <name>QObject</name>
@@ -3235,7 +3413,7 @@
     </message>
     <message>
         <source>Specify</source>
-        <translation>Вказати</translation>
+        <translation type="vanished">Вказати</translation>
     </message>
     <message>
         <source>Start</source>
@@ -3329,6 +3507,10 @@
         <source>Start private server</source>
         <translation>Запутити приватний сервер</translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation>Вкажіть адресу</translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
@@ -3382,7 +3564,7 @@
     </message>
     <message>
         <source>Map</source>
-        <translation>Карта</translation>
+        <translation>Мапа</translation>
     </message>
     <message>
         <source>Rules</source>
@@ -3394,7 +3576,7 @@
     </message>
     <message>
         <source>Random Map</source>
-        <translation>Випадкова Карта</translation>
+        <translation>Випадкова Мапа</translation>
     </message>
     <message>
         <source>Random Maze</source>
@@ -3410,7 +3592,7 @@
     </message>
     <message>
         <source>Random Perlin</source>
-        <translation type="unfinished"></translation>
+        <translation>Випадковий шум</translation>
     </message>
     <message>
         <source>Forts</source>
@@ -3421,7 +3603,7 @@
     <name>SeedPrompt</name>
     <message>
         <source>The map seed is the basis for all random values generated by the game.</source>
-        <translation>Висів карти є основою для всіх випадкових величин, згенерованих грою.</translation>
+        <translation>Висів мапи є основою для всіх випадкових величин, згенерованих грою.</translation>
     </message>
     <message>
         <source>Cancel</source>
@@ -3561,7 +3743,7 @@
     </message>
     <message>
         <source>precise aim</source>
-        <translation>точна ціль</translation>
+        <translation>приціл</translation>
     </message>
     <message>
         <source>put</source>
@@ -3569,7 +3751,7 @@
     </message>
     <message>
         <source>switch</source>
-        <translation>переключити</translation>
+        <translation>переключення</translation>
     </message>
     <message>
         <source>find hedgehog</source>
@@ -3665,7 +3847,7 @@
     </message>
     <message>
         <source>capture</source>
-        <translation>знімок</translation>
+        <translation type="vanished">знімок</translation>
     </message>
     <message>
         <source>quit</source>
@@ -3681,7 +3863,7 @@
     </message>
     <message>
         <source>reset zoom</source>
-        <translation>скидання зуму</translation>
+        <translation type="vanished">скидання зуму</translation>
     </message>
     <message>
         <source>long jump</source>
@@ -3709,36 +3891,92 @@
     </message>
     <message>
         <source>autocam / find hedgehog</source>
-        <translation type="unfinished"></translation>
+        <translation>автокамера / знайти їжака</translation>
     </message>
     <message>
         <source>speed up replay</source>
-        <translation type="unfinished"></translation>
+        <translation>пришвидшити повтор</translation>
     </message>
     <message>
         <source>toggle team bars</source>
         <extracomment>This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen</extracomment>
-        <translation type="unfinished"></translation>
+        <translation>перемкнути смужки команд</translation>
     </message>
     <message>
         <source>pause / auto skip</source>
-        <translation type="unfinished"></translation>
+        <translation>пауза / автопропуск</translation>
     </message>
     <message>
         <source>toggle hedgehog tags</source>
-        <translation type="unfinished"></translation>
+        <translation>перемкнути теги їжаків</translation>
     </message>
     <message>
         <source>change timer</source>
-        <translation type="unfinished"></translation>
+        <translation>змінити таймер</translation>
     </message>
     <message>
         <source>show mission information</source>
-        <translation type="unfinished"></translation>
+        <translation>показати інфо про місію</translation>
     </message>
     <message>
         <source>clan chat</source>
-        <translation type="unfinished"></translation>
+        <translation>чат клану</translation>
+    </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation>зняти вибір зі зброї</translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation>спокійно стояти на слизькій землі</translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation>змінити напрямок без руху</translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation>переключити назад</translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation>змінити стрибучість</translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation>скинути масштаб до стартового</translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation>масштаб на 100%</translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation>зберегти мапу як зображення</translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation>показати інфо про об&apos;єкт</translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation>змінити типи тегів їжаків</translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation>перемкнути прозорість тегів їжаків</translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation>перемкнути HUD</translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation>стрибок назад</translation>
+    </message>
+    <message>
+        <source>screenshot</source>
+        <translation>знімок</translation>
     </message>
 </context>
 <context>
@@ -3761,6 +3999,49 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation>утримуйте приціл</translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation>приціл + вліво/вправо</translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation>приціл + переключення</translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation>приціл + таймер</translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation>приціл + скинути масштаб</translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation>приціл + перемкнути теги їжаків</translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation>переключення + перемкнути теги їжаків</translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation>приціл + переключення + перемкнути теги їжаків</translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation>високий стрмбок (двічі)</translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation>приціл + знімок</translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -3832,19 +4113,19 @@
     </message>
     <message>
         <source>Toggle automatic camera / refocus on active hedgehog:</source>
-        <translation type="unfinished"></translation>
+        <translation>Перемкнути автокамеру / фокус на активного їжака:</translation>
     </message>
     <message>
         <source>Demo replay:</source>
-        <translation type="unfinished"></translation>
+        <translation>Повтор демо:</translation>
     </message>
     <message>
         <source>Heads-up display:</source>
-        <translation type="unfinished"></translation>
+        <translation>Інтерфейс взаємодії:</translation>
     </message>
     <message>
         <source>Talk to your clan or all participants:</source>
-        <translation type="unfinished"></translation>
+        <translation>Говорити до клану або всіх учасників:</translation>
     </message>
 </context>
 <context>
@@ -3931,71 +4212,71 @@
     </message>
     <message>
         <source>Numpad 0</source>
-        <translation>Numpad 0</translation>
+        <translation type="vanished">Numpad 0</translation>
     </message>
     <message>
         <source>Numpad 1</source>
-        <translation>Numpad 1</translation>
+        <translation type="vanished">Numpad 1</translation>
     </message>
     <message>
         <source>Numpad 2</source>
-        <translation>Numpad 2</translation>
+        <translation type="vanished">Numpad 2</translation>
     </message>
     <message>
         <source>Numpad 3</source>
-        <translation>Numpad 3</translation>
+        <translation type="vanished">Numpad 3</translation>
     </message>
     <message>
         <source>Numpad 4</source>
-        <translation>Numpad 4</translation>
+        <translation type="vanished">Numpad 4</translation>
     </message>
     <message>
         <source>Numpad 5</source>
-        <translation>Numpad 5</translation>
+        <translation type="vanished">Numpad 5</translation>
     </message>
     <message>
         <source>Numpad 6</source>
-        <translation>Numpad 6</translation>
+        <translation type="vanished">Numpad 6</translation>
     </message>
     <message>
         <source>Numpad 7</source>
-        <translation>Numpad 7</translation>
+        <translation type="vanished">Numpad 7</translation>
     </message>
     <message>
         <source>Numpad 8</source>
-        <translation>Numpad 8</translation>
+        <translation type="vanished">Numpad 8</translation>
     </message>
     <message>
         <source>Numpad 9</source>
-        <translation>Numpad 9</translation>
+        <translation type="vanished">Numpad 9</translation>
     </message>
     <message>
         <source>Numpad .</source>
-        <translation>Numpad .</translation>
+        <translation type="vanished">Numpad .</translation>
     </message>
     <message>
         <source>Numpad /</source>
-        <translation>Numpad /</translation>
+        <translation type="vanished">Numpad /</translation>
     </message>
     <message>
         <source>Numpad *</source>
-        <translation>Numpad *</translation>
+        <translation type="vanished">Numpad *</translation>
     </message>
     <message>
         <source>Numpad -</source>
-        <translation>Numpad -</translation>
+        <translation type="vanished">Numpad -</translation>
     </message>
     <message>
         <source>Numpad +</source>
-        <translation>Numpad +</translation>
+        <translation type="vanished">Numpad +</translation>
     </message>
     <message>
         <source>Enter</source>
-        <translation>Enter</translation>
+        <translation type="vanished">Enter</translation>
     </message>
     <message>
         <source>Equals</source>
-        <translation>Дорівнює</translation>
+        <translation type="vanished">Дорівнює</translation>
     </message>
     <message>
         <source>Up</source>
@@ -4027,55 +4308,55 @@
     </message>
     <message>
         <source>Page up</source>
-        <translation>Page up</translation>
+        <translation type="vanished">Page up</translation>
     </message>
     <message>
         <source>Page down</source>
-        <translation>Page down</translation>
+        <translation type="vanished">Page down</translation>
     </message>
     <message>
         <source>Num lock</source>
-        <translation>Num lock</translation>
+        <translation type="vanished">Num lock</translation>
     </message>
     <message>
         <source>Caps lock</source>
-        <translation>Caps lock</translation>
+        <translation type="vanished">Caps lock</translation>
     </message>
     <message>
         <source>Scroll lock</source>
-        <translation>Scroll lock</translation>
+        <translation type="vanished">Scroll lock</translation>
     </message>
     <message>
         <source>Right shift</source>
-        <translation>Правий shift</translation>
+        <translation type="vanished">Правий shift</translation>
     </message>
     <message>
         <source>Left shift</source>
-        <translation>Лівий shift</translation>
+        <translation type="vanished">Лівий shift</translation>
     </message>
     <message>
         <source>Right ctrl</source>
-        <translation>Правий ctrl</translation>
+        <translation type="vanished">Правий ctrl</translation>
     </message>
     <message>
         <source>Left ctrl</source>
-        <translation>Лівий ctrl</translation>
+        <translation type="vanished">Лівий ctrl</translation>
     </message>
     <message>
         <source>Right alt</source>
-        <translation>Правий alt</translation>
+        <translation type="vanished">Правий alt</translation>
     </message>
     <message>
         <source>Left alt</source>
-        <translation>Лівий alt</translation>
+        <translation type="vanished">Лівий alt</translation>
     </message>
     <message>
         <source>Right meta</source>
-        <translation>Права Meta</translation>
+        <translation type="vanished">Права Meta</translation>
     </message>
     <message>
         <source>Left meta</source>
-        <translation>Ліва Meta</translation>
+        <translation type="vanished">Ліва Meta</translation>
     </message>
     <message>
         <source>A button</source>
@@ -4176,6 +4457,609 @@
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation>PageUp</translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation>PageDown</translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation>Numlock</translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation>CapsLock</translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation>ScrollLock</translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation>Правий Shift</translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation>Лівий Shift</translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation>Правий Ctrl</translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation>Лівий Ctrl</translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation>Правий Alt</translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation>Лівий Alt</translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation>Права GUI</translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation>Ліва GUI</translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation>(QWERTY)</translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation>Меню</translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation>Програмування</translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation>Ігровий рушій</translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation>Творець</translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation>Багато покращень рушія</translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation>Інтеграція геймпадів та Lua</translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation>Підтримка кампанії</translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation>Покращення налаштувань тем</translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation>Певна робота з Pas2C та GLES2</translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation>Запис відео</translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation>Інші покращення</translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation>Генерування мап</translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation>Генератори основних мап</translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation>Карти з шуму та інші покращення</translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation>Мапи з лабіринтами</translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation>Зброя</translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation>Більшість основної зброї</translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation>Холодильник</translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation>Фронтенд / головне меню</translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation>Багато покращень фронтенду</translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation>Діалоги входу, інші покращення</translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation>Місії та стилі</translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation>Класична казка</translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation>Космічна пригода</translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation>Деякі стилі і місії</translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation>Командна робота 2</translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation>Ігровий сервер</translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation>Порти</translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation>Порт на macOS/iPhone, конвертація на OpenGL-ES</translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation>Порт для Android</translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation>Мережева гра на Android, портативність</translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation>Порт на WebGL</translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation>Порти для iPhone/iPad</translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation>Графіка</translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation>Основні</translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation>Теми</translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation>Природа, Сніг, Місто, Замок, Хелоуін, Острів</translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation>Голковуд</translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation>Фрукти, Торт</translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation>Мистецтво</translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation>Пляж</translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation>Цегла</translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation>Пекло</translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation>Джунглі</translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation>Вівця</translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation>Мапи</translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation>Поле бою</translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation>Сир</translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation>портал</translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation>Лінійка</translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation>Форти</translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation>Танк</translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation>Равлик</translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation>Капелюхи, надгробки, інше</translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation>Дивіться в файлі  CREDITS</translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation>Звуки</translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation>Голос їжаків</translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation>Голоси Default_pl, Russian_pl</translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation>Різні автори з www.freesound.org (дивіться файл CREDITS)</translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation>Музика</translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation>Сміття</translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation>Фрукти, Джунглі</translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation>Природа</translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation>Локалізації</translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation>Бразильська португальська</translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation>Болгарська</translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation>Чеська</translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation>Китайська</translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation>Фінська</translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation>Французька</translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation>Німецька</translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation>Грецька</translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation>Італійська</translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation>Японська</translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation>Корейська</translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation>Литовська</translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation>Польська</translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation>Португальська</translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation>Російська</translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation>Шотландська гаельська</translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation>Словацька</translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation>Іспанська</translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation>Шведська</translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation>Українська</translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation>Особлива подяка</translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation>Засновник проекту</translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -4344,10 +5228,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>The game can&apos;t be started with less than two clans!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4640,10 +5520,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>&apos;Registered only&apos; state toggled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Super power activated.</source>
         <translation>Суперсила активована.</translation>
     </message>
@@ -4707,5 +5583,25 @@
         <source>This command is only available in rooms.</source>
         <translation>Ця команда працює лише в кімнатах.</translation>
     </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 </TS>
--- a/share/hedgewars/Data/Locale/hedgewars_zh_CN.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_zh_CN.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -4,95 +4,148 @@
 <context>
     <name>About</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="76"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="92"/>
+        <source>Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="171"/>
+        <source>Other people</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="181"/>
+        <source>%1 (alias %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="202"/>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="208"/>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="217"/>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="265"/>
         <source>Hedgewars %1</source>
         <extracomment>%1 contains Hedgewars&apos; version number</extracomment>
         <translation type="unfinished">刺猬大作战 %1</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="78"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="267"/>
         <source>Revision %1 (%2)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="80"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="269"/>
         <source>Visit our homepage: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="83"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="272"/>
         <source>This program is distributed under the %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="86"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="275"/>
         <source>GNU GPL v2</source>
         <extracomment>Short for “GNU General Public License version 2”</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="101"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="304"/>
+        <source>Extended Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="305"/>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="314"/>
         <source>Dependency versions:</source>
         <extracomment>For the version numbers of Hedgewars&apos; software dependencies</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="104"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="317"/>
         <source>&lt;a href=&quot;https://gcc.gnu.org&quot;&gt;GCC&lt;/a&gt;: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="107"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="319"/>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="321"/>
+        <source>Unknown Compiler: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="323"/>
         <source>Unknown Compiler</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="114"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="331"/>
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="121"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="338"/>
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_mixer&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="135"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="352"/>
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_net&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="150"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="367"/>
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_image&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="165"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="382"/>
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_ttf&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="175"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="392"/>
         <source>&lt;a href=&quot;https://www.qt.io/developers/&quot;&gt;Qt&lt;/a&gt;: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="179"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="396"/>
         <source>&lt;a href=&quot;https://libav.org&quot;&gt;libavcodec&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="184"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="401"/>
         <source>&lt;a href=&quot;https://libav.org&quot;&gt;libavformat&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="189"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="406"/>
         <source>&lt;a href=&quot;https://libav.org&quot;&gt;libavutil&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="196"/>
+        <location filename="../../../../QTfrontend/ui/widget/about.cpp" line="413"/>
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
         <translation type="unfinished"></translation>
     </message>
@@ -176,7 +229,7 @@
 <context>
     <name>DataManager</name>
     <message>
-        <location filename="../../../../QTfrontend/util/DataManager.cpp" line="155"/>
+        <location filename="../../../../QTfrontend/util/DataManager.cpp" line="159"/>
         <source>Use Default</source>
         <translation type="unfinished"></translation>
     </message>
@@ -257,12 +310,12 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="171"/>
+        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="172"/>
         <source>Edit weapons</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="179"/>
+        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="181"/>
         <source>Game scheme will auto-select a weapon</source>
         <translation type="unfinished"></translation>
     </message>
@@ -279,22 +332,22 @@
         <translation type="obsolete">新</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/model/gameSchemeModel.cpp" line="924"/>
+        <location filename="../../../../QTfrontend/model/gameSchemeModel.cpp" line="1025"/>
         <source>New</source>
         <translation type="unfinished">新游戏</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/model/gameSchemeModel.cpp" line="929"/>
+        <location filename="../../../../QTfrontend/model/gameSchemeModel.cpp" line="1030"/>
         <source>New (%1)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/model/gameSchemeModel.cpp" line="938"/>
+        <location filename="../../../../QTfrontend/model/gameSchemeModel.cpp" line="1039"/>
         <source>Copy of %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/model/gameSchemeModel.cpp" line="943"/>
+        <location filename="../../../../QTfrontend/model/gameSchemeModel.cpp" line="1044"/>
         <source>Copy of %1 (%2)</source>
         <translation type="unfinished"></translation>
     </message>
@@ -302,7 +355,7 @@
 <context>
     <name>GameUIConfig</name>
     <message>
-        <location filename="../../../../QTfrontend/gameuiconfig.cpp" line="117"/>
+        <location filename="../../../../QTfrontend/gameuiconfig.cpp" line="536"/>
         <source>Guest</source>
         <translation type="unfinished"></translation>
     </message>
@@ -360,68 +413,72 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="153"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="172"/>
         <source>Usage</source>
         <comment>command-line</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="154"/>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/main.cpp" line="175"/>
         <source>OPTION</source>
         <comment>command-line</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="155"/>
-        <location filename="../../../../QTfrontend/main.cpp" line="160"/>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/main.cpp" line="178"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="185"/>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="156"/>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/main.cpp" line="181"/>
         <source>Options</source>
         <comment>command-line</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="157"/>
+        <extracomment>“Options” as in “command-line options”</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/main.cpp" line="182"/>
         <source>Display this help</source>
         <comment>command-line</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="158"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="183"/>
         <source>Custom path for configuration data and user data</source>
         <comment>command-line</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="159"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="184"/>
         <source>Custom path to the game data folder</source>
         <comment>command-line</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="160"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="185"/>
         <source>Hedgewars can use a %1 (e.g. &quot;%2&quot;) to connect on start.</source>
         <comment>command-line</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="205"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="430"/>
         <source>Malformed option argument: %1</source>
         <comment>command-line</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="245"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="439"/>
         <source>Unknown option argument: %1</source>
         <comment>command-line</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="337"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="370"/>
         <source>Failed to open data directory:
 %1
 
@@ -460,62 +517,62 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="545"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="553"/>
         <source>%1 has left</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="550"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="558"/>
         <source>%1 has left (%2)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="689"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="697"/>
         <source>%1 has been removed from your ignore list</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="699"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="707"/>
         <source>%1 has been added to your ignore list</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="729"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="737"/>
         <source>%1 has been removed from your friends list</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="738"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="746"/>
         <source>%1 has been added to your friends list</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="806"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="814"/>
         <source>Stylesheet imported from %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="807"/>
-        <source>Enter %1 if you want to use the current StyleSheet in future, enter %2 to reset!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="815"/>
-        <source>Couldn&apos;t read %1</source>
+        <source>Enter %1 if you want to use the current StyleSheet in future, enter %2 to reset!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="823"/>
+        <source>Couldn&apos;t read %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="831"/>
         <source>StyleSheet discarded</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="847"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="855"/>
         <source>StyleSheet saved to %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="850"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="858"/>
         <source>Failed to save StyleSheet to %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -523,47 +580,39 @@
 <context>
     <name>HWForm</name>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="170"/>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="519"/>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1507"/>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1526"/>
-        <source>Guest</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="527"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="544"/>
         <source>Team 1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="532"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="549"/>
         <source>%1&apos;s Team</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="551"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="569"/>
         <source>Team %1</source>
         <extracomment>Default team name</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="562"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="581"/>
         <source>Computer %1</source>
         <extracomment>Default computer team name</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="738"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="767"/>
         <source>Game aborted</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1186"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1220"/>
         <source>Hedgewars - Nick registered</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1187"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1221"/>
         <source>This nick is registered, and you haven&apos;t specified a password.
 
 If this nick isn&apos;t yours, please register your own nick at www.hedgewars.org
@@ -572,119 +621,119 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1215"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1249"/>
         <source>Your nickname is not registered.
 To prevent someone else from using it,
 please register it at www.hedgewars.org</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1220"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1254"/>
         <source>
 
 Your password wasn&apos;t saved either.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1232"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1266"/>
         <source>Nickname</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1232"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1266"/>
         <source>Someone already uses your nickname %1 on the server.
 Please pick another nickname:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1237"/>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1560"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1271"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1596"/>
         <source>No nickname supplied.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1237"/>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1560"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1271"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1596"/>
         <source>Hedgewars - Empty nickname</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1264"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1298"/>
         <source>Hedgewars - Wrong password</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1264"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1298"/>
         <source>You entered a wrong password.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1276"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1310"/>
         <source>Room password</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1276"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1310"/>
         <source>The room is protected with password.
 Please, enter the password:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1292"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1326"/>
         <source>Try Again</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1664"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1700"/>
         <source>Hedgewars - Connection error</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1664"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1700"/>
         <source>You reconnected too fast.
 Please wait a few seconds and try again.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2146"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2341"/>
         <source>Hedgewars Demo File</source>
         <comment>File Types</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2147"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2342"/>
         <source>Hedgewars Save File</source>
         <comment>File Types</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2208"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2404"/>
         <source>Demo name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2208"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2404"/>
         <source>Demo name:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2282"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2478"/>
         <source>Unknown network error (possibly missing SSL library).</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2286"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2482"/>
         <source>This feature requires an Internet connection, but you don&apos;t appear to be online (error code: %1).</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2291"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2487"/>
         <source>Internal error: Reply object is invalid.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1830"/>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2216"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1889"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2412"/>
         <source>Cannot save record to file %1</source>
         <translation>无法录入文件 %1</translation>
     </message>
@@ -692,7 +741,7 @@
 <context>
     <name>HWGame</name>
     <message>
-        <location filename="../../../../QTfrontend/game.cpp" line="258"/>
+        <location filename="../../../../QTfrontend/game.cpp" line="433"/>
         <source>A fatal ERROR occured! The game engine had to stop.
 
 We are very sorry for the inconvenience. :-(
@@ -704,14 +753,14 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/game.cpp" line="404"/>
-        <location filename="../../../../QTfrontend/net/recorder.cpp" line="114"/>
+        <location filename="../../../../QTfrontend/game.cpp" line="587"/>
+        <location filename="../../../../QTfrontend/net/recorder.cpp" line="125"/>
         <source>en.txt</source>
         <extracomment>IMPORTANT: This text has a special meaning, do not translate it directly. This is the file name of translation files for the game engine, found in Data/Locale/. Usually, you replace “en” with the ISO-639-1 language code of your language.</extracomment>
         <translation>zh_CN.txt</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/game.cpp" line="457"/>
+        <location filename="../../../../QTfrontend/game.cpp" line="646"/>
         <source>Cannot open demofile %1</source>
         <translation>DEMO %1 打不开</translation>
     </message>
@@ -727,12 +776,12 @@
 <context>
     <name>HWMapContainer</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="264"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="284"/>
         <source>Small tunnels</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="265"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="285"/>
         <source>Medium tunnels</source>
         <translation type="unfinished"></translation>
     </message>
@@ -798,158 +847,173 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="232"/>
-        <source>Load map drawing</source>
-        <translation type="unfinished"></translation>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="236"/>
+        <source>Load</source>
+        <translation type="unfinished">读取</translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="238"/>
-        <source>Edit map drawing</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="251"/>
-        <source>All</source>
-        <translation>全部</translation>
+        <source>Load map drawing</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="252"/>
-        <source>Small</source>
-        <translation>小型</translation>
+        <source>Edit</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="253"/>
+        <source>Edit map drawing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="271"/>
+        <source>All</source>
+        <translation>全部</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="272"/>
+        <source>Small</source>
+        <translation>小型</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="273"/>
         <source>Medium</source>
         <translation>中型</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="254"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="274"/>
         <source>Large</source>
         <translation>大型</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="255"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="275"/>
         <source>Cavern</source>
         <translation>洞穴</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="256"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="276"/>
         <source>Wacky</source>
         <translation>曲折</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="266"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="286"/>
         <source>Large tunnels</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="267"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="287"/>
         <source>Small islands</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="268"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="288"/>
         <source>Medium islands</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="269"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="289"/>
         <source>Large islands</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="303"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="324"/>
         <source>Randomize the theme</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="313"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="334"/>
         <source>Choose a theme</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="917"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="938"/>
         <source>Randomize the map, theme and seed</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="918"/>
-        <source>Randomize the theme and seed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="919"/>
-        <source>Randomize the seed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="920"/>
-        <source>Click to randomize the map, theme and seed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="921"/>
-        <source>Click to randomize the theme and seed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="922"/>
-        <source>Adjust the complexity of the generated map</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="923"/>
-        <source>Adjust the distance between forts</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="939"/>
+        <source>Randomize the theme and seed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="940"/>
+        <source>Randomize the seed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="941"/>
+        <source>Click to randomize the map, theme and seed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="942"/>
+        <source>Click to randomize the theme and seed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="943"/>
+        <source>Adjust the complexity of the generated map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="944"/>
+        <source>Adjust the distance between forts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="945"/>
+        <source>Scale size of the drawn map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="961"/>
         <source>Click to edit</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="971"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="994"/>
         <source>Map size:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="978"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1001"/>
         <source>Maze style:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="985"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1008"/>
         <source>Style:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1000"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1023"/>
         <source>Mission:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1020"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1043"/>
         <source>Map:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1121"/>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1313"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1140"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1342"/>
         <source>Theme: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1214"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1242"/>
         <source>Load drawn map</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1214"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1242"/>
         <source>Drawn Maps</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1214"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1242"/>
         <source>All files</source>
         <translation type="unfinished"></translation>
     </message>
@@ -977,12 +1041,12 @@
 <context>
     <name>HWNewNet</name>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="234"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="246"/>
         <source>Remote host has closed connection</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="237"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="249"/>
         <source>The host was not found. Please check the host name and port settings.</source>
         <translation>错误没找到这个主机。请检查主机名和端口设置。</translation>
     </message>
@@ -991,12 +1055,12 @@
         <translation type="vanished">连接被拒绝</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="242"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="254"/>
         <source>The connection was refused by the official server or timed out. Something seems to be wrong with the official server at the moment. This might be a temporary problem. Please try again later.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="245"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="257"/>
         <source>The connection was refused by the host or timed out. This might have one of the following reasons:
 - The Hedgewars Server program does currently not run on the host
 - The specified port number is incorrect
@@ -1006,28 +1070,28 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="307"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="351"/>
         <source>The server is too old. Disconnecting now.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="579"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="632"/>
         <source>Server authentication error</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="891"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="966"/>
         <source>%1 *** %2 has left</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="895"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="970"/>
         <source>%1 *** %2 has left (%3)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="744"/>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="876"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="797"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="951"/>
         <source>%1 *** %2 has joined the room</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1036,17 +1100,17 @@
         <translation type="vanished">退出原因:</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="801"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="868"/>
         <source>Room destroyed</source>
         <translation>房间损坏</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="558"/>
+        <location filename="../../../../QTfrontend/net/newnetclient.cpp" line="611"/>
         <source>You got kicked</source>
         <translation>被踢出</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1685"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1721"/>
         <source>Reason:</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1083,6 +1147,21 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <location filename="../../../../QTfrontend/net/recorder.cpp" line="83"/>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>HatButton</name>
     <message>
         <location filename="../../../../QTfrontend/ui/widget/hatbutton.cpp" line="44"/>
@@ -1123,7 +1202,12 @@
 <context>
     <name>KeyBinder</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/keybinder.cpp" line="101"/>
+        <location filename="../../../../QTfrontend/ui/widget/keybinder.cpp" line="95"/>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/widget/keybinder.cpp" line="108"/>
         <source>Category</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1131,50 +1215,51 @@
 <context>
     <name>LibavInteraction</name>
     <message>
-        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="295"/>
+        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="293"/>
         <source>Duration: %1min %2s</source>
         <extracomment>Duration in minutes and seconds (SI units)</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="314"/>
+        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="312"/>
         <source>Video: %1x%2, %3 FPS, %4</source>
         <extracomment>Video metadata. %1 = video width, %2 = video height, %3 = frames per second = %4 = decoder name</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="319"/>
+        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="317"/>
         <source>Video: %1x%2, %3</source>
         <extracomment>Video metadata. %1 = video width, %2 = video height, %3 = decoder name</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="352"/>
+        <source>Player: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
         <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="354"/>
-        <source>Player: %1</source>
+        <source>Theme: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="356"/>
-        <source>Theme: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="358"/>
         <source>Map: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="361"/>
+        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="359"/>
         <source>Record: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="324"/>
+        <extracomment>As in ‘recording’</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="322"/>
         <source>Audio: </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="307"/>
+        <location filename="../../../../QTfrontend/util/LibavInteraction.cpp" line="305"/>
         <source>unknown</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1424,103 +1509,103 @@
 <context>
     <name>PageEditTeam</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="46"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="49"/>
         <source>Select an action to choose a custom key bind for this team</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="46"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="49"/>
         <source>Use my default</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="46"/>
-        <source>Reset all binds</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="48"/>
-        <source>General</source>
-        <translation>常规</translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="49"/>
+        <source>Reset all binds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="51"/>
+        <source>General</source>
+        <translation>常规</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="52"/>
         <source>Custom Controls</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="67"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="70"/>
         <source>Hat</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="68"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="71"/>
         <source>Name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="79"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="82"/>
         <source>This hedgehog&apos;s name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="85"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="88"/>
         <source>Randomize this hedgehog&apos;s name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="89"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="92"/>
         <source>Random Hats</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="95"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="98"/>
         <source>Random Names</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="103"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="106"/>
         <source>Random Team</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="196"/>
-        <source>Randomize the team name</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="199"/>
-        <source>Randomize the grave</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="202"/>
+        <source>Randomize the team name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="205"/>
+        <source>Randomize the grave</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="208"/>
         <source>Randomize the flag</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="211"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="217"/>
         <source>Play a random example of this voice</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="214"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="220"/>
         <source>Randomize the voice</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="227"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="233"/>
         <source>Randomize the fort</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="432"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="438"/>
         <source>CPU %1</source>
         <extracomment>Name of a flag for computer-controlled enemies. %1 is replaced with the computer level</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="650"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="664"/>
         <source>%1 (%2)</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1528,54 +1613,54 @@
 <context>
     <name>PageGameStats</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="61"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="59"/>
         <source>Details</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="76"/>
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="167"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="74"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="177"/>
         <source>Health graph</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="94"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="93"/>
         <source>Ranking</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="120"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="119"/>
         <source>Play again</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="125"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="124"/>
         <source>Save</source>
         <translation type="unfinished">保存</translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="267"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="309"/>
         <source>The best shot award was won by &lt;b&gt;%1&lt;/b&gt; with &lt;b&gt;%2&lt;/b&gt; pts.</source>
         <translation type="unfinished">
             <numerusform></numerusform>
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="275"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="317"/>
         <source>The best killer is &lt;b&gt;%1&lt;/b&gt; with &lt;b&gt;%2&lt;/b&gt; kills in a turn.</source>
         <translation type="unfinished">
             <numerusform></numerusform>
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="282"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="324"/>
         <source>A total of &lt;b&gt;%1&lt;/b&gt; hedgehog(s) were killed during this round.</source>
         <translation type="unfinished">
             <numerusform></numerusform>
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="356"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="399"/>
         <source>(%1 kill)</source>
         <extracomment>Number of kills in stats screen, written after the team name</extracomment>
         <translation type="unfinished">
@@ -1583,7 +1668,31 @@
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="359"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="402"/>
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="405"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="409"/>
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="413"/>
+        <source>(%1 crate(s))</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="418"/>
         <source>(%1 %2)</source>
         <extracomment>For custom number of points in the stats screen, written after the team name. %1 is the number, %2 is the word. Example: “4 points”</extracomment>
         <translation type="unfinished">
@@ -1591,28 +1700,28 @@
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="373"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="433"/>
         <source>&lt;b&gt;%1&lt;/b&gt; thought it&apos;s good to shoot their own hedgehogs for &lt;b&gt;%2&lt;/b&gt; pts.</source>
         <translation type="unfinished">
             <numerusform></numerusform>
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="381"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="441"/>
         <source>&lt;b&gt;%1&lt;/b&gt; killed &lt;b&gt;%2&lt;/b&gt; of their own hedgehogs.</source>
         <translation type="unfinished">
             <numerusform></numerusform>
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="389"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="449"/>
         <source>&lt;b&gt;%1&lt;/b&gt; was scared and skipped turn &lt;b&gt;%2&lt;/b&gt; times.</source>
         <translation type="unfinished">
             <numerusform></numerusform>
         </translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="406"/>
+        <location filename="../../../../QTfrontend/ui/page/pagegamestats.cpp" line="466"/>
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1667,46 +1776,47 @@
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="79"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="83"/>
         <source>Read about who is behind the Hedgewars Project</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="82"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="86"/>
         <source>Feedback</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="84"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="88"/>
         <source>Leave a feedback here reporting issues, suggesting features or just saying how you like Hedgewars</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="87"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="91"/>
         <source>Downloadable Content</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="89"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="93"/>
         <source>Access the user created content downloadable from our website</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="109"/>
-        <source>Exit game</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="113"/>
-        <source>Manage videos recorded from game</source>
+        <source>Exit game</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="117"/>
+        <source>Manage videos recorded from game</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="121"/>
         <source>Open the Hedgewars online game manual in your web browser</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="120"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="124"/>
         <source>Edit game preferences</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1730,6 +1840,29 @@
     </message>
 </context>
 <context>
+    <name>PageNet</name>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="50"/>
+        <source>Connect to the selected server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="65"/>
+        <source>Update the list of servers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="71"/>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="82"/>
+        <source>Start private server</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>PageNetGame</name>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagenetgame.cpp" line="52"/>
@@ -1808,7 +1941,7 @@
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="97"/>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="246"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="255"/>
         <source>Game</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1853,179 +1986,180 @@
         <translation>新队伍</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="149"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="150"/>
         <source>Edit team</source>
         <translation>修改队伍设定</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="157"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="159"/>
         <source>Delete team</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="165"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="168"/>
         <source>You can&apos;t edit teams from team selection. Go back to main menu to add, edit or delete teams.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="172"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="175"/>
         <source>Schemes</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="183"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="186"/>
         <source>New scheme</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="190"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="194"/>
         <source>Edit scheme</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="197"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="202"/>
         <source>Delete scheme</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="205"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="211"/>
         <source>Weapons</source>
         <translation type="unfinished">武器</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="216"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="222"/>
         <source>New weapon set</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="223"/>
-        <source>Edit weapon set</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="230"/>
+        <source>Edit weapon set</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="238"/>
         <source>Delete weapon set</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="283"/>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="806"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="292"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="829"/>
         <source>x</source>
         <extracomment>Multiplication sign, to be used between two numbers. Note the “x” is only a dummy character, we recommend to use “×” if your language permits it</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="415"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="437"/>
         <source>Frontend</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="433"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="455"/>
         <source>Custom colors</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="463"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="485"/>
         <source>Reset to default colors</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="476"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="498"/>
         <source>Game audio</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="522"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="544"/>
         <source>Frontend audio</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="545"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="567"/>
         <source>Account</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="571"/>
-        <source>Proxy settings</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="577"/>
-        <source>Proxy host</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="578"/>
-        <source>Proxy port</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="579"/>
-        <source>Proxy login</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="580"/>
-        <source>Proxy password</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="593"/>
+        <source>Proxy settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="599"/>
+        <source>Proxy host</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="600"/>
+        <source>Proxy port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="601"/>
+        <source>Proxy login</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="602"/>
+        <source>Proxy password</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="615"/>
         <source>No proxy</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="594"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="616"/>
         <source>System proxy settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="595"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="617"/>
         <source>Socks5 proxy</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="596"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="618"/>
         <source>HTTP proxy</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="631"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="653"/>
         <source>Miscellaneous</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="667"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="690"/>
         <source>MISSING LANGUAGE NAME [%1]</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="699"/>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="722"/>
         <source>Updates</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="712"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="735"/>
         <source>Check for updates</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="713"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="736"/>
         <source>Check now</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="726"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="749"/>
         <source>Video recording options</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="995"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="1018"/>
         <source>Can&apos;t delete last team</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="995"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="1018"/>
         <source>You can&apos;t delete the last team!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2048,12 +2182,12 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="151"/>
+        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="152"/>
         <source>Rename dialog</source>
         <translation>重命名对话框</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="151"/>
+        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="152"/>
         <source>Enter new file name:</source>
         <translation>输入新的文件名:</translation>
     </message>
@@ -2094,7 +2228,7 @@
         <translation type="obsolete">加入</translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="544"/>
+        <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="546"/>
         <source>%1 players online</source>
         <translation type="unfinished">
             <numerusform></numerusform>
@@ -2109,262 +2243,263 @@
 <context>
     <name>PageScheme</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="81"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="84"/>
         <source>Add an indestructible border around the terrain</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="97"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="100"/>
         <source>Lower gravity</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="149"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="152"/>
         <source>Assisted aiming with laser sight</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="129"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="132"/>
         <source>All hogs have a personal forcefield</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="121"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="124"/>
         <source>All (living) hedgehogs are fully restored at the end of turn</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="113"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="116"/>
         <source>Gain 80% of the damage you do back in health</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="117"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="120"/>
         <source>Share your opponents pain, share their damage</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="109"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="112"/>
         <source>Your hogs are unable to move, put your artillery skills to the test</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="153"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="156"/>
         <source>Order of play is random instead of in room order.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="169"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="172"/>
         <source>Play with a King. If he dies, your side dies.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="157"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="160"/>
         <source>Take turns placing your hedgehogs before the start of play.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="137"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="140"/>
         <source>Ammo is shared between all teams that share a colour.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="73"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="76"/>
         <source>Disable girders when generating random maps.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="77"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="80"/>
         <source>Disable land objects when generating random maps.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="125"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="128"/>
         <source>AI respawns on death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="145"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="148"/>
         <source>Attacking does not end your turn.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="141"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="144"/>
         <source>Weapons are reset to starting values each turn.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="133"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="136"/>
         <source>Each hedgehog has its own ammo. It does not share with the team.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="101"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="104"/>
         <source>You will not have to worry about wind anymore.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="105"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="108"/>
         <source>Wind will affect almost everything.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="165"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="168"/>
         <source>Teams in each clan take successive turns sharing their turn time.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="85"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="88"/>
         <source>Add an indestructible border along the bottom</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="89"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="92"/>
         <source>Select a hedgehog at the beginning of a turn</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="93"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="96"/>
         <source>Land can not be destroyed by most weapons.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="161"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="164"/>
         <source>Each clan starts in its own part of the terrain.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="175"/>
-        <source>Overall damage and knockback in percent</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="176"/>
-        <source>Turn time in seconds</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="177"/>
-        <source>Initial health of hedgehogs</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="178"/>
-        <source>How many rounds have to be played before Sudden Death begins</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="179"/>
-        <source>How much the water rises per turn while in Sudden Death. Set to 0 along with Sudden Death Health Decrease to disable Sudden Death.</source>
+        <source>Overall damage and knockback in percent</source>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="180"/>
-        <source>How much health hedgehogs lose per turn while in Sudden Death, down to 1 health. Set to 0 along with Sudden Death Water Rise to disable Sudden Death.</source>
+        <source>Turn time in seconds</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="181"/>
-        <source>Maximum rope length in percent</source>
+        <source>Initial health of hedgehogs</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="182"/>
-        <source>Likelihood of a dropped crate being a health crate. All other crates will be weapon or utility crates.</source>
+        <source>How many rounds have to be played before Sudden Death begins</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="183"/>
-        <source>Likelihood of a crate dropping before a turn</source>
+        <source>How much the water rises per turn while in Sudden Death. Set to 0 along with Sudden Death Health Decrease to disable Sudden Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="184"/>
-        <source>Health bonus for collecting a health crate</source>
+        <source>How much health hedgehogs lose per turn while in Sudden Death, down to 1 health. Set to 0 along with Sudden Death Water Rise to disable Sudden Death.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="185"/>
-        <source>Detonation timer of mines. The random timer lies between 0 and 5 seconds. The timer of air mines will be a quarter of the mines timer.</source>
+        <source>Maximum rope length in percent</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="186"/>
-        <source>Average number of mines to be placed a medium-sized island map. This number will be scaled for other maps.</source>
+        <source>Likelihood of a dropped crate being a health crate. All other crates will be weapon or utility crates.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="187"/>
-        <source>Likelihood of a mine being a dud. Does not affect mines placed by hedgehogs.</source>
+        <source>Likelihood of a crate dropping before a turn</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="188"/>
-        <source>Average number of barrels to be placed a medium-sized island map. This number will be scaled for other maps.</source>
+        <source>Health bonus for collecting a health crate</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="189"/>
-        <source>Average number of air mines to be placed a medium-sized island map. This number will be scaled for other maps.</source>
+        <source>Detonation timer of mines. The random timer lies between 0 and 5 seconds. The timer of air mines will be a quarter of the mines timer.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="190"/>
-        <source>Affects the left and right boundaries of the map</source>
+        <source>Average number of mines to be placed a medium-sized island map. This number will be scaled for other maps.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="191"/>
-        <source>Time you get after an attack</source>
+        <source>Likelihood of a mine being a dud. Does not affect mines placed by hedgehogs.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="192"/>
+        <source>Average number of barrels to be placed a medium-sized island map. This number will be scaled for other maps.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="193"/>
+        <source>Average number of air mines to be placed a medium-sized island map. This number will be scaled for other maps.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="194"/>
+        <source>Affects the left and right boundaries of the map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="195"/>
+        <source>Time you get after an attack</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="196"/>
         <source>Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="490"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="495"/>
         <source>None (Default)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="491"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="496"/>
         <source>Wrap (World wraps)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="492"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="497"/>
         <source>Bounce (Edges reflect)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="493"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="498"/>
         <source>Sea (Edges connect to sea)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="518"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="526"/>
         <source>Name of this scheme</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="533"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="541"/>
         <source>Copy</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="534"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="543"/>
         <source>New</source>
         <translation>新游戏</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="535"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="545"/>
         <source>Delete</source>
         <translation>删除</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="699"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="713"/>
         <source>%1 (%2)</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2377,17 +2512,17 @@
         <translation type="unfinished">新游戏</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageselectweapon.cpp" line="49"/>
+        <location filename="../../../../QTfrontend/ui/page/pageselectweapon.cpp" line="50"/>
         <source>Default</source>
         <translation>默认</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageselectweapon.cpp" line="52"/>
+        <location filename="../../../../QTfrontend/ui/page/pageselectweapon.cpp" line="54"/>
         <source>Copy</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageselectweapon.cpp" line="53"/>
+        <location filename="../../../../QTfrontend/ui/page/pageselectweapon.cpp" line="56"/>
         <source>Delete</source>
         <translation>删除</translation>
     </message>
@@ -2411,7 +2546,7 @@
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagesingleplayer.cpp" line="51"/>
-        <source>Practice your skills in a range of training missions</source>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2428,48 +2563,81 @@
 <context>
     <name>PageTraining</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="91"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="101"/>
         <source>Pick the training to play</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="94"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="104"/>
         <source>Pick the challenge to play</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="97"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="107"/>
         <source>Pick the scenario to play</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="99"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="109"/>
         <source>Trainings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="100"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="110"/>
         <source>Challenges</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="101"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="111"/>
         <source>Scenarios</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="116"/>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="315"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="114"/>
+        <source>Team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="132"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="338"/>
         <source>Start fighting</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="324"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="344"/>
         <source>No description available</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="332"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="355"/>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="360"/>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="365"/>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="370"/>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="375"/>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="383"/>
         <source>Select a mission!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2477,51 +2645,51 @@
 <context>
     <name>PageVideos</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="115"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="116"/>
         <source>Name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="116"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="117"/>
         <source>Size</source>
         <translation type="unfinished"></translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="253"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="259"/>
         <source>%1 bytes</source>
         <translation type="unfinished">
             <numerusform></numerusform>
         </translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="328"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="336"/>
         <source>%1%</source>
         <extracomment>Video encoding progress. %1 = number</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="496"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="544"/>
         <source>(in progress...)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="500"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="548"/>
         <source>Date: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="501"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="549"/>
         <source>Size: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="707"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="763"/>
         <source>%1 (%2%) - %3</source>
         <extracomment>Video encoding list entry. %1 = file name, %2 = percent complete, %3 = video operation type (e.g. “encoding”)</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="710"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="766"/>
         <source>encoding</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2574,23 +2742,23 @@
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="282"/>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="946"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="954"/>
         <source>Ignore</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="286"/>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="958"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="966"/>
         <source>Add friend</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="941"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="949"/>
         <source>Unignore</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="953"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="961"/>
         <source>Remove friend</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2618,146 +2786,146 @@
 <context>
     <name>QCheckBox</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="421"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="443"/>
         <source>Fullscreen</source>
         <translation>游戏全屏幕</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="360"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="382"/>
         <source>Show FPS</source>
         <translation>显示帧率 (FPS)</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="371"/>
-        <source>Alternative damage show</source>
-        <translation>另一种伤害显示方式</translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="392"/>
-        <source>Team</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="393"/>
+        <source>Alternative damage show</source>
+        <translation>另一种伤害显示方式</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="414"/>
+        <source>Team</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="415"/>
         <source>Enable team tags by default</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="396"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="418"/>
         <source>Hog</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="397"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="419"/>
         <source>Enable hedgehog tags by default</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="400"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="422"/>
         <source>Health</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="401"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="423"/>
         <source>Enable health tags by default</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="404"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="426"/>
         <source>Translucent</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="405"/>
-        <source>Enable translucent tags by default</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="427"/>
+        <source>Enable translucent tags by default</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="449"/>
         <source>Visual effects</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="428"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="450"/>
         <source>Enable visual effects such as animated menu transitions and falling stars</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="501"/>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="526"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="523"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="548"/>
         <source>Sound</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="502"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="524"/>
         <source>In-game sound effects</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="508"/>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="531"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="530"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="553"/>
         <source>Music</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="509"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="531"/>
         <source>In-game music</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="516"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="538"/>
         <source>Dampen when losing focus</source>
         <extracomment>Checkbox text. If checked, the in-game audio volume is reduced (=dampened) when the game window loses its focus</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="517"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="539"/>
         <source>Reduce the game audio volume if the game window has lost its focus</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="527"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="549"/>
         <source>Frontend sound effects</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="532"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="554"/>
         <source>Frontend music</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="685"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="708"/>
         <source>If enabled, Hedgewars adds the date and time in the form &quot;YYYY-MM-DD_hh-mm&quot; for automatically created demos.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="705"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="728"/>
         <source>Check for updates at startup</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="377"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="399"/>
         <source>Show ammo menu tooltips</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="684"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="707"/>
         <source>Append date and time to record file name</source>
         <translation>记录名称中包含具体时间日期</translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/dialog/input_password.cpp" line="55"/>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="562"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="584"/>
         <source>Save password</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="768"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="791"/>
         <source>Record audio</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="818"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="841"/>
         <source>Use game resolution</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2765,17 +2933,17 @@
 <context>
     <name>QComboBox</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="138"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="144"/>
         <source>Human</source>
         <translation>玩家</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="142"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="148"/>
         <source>Computer (Level %1)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="400"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="406"/>
         <source>Community</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2784,112 +2952,112 @@
         <translation type="obsolete">Lv 级别</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="645"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="667"/>
         <source>(System default)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="324"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="346"/>
         <source>Disabled</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="322"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="344"/>
         <source>Stereoscopy creates an illusion of depth when you wear 3D glasses.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="325"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="347"/>
         <source>Red/Cyan</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="326"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="348"/>
         <source>Cyan/Red</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="327"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="349"/>
         <source>Red/Blue</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="328"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="350"/>
         <source>Blue/Red</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="329"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="351"/>
         <source>Red/Green</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="330"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="352"/>
         <source>Green/Red</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="337"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="359"/>
         <source>Side-by-side</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="338"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="360"/>
         <source>Top-Bottom</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="828"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="851"/>
         <source>24 FPS</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="829"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="852"/>
         <source>25 FPS</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="830"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="853"/>
         <source>30 FPS</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="831"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="854"/>
         <source>50 FPS</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="832"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="855"/>
         <source>60 FPS</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="331"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="353"/>
         <source>Red/Cyan grayscale</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="332"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="354"/>
         <source>Cyan/Red grayscale</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="333"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="355"/>
         <source>Red/Blue grayscale</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="334"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="356"/>
         <source>Blue/Red grayscale</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="335"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="357"/>
         <source>Red/Green grayscale</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="336"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="358"/>
         <source>Green/Red grayscale</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2897,22 +3065,22 @@
 <context>
     <name>QGroupBox</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="62"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="65"/>
         <source>Team Members</source>
         <translation>成员</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="109"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="112"/>
         <source>Team Settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="217"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="223"/>
         <source>Fort</source>
         <translation>城堡模式</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/teamselect.cpp" line="295"/>
+        <location filename="../../../../QTfrontend/ui/widget/teamselect.cpp" line="296"/>
         <source>Playing teams</source>
         <translation>玩家队伍</translation>
     </message>
@@ -2922,22 +3090,22 @@
         <translation>网络游戏</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="50"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="53"/>
         <source>Game Modifiers</source>
         <translation>游戏修改</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="51"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="54"/>
         <source>Basic Settings</source>
         <translation>基本设置</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="112"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="113"/>
         <source>Videos</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="148"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="152"/>
         <source>Description</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2945,63 +3113,68 @@
 <context>
     <name>QLabel</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="637"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="659"/>
         <source>Locale</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="551"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="573"/>
         <source>Nickname</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="318"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="327"/>
+        <source>Zoom (%)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="340"/>
         <source>Stereoscopy</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="383"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="405"/>
         <source>Displayed tags above hogs and translucent tags</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="673"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="696"/>
         <source>This setting will be effective at next restart.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="794"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="817"/>
         <source>Resolution</source>
         <translation>分辨率</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="839"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="862"/>
         <source>Bitrate (Kibit/s)</source>
         <extracomment>“Kibit/s” is the symbol for 1024 bits per second</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="304"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="313"/>
         <source>Quality</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="257"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="266"/>
         <source>Fullscreen</source>
         <translation type="unfinished">游戏全屏幕</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="262"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="271"/>
         <source>Fullscreen Resolution</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="273"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="282"/>
         <source>Windowed Resolution</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="351"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="373"/>
         <source>FPS limit</source>
         <translation>FPS 上限</translation>
     </message>
@@ -3026,7 +3199,7 @@
         <translation>端口:</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="156"/>
+        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="157"/>
         <source>Weapons</source>
         <translation>武器</translation>
     </message>
@@ -3035,102 +3208,103 @@
         <translation type="obsolete">版本</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="484"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="506"/>
         <source>Initial sound volume</source>
         <translation>初始音量</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="195"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="199"/>
         <source>Damage Modifier</source>
         <translation>伤害修改</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="212"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="216"/>
         <source>Turn Time</source>
         <translation>回合时间</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="229"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="233"/>
         <source>Initial Health</source>
         <translation>初始生命值</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="246"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="250"/>
         <source>Sudden Death Timeout</source>
         <translation>死亡模式倒计时</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="275"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="279"/>
         <source>Sudden Death Water Rise</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="292"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="296"/>
         <source>Sudden Death Health Decrease</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="309"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="313"/>
         <source>% Rope Length</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="342"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="346"/>
         <source>% Health Crates</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="359"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="363"/>
         <source>Health in Crates</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="376"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="380"/>
         <source>Mines Time</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="393"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="397"/>
         <source>Mines</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="410"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="414"/>
         <source>% Dud Mines</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="427"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="431"/>
         <source>Barrels</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="461"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="466"/>
         <source>% Retreat Time</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="444"/>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="448"/>
         <source>Air Mines</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="478"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="483"/>
         <source>World Edge</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="499"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="504"/>
         <source>Script parameter</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="515"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="520"/>
         <source>Scheme Name:</source>
         <translation>设置名称:</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="326"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="330"/>
         <source>Crate Drops</source>
         <translation>箱子降落</translation>
     </message>
@@ -3142,27 +3316,27 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="113"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="116"/>
         <source>Name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="116"/>
-        <source>Player</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="119"/>
-        <source>Grave</source>
+        <source>Player</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="122"/>
-        <source>Flag</source>
+        <source>Grave</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="125"/>
+        <source>Flag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="128"/>
         <source>Voice</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3197,33 +3371,33 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="144"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="148"/>
         <source>This development build is &apos;work in progress&apos; and may not be compatible with other versions of the game, while some features might be broken or incomplete!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="146"/>
-        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="152"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="150"/>
+        <location filename="../../../../QTfrontend/ui/page/pagemain.cpp" line="156"/>
         <source>Tip: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="735"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="758"/>
         <source>Format</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="756"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="779"/>
         <source>Audio codec</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="782"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="805"/>
         <source>Video codec</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="824"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="847"/>
         <source>Framerate</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3241,27 +3415,27 @@
 <context>
     <name>QLineEdit</name>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1054"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1088"/>
         <source>unnamed</source>
         <translation>无名</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1060"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1094"/>
         <source>unnamed (%1)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="412"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="418"/>
         <source>hedgehog %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="556"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="578"/>
         <source>anonymous</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/team.cpp" line="44"/>
+        <location filename="../../../../QTfrontend/team.cpp" line="45"/>
         <source>Hedgehog %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3278,86 +3452,97 @@
     <name>QMessageBox</name>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="139"/>
-        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="166"/>
-        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="183"/>
-        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="198"/>
-        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="401"/>
+        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="167"/>
+        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="185"/>
+        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="201"/>
+        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="404"/>
         <source>Error</source>
         <translation>错误</translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="140"/>
-        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="184"/>
+        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="186"/>
         <source>Please select a file from the list.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="167"/>
+        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="168"/>
         <source>Cannot rename file to %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="199"/>
+        <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="202"/>
         <source>Cannot delete file %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="491"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="503"/>
         <source>Teams - Are you sure?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="492"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="504"/>
         <source>Do you really want to delete the team &apos;%1&apos;?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="658"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="672"/>
         <source>Teams - Name already taken</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="659"/>
+        <location filename="../../../../QTfrontend/ui/page/pageeditteam.cpp" line="673"/>
         <source>The team name &apos;%1&apos; is already taken, so your team has been renamed to &apos;%2&apos;.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1092"/>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="643"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1126"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="655"/>
         <source>Cannot delete default scheme &apos;%1&apos;!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1118"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1152"/>
         <source>Please select a record from the list</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1213"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1247"/>
         <source>Hedgewars - Nick not registered</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1623"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1659"/>
         <source>Unable to start server</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="1685"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1721"/>
         <source>The connection to the server is lost.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1736"/>
+        <source>Server redirection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="1737"/>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
         <source>Connection to server is lost</source>
         <translation type="vanished">服务器连接丢失</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2299"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2495"/>
         <source>Not all players are ready</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2300"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2496"/>
         <source>Are you sure you want to start this game?
 Not all players are ready.</source>
         <translation type="unfinished"></translation>
@@ -3369,50 +3554,50 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="341"/>
+        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="342"/>
         <source>System Information Preview</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="356"/>
-        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="367"/>
+        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="357"/>
+        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="368"/>
         <source>Failed to generate captcha</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="384"/>
+        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="385"/>
         <source>Failed to download captcha</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="448"/>
+        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="450"/>
         <source>Please fill out all fields. Email is optional.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2186"/>
-        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="418"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2381"/>
+        <location filename="../../../../QTfrontend/ui/widget/feedbackdialog.cpp" line="419"/>
         <source>Hedgewars - Success</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2187"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2382"/>
         <source>All file associations have been set</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/hwform.cpp" line="2192"/>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="2388"/>
         <source>File association failed.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="118"/>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="128"/>
         <location filename="../../../../QTfrontend/ui/page/pagenetgame.cpp" line="257"/>
         <source>Netgame - Error</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="119"/>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="129"/>
         <source>Please select a server from the list</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3432,54 +3617,54 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="531"/>
+        <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="532"/>
         <source>Room Name - Are you sure?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="532"/>
+        <location filename="../../../../QTfrontend/ui/page/pageroomslist.cpp" line="533"/>
         <source>The game you are trying to join has started.
 Do you still want to join the room?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="642"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="654"/>
         <source>Schemes - Warning</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="651"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="664"/>
         <source>Schemes - Are you sure?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="652"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="665"/>
         <source>Do you really want to delete the game scheme &apos;%1&apos;?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="712"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="726"/>
         <source>Schemes - Name already taken</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="713"/>
+        <location filename="../../../../QTfrontend/ui/page/pagescheme.cpp" line="728"/>
         <source>A scheme with the name &apos;%1&apos; already exists. Your scheme has been renamed to &apos;%2&apos;.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="587"/>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="616"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="635"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="665"/>
         <source>Videos - Are you sure?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="588"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="636"/>
         <source>Do you really want to delete the video &apos;%1&apos;?</source>
         <translation type="unfinished"></translation>
     </message>
     <message numerus="yes">
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="617"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="666"/>
         <source>Do you really want to remove %1 file(s)?</source>
         <translation type="unfinished">
             <numerusform></numerusform>
@@ -3487,8 +3672,8 @@
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/widget/drawmapwidget.cpp" line="155"/>
-        <location filename="../../../../QTfrontend/ui/widget/drawmapwidget.cpp" line="175"/>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1224"/>
+        <location filename="../../../../QTfrontend/ui/widget/drawmapwidget.cpp" line="176"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1252"/>
         <source>File error</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3498,34 +3683,34 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/drawmapwidget.cpp" line="176"/>
-        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1225"/>
+        <location filename="../../../../QTfrontend/ui/widget/drawmapwidget.cpp" line="177"/>
+        <location filename="../../../../QTfrontend/ui/widget/mapContainer.cpp" line="1253"/>
         <source>Cannot open &apos;%1&apos; for reading</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="306"/>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="351"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="312"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="358"/>
         <source>Weapons - Warning</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="307"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="313"/>
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="352"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="359"/>
         <source>Cannot delete default weapon set &apos;%1&apos;!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="361"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="369"/>
         <source>Weapons - Are you sure?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="362"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="370"/>
         <source>Do you really want to delete the weapon set &apos;%1&apos;?</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3540,19 +3725,19 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="468"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="537"/>
         <source>Welcome to Hedgewars</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/main.cpp" line="469"/>
+        <location filename="../../../../QTfrontend/main.cpp" line="538"/>
         <source>Welcome to Hedgewars!
 
 You seem to be new around here. Would you like to play some training missions first to learn the basics of Hedgewars?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="402"/>
+        <location filename="../../../../QTfrontend/ui/widget/gamecfgwidget.cpp" line="405"/>
         <source>Cannot use the weapon scheme &apos;%1&apos;!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3560,8 +3745,8 @@
 <context>
     <name>QObject</name>
     <message>
-        <location filename="../../../../QTfrontend/campaign.cpp" line="139"/>
-        <location filename="../../../../QTfrontend/campaign.cpp" line="161"/>
+        <location filename="../../../../QTfrontend/campaign.cpp" line="153"/>
+        <location filename="../../../../QTfrontend/campaign.cpp" line="175"/>
         <source>No description available</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3579,6 +3764,11 @@
         <translation>连接</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="70"/>
+        <source>Specify address</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
         <source>Go!</source>
         <translation type="obsolete">上场!</translation>
     </message>
@@ -3605,7 +3795,7 @@
     <message>
         <location filename="../../../../QTfrontend/ui/page/pagecampaign.cpp" line="96"/>
         <location filename="../../../../QTfrontend/ui/page/pagenetserver.cpp" line="99"/>
-        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="115"/>
+        <location filename="../../../../QTfrontend/ui/page/pagetraining.cpp" line="131"/>
         <source>Start</source>
         <translation>开始</translation>
     </message>
@@ -3615,12 +3805,12 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="73"/>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="81"/>
         <source>Start server</source>
         <translation>开始服务端</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="58"/>
+        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="64"/>
         <source>Update</source>
         <translation>更新</translation>
     </message>
@@ -3630,9 +3820,8 @@
         <translation>读取</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagenet.cpp" line="63"/>
         <source>Specify</source>
-        <translation>指定</translation>
+        <translation type="vanished">指定</translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/dialog/input_ip.cpp" line="49"/>
@@ -3651,14 +3840,14 @@
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/dialog/input_ip.cpp" line="58"/>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="490"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="538"/>
         <source>Cancel</source>
         <translation>取消</translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/ui/page/pageplayrecord.cpp" line="48"/>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="182"/>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="490"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="186"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="538"/>
         <source>Delete</source>
         <translation>删除</translation>
     </message>
@@ -3668,42 +3857,42 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="691"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="714"/>
         <source>Associate file extensions</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="853"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="876"/>
         <source>Set default options</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="854"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="877"/>
         <source>Restore default coding parameters</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="134"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="138"/>
         <source>Open videos directory</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="135"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="139"/>
         <source>Open the video directory in your system</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="178"/>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="182"/>
         <source>Play</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="180"/>
-        <source>Play this video</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="184"/>
+        <source>Play this video</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui/page/pagevideos.cpp" line="188"/>
         <source>Delete this video</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3711,7 +3900,7 @@
 <context>
     <name>QSpinBox</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="847"/>
+        <location filename="../../../../QTfrontend/ui/page/pageoptions.cpp" line="870"/>
         <source>Specify the bitrate of recorded videos as a multiple of 1024 bits per second</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3847,42 +4036,42 @@
 <context>
     <name>SelWeaponWidget</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="170"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="173"/>
         <source>Weapon set</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="171"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="174"/>
         <source>Probabilities</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="172"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="175"/>
         <source>Ammo in boxes</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="173"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="176"/>
         <source>Delays</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="378"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="387"/>
         <source>New</source>
         <translation type="unfinished">新游戏</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="383"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="392"/>
         <source>New (%1)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="424"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="433"/>
         <source>Copy of %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="429"/>
+        <location filename="../../../../QTfrontend/ui/widget/selectWeapon.cpp" line="438"/>
         <source>Copy of %1 (%2)</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3894,18 +4083,18 @@
 <context>
     <name>TCPBase</name>
     <message>
-        <location filename="../../../../QTfrontend/net/tcpBase.cpp" line="122"/>
+        <location filename="../../../../QTfrontend/net/tcpBase.cpp" line="125"/>
         <source>Unable to start server at %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/tcpBase.cpp" line="223"/>
+        <location filename="../../../../QTfrontend/net/tcpBase.cpp" line="238"/>
         <source>Unable to run engine at %1
 Error code: %2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/net/tcpBase.cpp" line="242"/>
+        <location filename="../../../../QTfrontend/net/tcpBase.cpp" line="257"/>
         <source>The game engine died unexpectedly!
 (exit code %1)
 
@@ -3918,7 +4107,7 @@
 <context>
     <name>TeamSelWidget</name>
     <message>
-        <location filename="../../../../QTfrontend/ui/widget/teamselect.cpp" line="300"/>
+        <location filename="../../../../QTfrontend/ui/widget/teamselect.cpp" line="301"/>
         <source>At least two teams are required to play!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3950,181 +4139,235 @@
     <name>binds</name>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="23"/>
-        <location filename="../../../../QTfrontend/binds.cpp" line="51"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="57"/>
         <source>up</source>
         <translation>上</translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="24"/>
-        <location filename="../../../../QTfrontend/binds.cpp" line="52"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="58"/>
         <source>left</source>
         <translation>左</translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="25"/>
-        <location filename="../../../../QTfrontend/binds.cpp" line="53"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="59"/>
         <source>right</source>
         <translation>右</translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="26"/>
-        <location filename="../../../../QTfrontend/binds.cpp" line="54"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="60"/>
         <source>down</source>
         <translation>下</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="48"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="54"/>
         <source>attack</source>
         <translation>攻击</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="49"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="55"/>
         <source>put</source>
         <translation>放</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="30"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="33"/>
         <source>switch</source>
         <translation>切换</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="28"/>
+        <source>stand still on slippery land</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="29"/>
+        <source>change direction without moving</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="32"/>
-        <source>slot 1</source>
-        <translation>slot 1</translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="33"/>
-        <source>slot 2</source>
-        <translation>slot 2</translation>
+        <source>backwards jump</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="34"/>
-        <source>slot 3</source>
-        <translation>slot 3</translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="35"/>
-        <source>slot 4</source>
-        <translation>slot 4</translation>
+        <source>switch backwards</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="36"/>
-        <source>slot 5</source>
-        <translation>slot 5</translation>
+        <source>slot 1</source>
+        <translation>slot 1</translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="37"/>
-        <source>slot 6</source>
-        <translation>slot 6</translation>
+        <source>slot 2</source>
+        <translation>slot 2</translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="38"/>
-        <source>slot 7</source>
-        <translation>slot 7</translation>
+        <source>slot 3</source>
+        <translation>slot 3</translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="39"/>
-        <source>slot 8</source>
-        <translation>slot 8</translation>
+        <source>slot 4</source>
+        <translation>slot 4</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="40"/>
+        <source>slot 5</source>
+        <translation>slot 5</translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="41"/>
-        <source>slot 10</source>
-        <translation type="unfinished">slot 10</translation>
+        <source>slot 6</source>
+        <translation>slot 6</translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="42"/>
-        <source>timer 1 sec</source>
-        <translation>定时1秒</translation>
+        <source>slot 7</source>
+        <translation>slot 7</translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="43"/>
-        <source>timer 2 sec</source>
-        <translation>定时2秒</translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="44"/>
-        <source>timer 3 sec</source>
-        <translation>定时3秒</translation>
+        <source>slot 8</source>
+        <translation>slot 8</translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="45"/>
-        <source>timer 4 sec</source>
-        <translation>定时4秒</translation>
+        <source>slot 10</source>
+        <translation type="unfinished">slot 10</translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="46"/>
-        <source>timer 5 sec</source>
-        <translation>定时5秒</translation>
+        <source>unselect weapon</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="47"/>
-        <source>change timer</source>
-        <translation type="unfinished"></translation>
+        <source>timer 1 sec</source>
+        <translation>定时1秒</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="48"/>
+        <source>timer 2 sec</source>
+        <translation>定时2秒</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="49"/>
+        <source>timer 3 sec</source>
+        <translation>定时3秒</translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="50"/>
-        <source>autocam / find hedgehog</source>
+        <source>timer 4 sec</source>
+        <translation>定时4秒</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="51"/>
+        <source>timer 5 sec</source>
+        <translation>定时5秒</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="52"/>
+        <source>change timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="53"/>
+        <source>change bounciness</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="56"/>
-        <source>zoom in</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="57"/>
-        <source>zoom out</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="58"/>
-        <source>reset zoom</source>
+        <source>autocam / find hedgehog</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="62"/>
-        <source>pause / auto skip</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="67"/>
-        <source>mute audio</source>
+        <source>zoom in</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="63"/>
+        <source>zoom out</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="69"/>
-        <source>capture</source>
-        <translation>夺取</translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="70"/>
-        <source>speed up replay</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="71"/>
-        <source>show mission information</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="73"/>
-        <source>toggle team bars</source>
-        <extracomment>This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen</extracomment>
+        <source>pause / auto skip</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="74"/>
-        <source>toggle hedgehog tags</source>
+        <source>mute audio</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="76"/>
+        <source>screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>capture</source>
+        <translation type="vanished">夺取</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="77"/>
+        <source>save map as image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="78"/>
+        <source>speed up replay</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="79"/>
+        <source>show mission information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="80"/>
+        <source>show object information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="82"/>
+        <source>toggle team bars</source>
+        <extracomment>This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="83"/>
+        <source>toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="84"/>
+        <source>change hedgehog tag types</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="85"/>
+        <source>toggle hedgehog tag translucency</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="87"/>
+        <source>toggle HUD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="89"/>
         <source>record</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="63"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="70"/>
         <source>quit</source>
         <translation>退出</translation>
     </message>
@@ -4133,37 +4376,47 @@
         <translation type="obsolete">找到 刺猬</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="31"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="35"/>
         <source>ammo menu</source>
         <translation>弹药菜单</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="28"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="30"/>
         <source>long jump</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="29"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="31"/>
         <source>high jump</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="60"/>
-        <source>clan chat</source>
+        <location filename="../../../../QTfrontend/binds.cpp" line="64"/>
+        <source>reset zoom to start value</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="65"/>
+        <source>set zoom to 100%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="67"/>
+        <source>clan chat</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="72"/>
         <source>volume down</source>
         <translation>降低音量</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="66"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="73"/>
         <source>volume up</source>
         <translation>提高音量</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="68"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="75"/>
         <source>change mode</source>
         <translation>改变模式</translation>
     </message>
@@ -4172,22 +4425,22 @@
         <translation type="vanished">暂停</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="40"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="44"/>
         <source>slot 9</source>
         <translation>slot 9</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="59"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="66"/>
         <source>chat</source>
         <translation>聊天</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="61"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="68"/>
         <source>chat history</source>
         <translation>聊天记录</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="64"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="71"/>
         <source>confirmation</source>
         <translation>确认</translation>
     </message>
@@ -4205,40 +4458,93 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="31"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="35"/>
         <source>Weapons</source>
         <translation type="unfinished">武器</translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="50"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="56"/>
         <source>Camera</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="59"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="66"/>
         <source>Miscellaneous</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="28"/>
+        <source>hold down precise</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="29"/>
+        <source>precise + left/right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="32"/>
+        <source>high jump (twice)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="34"/>
+        <source>precise + switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="53"/>
+        <source>precise + timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="65"/>
+        <source>precise + reset zoom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="77"/>
+        <source>precise + screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="84"/>
+        <source>precise + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="85"/>
+        <source>switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="87"/>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="28"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="30"/>
         <source>Traverse gaps and obstacles by jumping:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="48"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="54"/>
         <source>Fire your selected weapon or trigger an utility item:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="49"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="55"/>
         <source>Pick a weapon or a target location under the cursor:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="30"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="33"/>
         <source>Switch your currently active hog (if possible):</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4248,67 +4554,67 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="31"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="35"/>
         <source>Pick a weapon or utility item:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="42"/>
+        <location filename="../../../../QTfrontend/binds.cpp" line="47"/>
         <source>Set the timer on bombs and timed weapons:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="50"/>
-        <source>Toggle automatic camera / refocus on active hedgehog:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="51"/>
-        <source>Move the cursor or camera without using the mouse:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="56"/>
-        <source>Modify the camera&apos;s zoom level:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="59"/>
-        <source>Talk to your clan or all participants:</source>
+        <source>Toggle automatic camera / refocus on active hedgehog:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="57"/>
+        <source>Move the cursor or camera without using the mouse:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="62"/>
-        <source>Pause, continue or leave your game:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="65"/>
-        <source>Modify the game&apos;s volume while playing:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="68"/>
-        <source>Toggle fullscreen mode:</source>
+        <source>Modify the camera&apos;s zoom level:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="66"/>
+        <source>Talk to your clan or all participants:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="69"/>
-        <source>Take a screenshot:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="70"/>
-        <source>Demo replay:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/binds.cpp" line="71"/>
-        <source>Heads-up display:</source>
+        <source>Pause, continue or leave your game:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="72"/>
+        <source>Modify the game&apos;s volume while playing:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="75"/>
+        <source>Toggle fullscreen mode:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/binds.cpp" line="76"/>
+        <source>Take a screenshot:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="78"/>
+        <source>Demo replay:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="79"/>
+        <source>Heads-up display:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="89"/>
         <source>Record video:</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4316,442 +4622,1034 @@
 <context>
     <name>binds (keys)</name>
     <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="25"/>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="26"/>
         <source>Mouse: Left button</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="26"/>
-        <source>Mouse: Middle button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="27"/>
-        <source>Mouse: Right button</source>
+        <source>Mouse: Middle button</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="28"/>
-        <source>Mouse: Wheel up</source>
+        <source>Mouse: Right button</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="29"/>
-        <source>Mouse: Wheel down</source>
+        <source>Mouse: X1 button </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="30"/>
-        <source>Backspace</source>
+        <source>Mouse: X2 button</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="31"/>
-        <source>Tab</source>
+        <source>Mouse: Wheel up</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="32"/>
-        <source>Clear</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="33"/>
-        <source>Return</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="34"/>
-        <source>Pause</source>
+        <source>Mouse: Wheel down</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="35"/>
-        <source>Escape</source>
+        <source>Backspace</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="36"/>
+        <source>Tab</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="37"/>
+        <source>Clear</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="38"/>
+        <source>Return</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="39"/>
+        <source>Pause</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="40"/>
+        <source>Escape</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="41"/>
         <source>Space</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="109"/>
+        <source>Delete</source>
+        <translation type="unfinished">删除</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="104"/>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="188"/>
+        <source>Up</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="105"/>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="189"/>
+        <source>Down</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="106"/>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="191"/>
+        <source>Right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="107"/>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="190"/>
+        <source>Left</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="108"/>
+        <source>Insert</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="110"/>
+        <source>Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="111"/>
+        <source>End</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="88"/>
+        <source>Keypad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="89"/>
+        <source>Keypad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="90"/>
+        <source>Keypad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="91"/>
+        <source>Keypad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="92"/>
+        <source>Keypad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="93"/>
+        <source>Keypad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="94"/>
+        <source>Keypad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="95"/>
+        <source>Keypad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="96"/>
+        <source>Keypad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="97"/>
+        <source>Keypad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="98"/>
+        <source>Keypad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="99"/>
+        <source>Keypad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="100"/>
-        <source>Delete</source>
-        <translation type="unfinished">删除</translation>
+        <source>Keypad *</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="101"/>
-        <source>Numpad 0</source>
+        <source>Keypad -</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="102"/>
-        <source>Numpad 1</source>
+        <source>Keypad +</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="103"/>
-        <source>Numpad 2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="104"/>
-        <source>Numpad 3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="105"/>
-        <source>Numpad 4</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="106"/>
-        <source>Numpad 5</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="107"/>
-        <source>Numpad 6</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="108"/>
-        <source>Numpad 7</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="109"/>
-        <source>Numpad 8</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="110"/>
-        <source>Numpad 9</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="111"/>
-        <source>Numpad .</source>
+        <source>Keypad Enter</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="112"/>
-        <source>Numpad /</source>
+        <source>PageUp</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="113"/>
-        <source>Numpad *</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="114"/>
-        <source>Numpad -</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="115"/>
-        <source>Numpad +</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="116"/>
-        <source>Enter</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="117"/>
-        <source>Equals</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="118"/>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="195"/>
-        <source>Up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="119"/>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="196"/>
-        <source>Down</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="120"/>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="198"/>
-        <source>Right</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="121"/>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="197"/>
-        <source>Left</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="122"/>
-        <source>Insert</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="123"/>
-        <source>Home</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="124"/>
-        <source>End</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="125"/>
-        <source>Page up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="126"/>
-        <source>Page down</source>
+        <source>PageDown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="129"/>
+        <source>Numlock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="130"/>
+        <source>CapsLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="131"/>
+        <source>ScrollLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="132"/>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="133"/>
+        <source>Right Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="134"/>
+        <source>Left Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="135"/>
+        <source>Right Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="136"/>
+        <source>Left Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="137"/>
+        <source>Right Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="138"/>
+        <source>Left Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="140"/>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="142"/>
-        <source>Num lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="143"/>
-        <source>Caps lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="144"/>
-        <source>Scroll lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="145"/>
-        <source>Right shift</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="146"/>
-        <source>Left shift</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="147"/>
-        <source>Right ctrl</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="148"/>
-        <source>Left ctrl</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="149"/>
-        <source>Right alt</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="150"/>
-        <source>Left alt</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="151"/>
-        <source>Right meta</source>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="152"/>
-        <source>Left meta</source>
+        <source>A button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="153"/>
+        <source>B button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="154"/>
+        <source>X button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="155"/>
+        <source>Y button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="156"/>
+        <source>LB button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="157"/>
+        <source>RB button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="158"/>
+        <source>Back button</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="159"/>
-        <source>A button</source>
+        <source>Start button</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="160"/>
-        <source>B button</source>
+        <source>Left stick</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="161"/>
-        <source>X button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="162"/>
-        <source>Y button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="163"/>
-        <source>LB button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="164"/>
-        <source>RB button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="165"/>
-        <source>Back button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="166"/>
-        <source>Start button</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="167"/>
-        <source>Left stick</source>
+        <source>Right stick</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="168"/>
-        <source>Right stick</source>
+        <source>Left stick (Right)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="169"/>
+        <source>Left stick (Left)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="170"/>
+        <source>Left stick (Down)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="171"/>
+        <source>Left stick (Up)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="172"/>
+        <source>Left trigger</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="173"/>
+        <source>Right trigger</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="174"/>
+        <source>Right stick (Down)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="175"/>
-        <source>Left stick (Right)</source>
+        <source>Right stick (Up)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="176"/>
-        <source>Left stick (Left)</source>
+        <source>Right stick (Right)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="177"/>
-        <source>Left stick (Down)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="178"/>
-        <source>Left stick (Up)</source>
+        <source>Right stick (Left)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="179"/>
-        <source>Left trigger</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="180"/>
-        <source>Right trigger</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="181"/>
-        <source>Right stick (Down)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="182"/>
-        <source>Right stick (Up)</source>
+        <source>D-pad</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="183"/>
-        <source>Right stick (Right)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="184"/>
-        <source>Right stick (Left)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="186"/>
-        <source>D-pad</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="190"/>
         <source>Axis %1 %2</source>
         <extracomment>Game controller axis direction. %1 = axis number, %2 = direction</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="192"/>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="185"/>
         <source>Button %1</source>
         <extracomment>Game controller button. %1 = button number</extracomment>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/sdlkeys.cpp" line="187"/>
+        <source>D-pad %1 %2</source>
+        <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
         <location filename="../../../../QTfrontend/sdlkeys.cpp" line="194"/>
-        <source>D-pad %1 %2</source>
-        <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/util/DataManager.cpp" line="162"/>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/util/DataManager.cpp" line="183"/>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/util/DataManager.cpp" line="190"/>
         <source>Keyboard</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
+    <name>credits</name>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="2"/>
+        <source>Programming</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="3"/>
+        <source>Game engine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="4"/>
+        <source>Creator</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="5"/>
+        <source>Many engine improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="6"/>
+        <source>Gamepad and Lua integration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="7"/>
+        <source>Campaign support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="8"/>
+        <source>Theme customization improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="9"/>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="10"/>
+        <source>Video recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="11"/>
+        <source>Other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="12"/>
+        <source>Map generation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="13"/>
+        <source>Core map generators</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="14"/>
+        <source>Perlin maps and other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="15"/>
+        <source>Maze maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="16"/>
+        <source>Weapons</source>
+        <translation type="unfinished">武器</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="17"/>
+        <source>Most core weapons</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="18"/>
+        <source>Air mine, rubber, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="19"/>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="20"/>
+        <source>Freezer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="21"/>
+        <source>Mine number and time game settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="22"/>
+        <source>Frontend / main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="23"/>
+        <source>Many frontend improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="24"/>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="25"/>
+        <source>Login dialogs, other improvements</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="26"/>
+        <source>Missions and styles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="27"/>
+        <source>A Classic Fairytale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="28"/>
+        <source>A Space Adventure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="29"/>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="30"/>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="31"/>
+        <source>Some styles and missions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="32"/>
+        <source>Battalion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="33"/>
+        <source>Continental supplies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="34"/>
+        <source>Teamwork 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="35"/>
+        <source>Climb Home</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="36"/>
+        <source>Portal Mind Challenge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="37"/>
+        <source>Game server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="38"/>
+        <source>Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="39"/>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="40"/>
+        <source>Android port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="41"/>
+        <source>Android netplay, portability abstraction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="42"/>
+        <source>WebGL port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="43"/>
+        <source>iPhone/iPad ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="44"/>
+        <source>Graphics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="45"/>
+        <source>General</source>
+        <translation type="unfinished">常规</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="46"/>
+        <source>Themes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="47"/>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="48"/>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="49"/>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="50"/>
+        <source>Hoggywood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="51"/>
+        <source>Cave, Olympics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="52"/>
+        <source>Fruit, Cake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="53"/>
+        <source>Art</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="54"/>
+        <source>Beach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="55"/>
+        <source>Brick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="56"/>
+        <source>Hell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="57"/>
+        <source>Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="58"/>
+        <source>Sheep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="59"/>
+        <source>Maps</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="60"/>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="61"/>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="62"/>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="63"/>
+        <source>Castle, PirateFlag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="64"/>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="65"/>
+        <source>Battlefield</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="66"/>
+        <source>CTF_Blizzard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="67"/>
+        <source>Cheese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="68"/>
+        <source>ClimbHome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="69"/>
+        <source>Lonely_Island</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="70"/>
+        <source>Octorama</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="71"/>
+        <source>portal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="72"/>
+        <source>Ruler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="73"/>
+        <source>Sticks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="74"/>
+        <source>Forts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="75"/>
+        <source>EvilChicken</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="76"/>
+        <source>Olympic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="77"/>
+        <source>Tank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="78"/>
+        <source>Snail</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="79"/>
+        <source>SteelTower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="80"/>
+        <source>Hats, graves, other</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="81"/>
+        <source>See CREDITS text file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="82"/>
+        <source>Sounds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="83"/>
+        <source>Hedgehogs voice</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="84"/>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="85"/>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="86"/>
+        <source>Music</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="87"/>
+        <source>City, Rock, others</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="88"/>
+        <source>Compost</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="89"/>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="90"/>
+        <source>Fruit, Jungle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="91"/>
+        <source>Nature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="92"/>
+        <source>olympics_sd</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="93"/>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="94"/>
+        <source>Translations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="95"/>
+        <source>Brazilian Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="96"/>
+        <source>Bulgarian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="97"/>
+        <source>Czech</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="98"/>
+        <source>Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="99"/>
+        <source>Finnish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="100"/>
+        <source>French</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="101"/>
+        <source>German</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="102"/>
+        <source>Greek</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="103"/>
+        <source>Italian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="104"/>
+        <source>Japanese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="105"/>
+        <source>Korean</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="106"/>
+        <source>Lithuanian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="107"/>
+        <source>Polish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="108"/>
+        <source>Portuguese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="109"/>
+        <source>Russian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="110"/>
+        <source>Scottish Gaelic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="111"/>
+        <source>Slovak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="112"/>
+        <source>Spanish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="113"/>
+        <source>Swedish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="114"/>
+        <source>Ukrainian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="115"/>
+        <source>Special thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/creditsmessages.h" line="116"/>
+        <source>Project founder</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>server</name>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="102"/>
-        <source>New voting started</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="104"/>
-        <source>kick</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="105"/>
-        <source>map</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="106"/>
-        <source>pause</source>
-        <translation type="unfinished">暂停</translation>
+        <source>New voting started</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="107"/>
+        <source>kick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="108"/>
+        <source>map</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="109"/>
+        <source>pause</source>
+        <translation type="unfinished">暂停</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="110"/>
         <source>new seed</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="74"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="76"/>
         <source>/maxteams: specify number from 2 to 8</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="47"/>
-        <source>&apos;Registered only&apos; state toggled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="48"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="50"/>
         <source>Super power activated.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="46"/>
-        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="862"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="49"/>
+        <location filename="../../../../QTfrontend/ui/widget/chatwidget.cpp" line="870"/>
         <source>Unknown command or invalid parameters. Say &apos;/help&apos; in chat for a list of commands.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="77"/>
-        <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="2"/>
         <source>Nickname is already in use</source>
         <translation type="unfinished"></translation>
@@ -4813,431 +5711,456 @@
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="14"/>
-        <source>/info &lt;player&gt;: Show info about player</source>
+        <source>This server no longer allows unregistered players to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="15"/>
-        <source>/me &lt;message&gt;: Chat action, e.g. &apos;/me eats pizza&apos; becomes &apos;* Player eats pizza&apos;</source>
+        <source>This server now allows unregistered players to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="16"/>
-        <source>/rnd: Flip a virtual coin and reply with &apos;heads&apos; or &apos;tails&apos;</source>
+        <source>/info &lt;player&gt;: Show info about player</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="17"/>
-        <source>/rnd [A] [B] [C] [...]: Reply with a random word from the given list</source>
+        <source>/me &lt;message&gt;: Chat action, e.g. &apos;/me eats pizza&apos; becomes &apos;* Player eats pizza&apos;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="18"/>
-        <source>/watch &lt;id&gt;: Watch a demo stored on the server with the given ID</source>
+        <source>/rnd: Flip a virtual coin and reply with &apos;heads&apos; or &apos;tails&apos;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="19"/>
-        <source>/quit: Quit the server</source>
+        <source>/rnd [A] [B] [C] [...]: Reply with a random word from the given list</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="20"/>
-        <source>/help: Show chat command help</source>
+        <source>/watch &lt;id&gt;: Watch a demo stored on the server with the given ID</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="21"/>
-        <source>/callvote [arguments]: Start a vote</source>
+        <source>/quit: Quit the server</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="22"/>
-        <source>/vote &lt;yes/no&gt;: Vote &apos;yes&apos; or &apos;no&apos; for active vote</source>
+        <source>/help: Show chat command help</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="23"/>
+        <source>/callvote [arguments]: Start a vote</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="24"/>
-        <source>/delegate &lt;player&gt;: Surrender room control to player</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="25"/>
-        <source>/maxteams &lt;N&gt;: Limit maximum number of teams to N</source>
+        <source>/vote &lt;yes/no&gt;: Vote &apos;yes&apos; or &apos;no&apos; for active vote</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="26"/>
-        <source>/global &lt;message&gt;: Send global chat message which can be seen by everyone on the server</source>
+        <source>/delegate &lt;player&gt;: Surrender room control to player</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="27"/>
-        <source>/registered_only: Toggle &apos;registered only&apos; state. If enabled, only registered players can join server</source>
+        <source>/maxteams &lt;N&gt;: Limit maximum number of teams to N</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="28"/>
-        <source>/super_power: Activate your super power. With it you can enter any room and are protected from kicking. Expires when you leave server</source>
+        <source>/global &lt;message&gt;: Send global chat message which can be seen by everyone on the server</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="29"/>
-        <source>/stats: Query server stats</source>
+        <source>/registered_only: Toggle &apos;registered only&apos; state. If enabled, only registered players can join server</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="30"/>
-        <source>/force &lt;yes/no&gt;: Force vote result for active vote</source>
+        <source>/super_power: Activate your super power. With it you can enter any room and are protected from kicking. Expires when you leave server</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="31"/>
-        <source>/fix: Force this room to stay open when it is empty</source>
+        <source>/stats: Query server stats</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="32"/>
+        <source>/force &lt;yes/no&gt;: Force vote result for active vote</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="33"/>
+        <source>/fix: Force this room to stay open when it is empty</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="34"/>
         <source>/unfix: Undo the /fix command</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="37"/>
-        <source>List of lobby chat commands:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="38"/>
-        <source>List of room chat commands:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="39"/>
+        <source>List of lobby chat commands:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="40"/>
+        <source>List of room chat commands:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="41"/>
         <source>Commands for server admins only:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="44"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="46"/>
+        <source>Warning! Room name change flood protection activated</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="47"/>
         <source>This command is only available in the lobby.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="45"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="48"/>
         <source>This command is only available in rooms.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="49"/>
-        <source>room</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="50"/>
-        <source>lobby</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="51"/>
-        <source>(playing)</source>
+        <source>room</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="52"/>
-        <source>(spectating)</source>
+        <source>lobby</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="53"/>
-        <source>Player is not online.</source>
+        <source>(playing)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="54"/>
-        <source>The game can&apos;t be started with less than two clans!</source>
+        <source>(spectating)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="55"/>
-        <source>Empty config entry.</source>
+        <source>Player is not online.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="56"/>
-        <source>Access denied.</source>
+        <source>The game can&apos;t be started with less than two clans!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="57"/>
-        <source>You&apos;re not the room master!</source>
+        <source>Empty config entry.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="58"/>
-        <source>Corrupted hedgehogs info!</source>
+        <source>Access denied.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="59"/>
-        <source>Too many teams!</source>
+        <source>You&apos;re not the room master!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="60"/>
-        <source>Too many hedgehogs!</source>
+        <source>Corrupted hedgehogs info!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="61"/>
-        <source>There&apos;s already a team with same name in the list.</source>
+        <source>Too many teams!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="62"/>
-        <source>Joining not possible: Round is in progress.</source>
+        <source>Too many hedgehogs!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="63"/>
-        <source>This room currently does not allow adding new teams.</source>
+        <source>There&apos;s already a team with same name in the list.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="64"/>
-        <source>Error: The team you tried to remove does not exist.</source>
+        <source>Joining not possible: Round is in progress.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="65"/>
-        <source>You can&apos;t remove a team you don&apos;t own.</source>
+        <source>This room currently does not allow adding new teams.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="66"/>
-        <source>Illegal room name! The room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
+        <source>Error: The team you tried to remove does not exist.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="67"/>
-        <source>A room with the same name already exists.</source>
+        <source>You can&apos;t remove a team you don&apos;t own.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="68"/>
-        <source>You can&apos;t kick yourself!</source>
+        <source>Illegal room name! The room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="69"/>
-        <source>You can&apos;t kick the only other player!</source>
+        <source>A room with the same name already exists.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="70"/>
-        <source>The player is not in your room.</source>
+        <source>You can&apos;t kick yourself!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="71"/>
-        <source>This player is protected from being kicked.</source>
+        <source>You can&apos;t kick the only other player!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="72"/>
-        <source>You&apos;re not the room master or a server admin!</source>
+        <source>The player is not in your room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="73"/>
-        <source>You&apos;re already the room master.</source>
+        <source>This player is protected from being kicked.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="74"/>
+        <source>You&apos;re not the room master or a server admin!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="75"/>
+        <source>You&apos;re already the room master.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="77"/>
         <source>Greeting message cleared.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="76"/>
-        <source>Greeting message set.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="78"/>
-        <source>/callvote kick: You need to specify a nickname.</source>
+        <source>Greeting message set.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="79"/>
-        <source>/callvote kick: This is only allowed in rooms without a room master.</source>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="81"/>
+        <source>/callvote kick: You need to specify a nickname.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="80"/>
-        <source>/callvote kick: No such user!</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="81"/>
-        <source>/callvote map: No maps available.</source>
+        <source>/callvote kick: This is only allowed in rooms without a room master.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="82"/>
-        <source>/callvote map: No such map!</source>
+        <source>/callvote kick: No such user!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="83"/>
-        <source>/callvote pause: No game in progress!</source>
+        <source>/callvote map: No maps available.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="84"/>
-        <source>/callvote hedgehogs: Specify number from 1 to 8.</source>
+        <source>/callvote map: No such map!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="85"/>
-        <source>/force: Please use &apos;yes&apos; or &apos;no&apos;.</source>
+        <source>/callvote pause: No game in progress!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="86"/>
-        <source>/vote: Please use &apos;yes&apos; or &apos;no&apos;.</source>
+        <source>/callvote hedgehogs: Specify number from 1 to 8.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="87"/>
-        <source>Illegal room name! A room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
+        <source>/force: Please use &apos;yes&apos; or &apos;no&apos;.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="88"/>
-        <source>No such room.</source>
+        <source>/vote: Please use &apos;yes&apos; or &apos;no&apos;.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="89"/>
-        <source>Room version incompatible to your Hedgewars version!</source>
+        <source>Illegal room name! A room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="90"/>
-        <source>Access denied. This room currently doesn&apos;t allow joining.</source>
+        <source>No such room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="91"/>
-        <source>Access denied. This room is for registered users only.</source>
+        <source>Room version incompatible to your Hedgewars version!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="92"/>
-        <source>You are banned from this room.</source>
+        <source>Access denied. This room currently doesn&apos;t allow joining.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="93"/>
-        <source>Nickname already provided.</source>
+        <source>Access denied. This room is for registered users only.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="94"/>
-        <source>Illegal nickname! Nicknames must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
+        <source>You are banned from this room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="95"/>
-        <source>Protocol already known.</source>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="96"/>
-        <source>Bad number.</source>
+        <source>Nickname already provided.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="97"/>
-        <source>There&apos;s no voting going on.</source>
+        <source>Illegal nickname! Nicknames must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="98"/>
-        <source>You already have voted.</source>
+        <source>Protocol already known.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="99"/>
-        <source>Your vote has been counted.</source>
+        <source>Bad number.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="100"/>
-        <source>Voting closed.</source>
+        <source>There&apos;s no voting going on.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="101"/>
-        <source>Pause toggled.</source>
+        <source>You already have voted.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="102"/>
+        <source>Your vote has been counted.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="103"/>
+        <source>Voting closed.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="104"/>
+        <source>Pause toggled.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="106"/>
         <source>Voting expired.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="108"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="111"/>
         <source>hedgehogs per team: </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="109"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="112"/>
         <source>You&apos;re the new room master!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="40"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="42"/>
         <source>Warning! Chat flood protection activated</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="23"/>
+        <location filename="../../../../QTfrontend/servermessages.h" line="25"/>
         <source>/greeting [message]: Set or clear greeting message to be shown to players who join the room</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="33"/>
-        <source>/save &lt;config ID&gt; &lt;config name&gt;: Add current room configuration as votable choice for /callvote map</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="34"/>
-        <source>/delete &lt;config ID&gt;: Delete a votable room configuration</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="35"/>
-        <source>/saveroom &lt;file name&gt;: Save all votable room configurations (and the greeting) of this room into a file</source>
+        <source>/save &lt;config ID&gt; &lt;config name&gt;: Add current room configuration as votable choice for /callvote map</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="36"/>
+        <source>/delete &lt;config ID&gt;: Delete a votable room configuration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="37"/>
+        <source>/saveroom &lt;file name&gt;: Save all votable room configurations (and the greeting) of this room into a file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="38"/>
         <source>/loadroom &lt;file name&gt;: Load votable room configurations (and greeting) from a file</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="41"/>
-        <source>Excess flood</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../../../../QTfrontend/servermessages.h" line="42"/>
-        <source>Game messages flood detected - 1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../../../../QTfrontend/servermessages.h" line="43"/>
+        <source>Excess flood</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="44"/>
+        <source>Game messages flood detected - 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/servermessages.h" line="45"/>
         <source>Warning! Joins flood protection activated</source>
         <translation type="unfinished"></translation>
     </message>
--- a/share/hedgewars/Data/Locale/hedgewars_zh_TW.ts	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/hedgewars_zh_TW.ts	Fri Aug 16 10:59:50 2019 -0600
@@ -10,73 +10,116 @@
     <message>
         <source>Hedgewars %1</source>
         <extracomment>%1 contains Hedgewars&apos; version number</extracomment>
-        <translation type="unfinished">刺蝟大作戰 %1</translation>
+        <translation>刺蝟大作戰 %1</translation>
     </message>
     <message>
         <source>Revision %1 (%2)</source>
-        <translation type="unfinished"></translation>
+        <translation>版本 %1 (%2)</translation>
     </message>
     <message>
         <source>Visit our homepage: %1</source>
-        <translation type="unfinished"></translation>
+        <translation>訪問我們的首頁: %1</translation>
     </message>
     <message>
         <source>This program is distributed under the %1.</source>
-        <translation type="unfinished">此程序使用%1.釋出</translation>
+        <translation>此程序使用%1.釋出</translation>
     </message>
     <message>
         <source>GNU GPL v2</source>
         <extracomment>Short for “GNU General Public License version 2”</extracomment>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
         <source>Dependency versions:</source>
         <extracomment>For the version numbers of Hedgewars&apos; software dependencies</extracomment>
-        <translation type="unfinished"></translation>
+        <translation>相依的版本:</translation>
     </message>
     <message>
         <source>&lt;a href=&quot;https://gcc.gnu.org&quot;&gt;GCC&lt;/a&gt;: %1</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2&lt;/a&gt;: %1.%2.%3</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_mixer&lt;/a&gt;: %1.%2.%3</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_net&lt;/a&gt;: %1.%2.%3</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_image&lt;/a&gt;: %1.%2.%3</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
         <source>&lt;a href=&quot;https://www.libsdl.org/&quot;&gt;SDL2_ttf&lt;/a&gt;: %1.%2.%3</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
         <source>&lt;a href=&quot;https://www.qt.io/developers/&quot;&gt;Qt&lt;/a&gt;: %1</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
         <source>&lt;a href=&quot;https://libav.org&quot;&gt;libavcodec&lt;/a&gt;: %1.%2.%3</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
         <source>&lt;a href=&quot;https://libav.org&quot;&gt;libavformat&lt;/a&gt;: %1.%2.%3</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
         <source>&lt;a href=&quot;https://libav.org&quot;&gt;libavutil&lt;/a&gt;: %1.%2.%3</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
         <source>&lt;a href=&quot;https://icculus.org/physfs/&quot;&gt;PhysFS&lt;/a&gt;: %1.%2.%3</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Credits</source>
+        <translation>貢獻人員</translation>
+    </message>
+    <message>
+        <source>Other people</source>
+        <translation>其他人</translation>
+    </message>
+    <message>
+        <source>%1 (alias %2)</source>
+        <translation>%1 (別名 %2)</translation>
+    </message>
+    <message>
+        <source>%1 &amp;lt;%2&amp;gt;</source>
+        <extracomment>Part of credits. %1: Contributor name. %2: E-mail address</extracomment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name</extracomment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>%1: %2 &amp;lt;%3&amp;gt;</source>
+        <extracomment>Part of credits. %1: Description of contribution. %2: Contributor name. %3: E-mail address</extracomment>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Extended Credits</source>
+        <translation>補充貢獻人員</translation>
+    </message>
+    <message>
+        <source>An extended credits list can be found in the CREDITS text file.</source>
+        <translation>一個補充貢獻列表能夠被發現在CREDITS文字檔中</translation>
+    </message>
+    <message>
+        <source>&lt;a href=&quot;https://visualstudio.microsoft.com&quot;&gt;VC++&lt;/a&gt;: %1</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Unknown Compiler: %1</source>
+        <translation>未知的編譯器: %1</translation>
     </message>
 </context>
 <context>
@@ -142,11 +185,11 @@
     </message>
     <message>
         <source>Please specify an IP address.</source>
-        <translation type="unfinished"></translation>
+        <translation>請指定一個IP位址</translation>
     </message>
     <message>
         <source>Please specify a nickname.</source>
-        <translation type="unfinished"></translation>
+        <translation>請指定一個匿稱</translation>
     </message>
 </context>
 <context>
@@ -188,11 +231,11 @@
     </message>
     <message>
         <source>Feedback</source>
-        <translation type="unfinished">信息反饋</translation>
+        <translation>信息反饋</translation>
     </message>
     <message>
         <source>This is optional, but this information might help us to resolve bugs and other technical problems.</source>
-        <translation type="unfinished"></translation>
+        <translation>這是選填的, 但這個資訊可能幫助我們除錯和解決技術上的問題</translation>
     </message>
 </context>
 <context>
@@ -212,15 +255,15 @@
     <name>GameCFGWidget</name>
     <message>
         <source>Edit weapons</source>
-        <translation type="unfinished">修改武器</translation>
+        <translation>修改武器</translation>
     </message>
     <message>
         <source>Edit schemes</source>
-        <translation type="unfinished">修改方案</translation>
+        <translation>修改方案</translation>
     </message>
     <message>
         <source>Game scheme will auto-select a weapon</source>
-        <translation type="unfinished">遊戲方案將自動選擇武器</translation>
+        <translation>遊戲方案將自動選擇武器</translation>
     </message>
     <message>
         <source>Map</source>
@@ -243,19 +286,19 @@
     </message>
     <message>
         <source>New</source>
-        <translation type="unfinished">新增</translation>
+        <translation>新增</translation>
     </message>
     <message>
         <source>Copy of %1</source>
-        <translation type="unfinished"></translation>
+        <translation>%1的拷貝</translation>
     </message>
     <message>
         <source>New (%1)</source>
-        <translation type="unfinished"></translation>
+        <translation>新增(%1)</translation>
     </message>
     <message>
         <source>Copy of %1 (%2)</source>
-        <translation type="unfinished"></translation>
+        <translation>%1的拷貝(%2)</translation>
     </message>
 </context>
 <context>
@@ -299,7 +342,7 @@
     </message>
     <message>
         <source>Scheme &apos;%1&apos; not supported</source>
-        <translation type="unfinished">不支持遊戲方案“%1”</translation>
+        <translation>不支持遊戲方案“%1”</translation>
     </message>
     <message>
         <source>Cannot create directory %1</source>
@@ -316,21 +359,25 @@
     <message>
         <source>Usage</source>
         <comment>command-line</comment>
+        <extracomment>“Usage” as in “how the command-line syntax works”. Shown when running “hedgewars --help” in command-line</extracomment>
         <translation>用法</translation>
     </message>
     <message>
         <source>OPTION</source>
         <comment>command-line</comment>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line. “OPTION” as in “command-line option”</extracomment>
         <translation>選項</translation>
     </message>
     <message>
         <source>CONNECTSTRING</source>
         <comment>command-line</comment>
-        <translation type="unfinished">連接字串</translation>
+        <extracomment>Name of a command-line argument, shown when running “hedgewars --help” in command-line</extracomment>
+        <translation>連接字串</translation>
     </message>
     <message>
         <source>Options</source>
         <comment>command-line</comment>
+        <extracomment>“Options” as in “command-line options”</extracomment>
         <translation>選項</translation>
     </message>
     <message>
@@ -351,7 +398,7 @@
     <message>
         <source>Hedgewars can use a %1 (e.g. &quot;%2&quot;) to connect on start.</source>
         <comment>command-line</comment>
-        <translation type="unfinished">啟動刺蝟大作戰能使用%1(例如 &quot;%2&quot;)來連線。</translation>
+        <translation>啟動刺蝟大作戰能使用%1(例如 &quot;%2&quot;)來連線。</translation>
     </message>
     <message>
         <source>Malformed option argument: %1</source>
@@ -427,15 +474,15 @@
     </message>
     <message>
         <source>Chat log</source>
-        <translation type="unfinished"></translation>
+        <translation>聊天記錄</translation>
     </message>
     <message>
         <source>Enter chat messages here and send them with [Enter]</source>
-        <translation type="unfinished"></translation>
+        <translation>在此輸入聊天訊息並按Enter發送</translation>
     </message>
     <message>
         <source>List of players</source>
-        <translation type="unfinished"></translation>
+        <translation>玩家名單</translation>
     </message>
 </context>
 <context>
@@ -451,12 +498,12 @@
     <message>
         <source>Hedgewars Demo File</source>
         <comment>File Types</comment>
-        <translation type="unfinished">刺蝟大作戰演示檔</translation>
+        <translation>刺蝟大作戰演示檔</translation>
     </message>
     <message>
         <source>Hedgewars Save File</source>
         <comment>File Types</comment>
-        <translation type="unfinished">刺蝟大作戰存檔</translation>
+        <translation>刺蝟大作戰存檔</translation>
     </message>
     <message>
         <source>Demo name</source>
@@ -490,7 +537,7 @@
     </message>
     <message>
         <source>Hedgewars - Nick registered</source>
-        <translation type="unfinished">刺蝟大作戰 - 暱稱註冊</translation>
+        <translation>刺蝟大作戰 - 暱稱已註冊</translation>
     </message>
     <message>
         <source>This nick is registered, and you haven&apos;t specified a password.
@@ -518,11 +565,11 @@
     </message>
     <message>
         <source>Hedgewars - Empty nickname</source>
-        <translation type="unfinished">刺蝟大作戰 - 空的暱稱</translation>
+        <translation>刺蝟大作戰 - 空的暱稱</translation>
     </message>
     <message>
         <source>Hedgewars - Wrong password</source>
-        <translation type="unfinished">刺蝟大作戰 - 密碼錯誤</translation>
+        <translation>刺蝟大作戰 - 密碼錯誤</translation>
     </message>
     <message>
         <source>You entered a wrong password.</source>
@@ -548,7 +595,7 @@
     </message>
     <message>
         <source>Guest</source>
-        <translation>遊客</translation>
+        <translation type="vanished">遊客</translation>
     </message>
     <message>
         <source>Room password</source>
@@ -562,29 +609,29 @@
     </message>
     <message>
         <source>Team 1</source>
-        <translation type="unfinished"></translation>
+        <translation>隊伍1</translation>
     </message>
     <message>
         <source>Team %1</source>
         <extracomment>Default team name</extracomment>
-        <translation type="unfinished"></translation>
+        <translation>隊伍 %1</translation>
     </message>
     <message>
         <source>Computer %1</source>
         <extracomment>Default computer team name</extracomment>
-        <translation type="unfinished"></translation>
+        <translation>電腦 %1</translation>
     </message>
     <message>
         <source>Unknown network error (possibly missing SSL library).</source>
-        <translation type="unfinished"></translation>
+        <translation>未知的網路錯誤(可能缺少SSL函式庫)</translation>
     </message>
     <message>
         <source>This feature requires an Internet connection, but you don&apos;t appear to be online (error code: %1).</source>
-        <translation type="unfinished"></translation>
+        <translation>此功能需要連接網際網路,但你並沒有上線(錯誤碼: %1)</translation>
     </message>
     <message>
         <source>Internal error: Reply object is invalid.</source>
-        <translation type="unfinished"></translation>
+        <translation>內部錯誤: 回覆的對象是無效的</translation>
     </message>
 </context>
 <context>
@@ -610,7 +657,7 @@
         <translation type="vanished">一個致命的錯誤! - 遊戲引擎不得不停止
 我們很抱歉給你帶來不便:(
 如果這一情況持續發生,請點擊主菜單中的“%1”按鈕
-上次兩款發動機的消息:
+最後兩條引擎訊息:
 %2</translation>
     </message>
     <message>
@@ -622,14 +669,21 @@
 
 Last engine message:
 %1</source>
-        <translation type="unfinished"></translation>
+        <translation>一個嚴重錯誤發生! 遊戲引擎已經被停止.
+
+對於給您帶來的不便,我們深表歉意. :-(
+
+如果這種情況持續發生,請點擊在主選單中的&apos;反饋&apos;按鍵!
+
+最後的引擎訊息:
+%1</translation>
     </message>
 </context>
 <context>
     <name>HWHostPortDialog</name>
     <message>
         <source>Connect to server</source>
-        <translation type="unfinished">連線到伺服器</translation>
+        <translation>連線到伺服器</translation>
     </message>
 </context>
 <context>
@@ -693,7 +747,7 @@
     </message>
     <message>
         <source>Random maze</source>
-        <translation>隨機迷宮</translation>
+        <translation>Maze隨機算法</translation>
     </message>
     <message>
         <source>Random</source>
@@ -705,11 +759,11 @@
     </message>
     <message>
         <source>Load map drawing</source>
-        <translation>加載地圖繪製</translation>
+        <translation>加載繪製地圖</translation>
     </message>
     <message>
         <source>Edit map drawing</source>
-        <translation>編輯地圖繪製</translation>
+        <translation>編輯繪製地圖</translation>
     </message>
     <message>
         <source>Small islands</source>
@@ -761,7 +815,7 @@
     </message>
     <message>
         <source>Random perlin</source>
-        <translation type="unfinished"></translation>
+        <translation>Perlin隨機算法</translation>
     </message>
     <message>
         <source>Style:</source>
@@ -769,50 +823,62 @@
     </message>
     <message>
         <source>Forts</source>
-        <translation type="unfinished"></translation>
+        <translation>堡壘</translation>
     </message>
     <message>
         <source>View and edit the seed, the source of randomness in the game</source>
-        <translation type="unfinished"></translation>
+        <translation>查看和編輯種子,這是遊戲中隨機性的來源</translation>
     </message>
     <message>
         <source>Randomize the theme</source>
-        <translation type="unfinished"></translation>
+        <translation>隨機選擇主題</translation>
     </message>
     <message>
         <source>Choose a theme</source>
-        <translation type="unfinished">選擇一個主題</translation>
+        <translation>選擇一個主題</translation>
     </message>
     <message>
         <source>Randomize the map, theme and seed</source>
-        <translation type="unfinished"></translation>
+        <translation>隨機選擇地圖、主題和種子</translation>
     </message>
     <message>
         <source>Randomize the theme and seed</source>
-        <translation type="unfinished"></translation>
+        <translation>隨機選擇主題和種子</translation>
     </message>
     <message>
         <source>Randomize the seed</source>
-        <translation type="unfinished"></translation>
+        <translation>隨機選擇種子</translation>
     </message>
     <message>
         <source>Click to randomize the map, theme and seed</source>
-        <translation type="unfinished"></translation>
+        <translation>點擊以隨機選擇地圖、主題和種子</translation>
     </message>
     <message>
         <source>Click to randomize the theme and seed</source>
-        <translation type="unfinished"></translation>
+        <translation>點擊以隨機選擇主題和種子</translation>
     </message>
     <message>
         <source>Adjust the complexity of the generated map</source>
-        <translation type="unfinished"></translation>
+        <translation>調整生成地圖的複雜性</translation>
     </message>
     <message>
         <source>Adjust the distance between forts</source>
-        <translation type="unfinished"></translation>
+        <translation>調整堡壘之間的距離</translation>
     </message>
     <message>
         <source>Click to edit</source>
+        <translation>點擊後編輯</translation>
+    </message>
+    <message>
+        <source>Scale size of the drawn map</source>
+        <translation>繪製地圖的比例尺寸</translation>
+    </message>
+    <message>
+        <source>Load</source>
+        <translation type="unfinished">讀取</translation>
+    </message>
+    <message>
+        <source>Edit</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -889,11 +955,11 @@
     </message>
     <message>
         <source>Reason:</source>
-        <translation type="unfinished"></translation>
+        <translation>原因:</translation>
     </message>
     <message>
         <source>The connection was refused by the official server or timed out. Something seems to be wrong with the official server at the moment. This might be a temporary problem. Please try again later.</source>
-        <translation type="unfinished"></translation>
+        <translation>連線超時或是被官方伺服器拒絕。目前官方伺服器似乎有些問題。這可能是一個暫時的問題。請稍後再試。</translation>
     </message>
     <message>
         <source>The connection was refused by the host or timed out. This might have one of the following reasons:
@@ -902,7 +968,12 @@
 - There is a temporary network problem
 
 Please check the host name and port settings and/or try again later.</source>
-        <translation type="unfinished"></translation>
+        <translation>連線超時或是被主機拒絕。這可能是以下的原因:
+- 刺蝟大作戰伺服器程序目前不在主機上運行
+- 指定的端口號碼不正確
+- 網路暫時有問題
+
+請檢查主機名和端口設置, 稍後重試。</translation>
     </message>
 </context>
 <context>
@@ -935,6 +1006,27 @@
     </message>
 </context>
 <context>
+    <name>HWRecorder</name>
+    <message>
+        <source>A fatal ERROR occured while processing the video recording! The video could not be saved.
+
+As a workaround, you could try to reset the Hedgewars video recorder settings to the defaults.
+
+To report this error, please click the &apos;Feedback&apos; button in the main menu!
+
+Last engine message:
+%1</source>
+        <translation>一個嚴重錯誤發生在進行視頻錄製的時候! 視頻不能被保存
+
+您可以嘗試重置錄影設置作為一種解決方式
+
+為了回報這個錯誤,請點擊在主選單中的&apos;反饋&apos;按鍵!
+
+最後的引擎訊息:
+%1</translation>
+    </message>
+</context>
+<context>
     <name>HWUploadVideoDialog</name>
     <message>
         <source>Upload video</source>
@@ -949,7 +1041,7 @@
     <name>HatButton</name>
     <message>
         <source>Change hat (%1)</source>
-        <translation type="unfinished">改變帽子(%1)</translation>
+        <translation>改變帽子(%1)</translation>
     </message>
 </context>
 <context>
@@ -982,14 +1074,18 @@
     <name>KeyBinder</name>
     <message>
         <source>Category</source>
-        <translation type="unfinished">分類</translation>
+        <translation>分類</translation>
+    </message>
+    <message>
+        <source>Warning: The same key is assigned multiple times!</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
     <name>LibavInteraction</name>
     <message>
         <source>Audio: </source>
-        <translation type="unfinished"></translation>
+        <translation>聲音:</translation>
     </message>
     <message>
         <source>unknown</source>
@@ -1010,33 +1106,34 @@
     <message>
         <source>Duration: %1min %2s</source>
         <extracomment>Duration in minutes and seconds (SI units)</extracomment>
-        <translation type="unfinished"></translation>
+        <translation>持續時間:%1分 %2秒</translation>
     </message>
     <message>
         <source>Video: %1x%2, %3 FPS, %4</source>
         <extracomment>Video metadata. %1 = video width, %2 = video height, %3 = frames per second = %4 = decoder name</extracomment>
-        <translation type="unfinished"></translation>
+        <translation>視頻: %1x%2, %3 FPS, %4</translation>
     </message>
     <message>
         <source>Video: %1x%2, %3</source>
         <extracomment>Video metadata. %1 = video width, %2 = video height, %3 = decoder name</extracomment>
-        <translation type="unfinished"></translation>
+        <translation>視頻: %1x%2, %3</translation>
     </message>
     <message>
         <source>Player: %1</source>
-        <translation type="unfinished"></translation>
+        <translation>玩家:%1</translation>
     </message>
     <message>
         <source>Theme: %1</source>
-        <translation type="unfinished">主題:%1</translation>
+        <translation>主題:%1</translation>
     </message>
     <message>
         <source>Map: %1</source>
-        <translation type="unfinished"></translation>
+        <translation>地圖:%1</translation>
     </message>
     <message>
         <source>Record: %1</source>
-        <translation type="unfinished"></translation>
+        <extracomment>As in ‘recording’</extracomment>
+        <translation>紀錄:%1</translation>
     </message>
 </context>
 <context>
@@ -1050,12 +1147,12 @@
     <name>MinesTimeSpinBox</name>
     <message>
         <source>Random</source>
-        <translation type="unfinished">隨機</translation>
+        <translation>隨機</translation>
     </message>
     <message numerus="yes">
         <source>%1 seconds</source>
-        <translation type="unfinished">
-            <numerusform></numerusform>
+        <translation>
+            <numerusform>%1 秒</numerusform>
         </translation>
     </message>
 </context>
@@ -1092,7 +1189,7 @@
     </message>
     <message>
         <source>General</source>
-        <translation type="unfinished">常規</translation>
+        <translation>常規</translation>
     </message>
     <message>
         <source>Bans</source>
@@ -1127,19 +1224,19 @@
     <name>PageCampaign</name>
     <message>
         <source>Team</source>
-        <translation type="unfinished">隊伍</translation>
+        <translation>隊伍</translation>
     </message>
     <message>
         <source>Campaign</source>
-        <translation type="unfinished"></translation>
+        <translation>戰役</translation>
     </message>
     <message>
         <source>Mission</source>
-        <translation type="unfinished"></translation>
+        <translation>任務</translation>
     </message>
     <message>
         <source>Start fighting</source>
-        <translation type="unfinished">開始戰鬥</translation>
+        <translation>開始戰鬥</translation>
     </message>
 </context>
 <context>
@@ -1161,23 +1258,23 @@
     </message>
     <message>
         <source>Open packages directory</source>
-        <translation type="unfinished">打開組件目錄</translation>
+        <translation>打開組件目錄</translation>
     </message>
     <message>
         <source>Load the start page</source>
-        <translation type="unfinished"></translation>
+        <translation>載入起始頁</translation>
     </message>
     <message>
         <source>Unknown network error (possibly missing SSL library).</source>
-        <translation type="unfinished"></translation>
+        <translation>未知的網路錯誤(可能缺少SSL函式庫)</translation>
     </message>
     <message>
         <source>This feature requires an Internet connection, but you don&apos;t appear to be online (error code: %1).</source>
-        <translation type="unfinished"></translation>
+        <translation>此功能需要連接網際網路,但你並沒有上線(錯誤碼: %1)</translation>
     </message>
     <message>
         <source>Internal error: Reply object is invalid.</source>
-        <translation type="unfinished"></translation>
+        <translation>內部錯誤: 回覆的對象是無效的</translation>
     </message>
 </context>
 <context>
@@ -1236,14 +1333,14 @@
     </message>
     <message>
         <source>Brush size</source>
-        <translation type="unfinished"></translation>
+        <translation>筆刷大小</translation>
     </message>
 </context>
 <context>
     <name>PageEditTeam</name>
     <message>
         <source>General</source>
-        <translation type="unfinished">常規</translation>
+        <translation>常規</translation>
     </message>
     <message>
         <source>Select an action to choose a custom key bind for this team</source>
@@ -1283,55 +1380,55 @@
     </message>
     <message>
         <source>Play a random example of this voice</source>
-        <translation type="unfinished"></translation>
+        <translation>隨機播放一個配音</translation>
     </message>
     <message>
         <source>Random Hats</source>
-        <translation type="unfinished"></translation>
+        <translation>帽子隨機分配</translation>
     </message>
     <message>
         <source>Random Names</source>
-        <translation type="unfinished"></translation>
+        <translation>名字隨機分配</translation>
     </message>
     <message>
         <source>Randomize the team name</source>
-        <translation type="unfinished"></translation>
+        <translation>隨機選擇隊伍名稱</translation>
     </message>
     <message>
         <source>Randomize the grave</source>
-        <translation type="unfinished"></translation>
+        <translation>隨機選擇墳墓</translation>
     </message>
     <message>
         <source>Randomize the flag</source>
-        <translation type="unfinished"></translation>
+        <translation>隨機選擇旗幟</translation>
     </message>
     <message>
         <source>Randomize the voice</source>
-        <translation type="unfinished"></translation>
+        <translation>隨機選擇配音</translation>
     </message>
     <message>
         <source>Randomize the fort</source>
-        <translation type="unfinished"></translation>
+        <translation>隨機選擇堡壘</translation>
     </message>
     <message>
         <source>CPU %1</source>
         <extracomment>Name of a flag for computer-controlled enemies. %1 is replaced with the computer level</extracomment>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
         <source>%1 (%2)</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
 </context>
 <context>
     <name>PageGameStats</name>
     <message>
         <source>Details</source>
-        <translation type="unfinished">細節</translation>
+        <translation>細節</translation>
     </message>
     <message>
         <source>Health graph</source>
-        <translation type="unfinished">生命走勢</translation>
+        <translation>生命走勢</translation>
     </message>
     <message>
         <source>Ranking</source>
@@ -1339,27 +1436,27 @@
     </message>
     <message numerus="yes">
         <source>The best shot award was won by &lt;b&gt;%1&lt;/b&gt; with &lt;b&gt;%2&lt;/b&gt; pts.</source>
-        <translation type="unfinished">
+        <translation>
             <numerusform>&lt;b&gt;%1&lt;/b&gt;的&lt;b&gt;%2&lt;/b&gt;傷害獲得最佳攻擊獎。</numerusform>
         </translation>
     </message>
     <message numerus="yes">
         <source>The best killer is &lt;b&gt;%1&lt;/b&gt; with &lt;b&gt;%2&lt;/b&gt; kills in a turn.</source>
-        <translation type="unfinished">
+        <translation>
             <numerusform>最佳殺手為&lt;b&gt;%1&lt;/b&gt;在一回合&lt;b&gt;%2&lt;/b&gt;殺。</numerusform>
         </translation>
     </message>
     <message numerus="yes">
         <source>A total of &lt;b&gt;%1&lt;/b&gt; hedgehog(s) were killed during this round.</source>
-        <translation type="unfinished">
+        <translation>
             <numerusform>這場總共&lt;b&gt;%1&lt;/b&gt;隻刺蝟死亡。</numerusform>
         </translation>
     </message>
     <message numerus="yes">
         <source>(%1 kill)</source>
         <extracomment>Number of kills in stats screen, written after the team name</extracomment>
-        <translation type="unfinished">
-            <numerusform></numerusform>
+        <translation>
+            <numerusform>(%1殺)</numerusform>
         </translation>
     </message>
     <message numerus="yes">
@@ -1376,7 +1473,7 @@
     </message>
     <message numerus="yes">
         <source>&lt;b&gt;%1&lt;/b&gt; was scared and skipped turn &lt;b&gt;%2&lt;/b&gt; times.</source>
-        <translation type="unfinished">
+        <translation>
             <numerusform>&lt;b&gt;%1&lt;/b&gt;很慌張,跳過&lt;b&gt;%2&lt;/b&gt;次。</numerusform>
         </translation>
     </message>
@@ -1391,25 +1488,45 @@
     <message numerus="yes">
         <source>(%1 %2)</source>
         <extracomment>For custom number of points in the stats screen, written after the team name. %1 is the number, %2 is the word. Example: “4 points”</extracomment>
-        <translation type="unfinished">
+        <translation>
             <numerusform></numerusform>
         </translation>
     </message>
     <message numerus="yes">
         <source>&lt;b&gt;%1&lt;/b&gt; thought it&apos;s good to shoot their own hedgehogs for &lt;b&gt;%2&lt;/b&gt; pts.</source>
-        <translation type="unfinished">
-            <numerusform></numerusform>
+        <translation>
+            <numerusform>&lt;b&gt;%1&lt;/b&gt;認為攻擊自己的刺猬&lt;b&gt;%2&lt;/b&gt;傷害是很好的。</numerusform>
         </translation>
     </message>
     <message numerus="yes">
         <source>&lt;b&gt;%1&lt;/b&gt; killed &lt;b&gt;%2&lt;/b&gt; of their own hedgehogs.</source>
-        <translation type="unfinished">
-            <numerusform></numerusform>
+        <translation>
+            <numerusform>&lt;b&gt;%1&lt;/b&gt;殺了&lt;b&gt;%2&lt;/b&gt;隻自己的刺蝟。</numerusform>
         </translation>
     </message>
     <message>
         <source>With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.</source>
-        <translation type="unfinished"></translation>
+        <translation>擁有相同戰隊顏色的刺蝟,沒有理由互相戰鬥。因此,刺猬一直幸福地生活在和平之中。</translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 point(s))</source>
+        <extracomment>Number of points in stats screen, written after the team name</extracomment>
+        <translation>
+            <numerusform>(%1 點)</numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%L1 second(s))</source>
+        <extracomment>Time in seconds</extracomment>
+        <translation>
+            <numerusform>(%1 秒)</numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <source>(%1 crate(s))</source>
+        <translation>
+            <numerusform>(%1 箱子)</numerusform>
+        </translation>
     </message>
 </context>
 <context>
@@ -1430,7 +1547,7 @@
     <name>PageMain</name>
     <message>
         <source>Downloadable Content</source>
-        <translation type="unfinished">可下載的內容</translation>
+        <translation>可下載的內容</translation>
     </message>
     <message>
         <source>Play a game on a single computer</source>
@@ -1486,7 +1603,7 @@
     </message>
     <message>
         <source>Open the Hedgewars online game manual in your web browser</source>
-        <translation type="unfinished"></translation>
+        <translation>在你的瀏覽器中開啟刺蝟大作戰的遊戲手冊</translation>
     </message>
 </context>
 <context>
@@ -1501,7 +1618,26 @@
     </message>
     <message>
         <source>Start fighting (requires at least 2 teams)</source>
-        <translation type="unfinished"></translation>
+        <translation>開始戰鬥(需要至少兩隻隊伍)</translation>
+    </message>
+</context>
+<context>
+    <name>PageNet</name>
+    <message>
+        <source>Connect to the selected server</source>
+        <translation>連線到選擇的伺服器</translation>
+    </message>
+    <message>
+        <source>Update the list of servers</source>
+        <translation>更新伺服器列表</translation>
+    </message>
+    <message>
+        <source>Specify the address and port number of a known server and connect to it directly</source>
+        <translation>指定已知伺服器的IP位址與端口號碼,然後連接它</translation>
+    </message>
+    <message>
+        <source>Start private server</source>
+        <translation>啟動私人伺服器</translation>
     </message>
 </context>
 <context>
@@ -1528,19 +1664,19 @@
     </message>
     <message>
         <source>Room name</source>
-        <translation type="unfinished"></translation>
+        <translation>房間名</translation>
     </message>
     <message>
         <source>Update the room name</source>
-        <translation type="unfinished"></translation>
+        <translation>更新房間名</translation>
     </message>
     <message>
         <source>Turn on the lightbulb to show the other players when you&apos;re ready to fight</source>
-        <translation type="unfinished"></translation>
+        <translation>當你準備開戰,打開燈泡通知其他玩家</translation>
     </message>
     <message>
         <source>Start fighting (requires at least 2 teams)</source>
-        <translation type="unfinished"></translation>
+        <translation>開始戰鬥(需要至少兩隻隊伍)</translation>
     </message>
 </context>
 <context>
@@ -1574,27 +1710,27 @@
     </message>
     <message>
         <source>New scheme</source>
-        <translation type="unfinished">新增方案</translation>
+        <translation>新增方案</translation>
     </message>
     <message>
         <source>Edit scheme</source>
-        <translation type="unfinished">修改方案</translation>
+        <translation>修改方案</translation>
     </message>
     <message>
         <source>Delete scheme</source>
-        <translation type="unfinished">刪除方案</translation>
+        <translation>刪除方案</translation>
     </message>
     <message>
         <source>New weapon set</source>
-        <translation type="unfinished">新增武器組合</translation>
+        <translation>新增武器組合</translation>
     </message>
     <message>
         <source>Edit weapon set</source>
-        <translation type="unfinished">修改武器組合</translation>
+        <translation>修改武器組合</translation>
     </message>
     <message>
         <source>Delete weapon set</source>
-        <translation type="unfinished">刪除武器組合</translation>
+        <translation>刪除武器組合</translation>
     </message>
     <message>
         <source>Advanced</source>
@@ -1626,15 +1762,15 @@
     </message>
     <message>
         <source>Socks5 proxy</source>
-        <translation type="unfinished">Socks5代理</translation>
+        <translation>Socks5代理</translation>
     </message>
     <message>
         <source>HTTP proxy</source>
-        <translation type="unfinished">HTTP代理</translation>
+        <translation>HTTP代理</translation>
     </message>
     <message>
         <source>System proxy settings</source>
-        <translation type="unfinished">系統代理設置</translation>
+        <translation>系統代理設置</translation>
     </message>
     <message>
         <source>Select an action to change what key controls it</source>
@@ -1678,7 +1814,7 @@
     </message>
     <message>
         <source>Schemes</source>
-        <translation type="unfinished">方案</translation>
+        <translation>方案</translation>
     </message>
     <message>
         <source>Weapons</source>
@@ -1727,23 +1863,24 @@
     <message>
         <source>x</source>
         <extracomment>Multiplication sign, to be used between two numbers. Note the “x” is only a dummy character, we recommend to use “×” if your language permits it</extracomment>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
         <source>MISSING LANGUAGE NAME [%1]</source>
-        <translation type="unfinished"></translation>
+        <extracomment>In the case of an error, this is shown in the language selection for a language with unknown name. %1 = language code</extracomment>
+        <translation>缺少的語言名稱 [%1]</translation>
     </message>
     <message>
         <source>Check now</source>
-        <translation type="unfinished"></translation>
+        <translation>立刻檢查</translation>
     </message>
     <message>
         <source>Can&apos;t delete last team</source>
-        <translation type="unfinished"></translation>
+        <translation>不能刪除最後一隻隊伍</translation>
     </message>
     <message>
         <source>You can&apos;t delete the last team!</source>
-        <translation type="unfinished"></translation>
+        <translation>你不能刪除最後一隻隊伍!</translation>
     </message>
 </context>
 <context>
@@ -1758,15 +1895,15 @@
     </message>
     <message>
         <source>Play demo</source>
-        <translation type="unfinished">播放演示</translation>
+        <translation>播放演示</translation>
     </message>
     <message>
         <source>Play the selected demo</source>
-        <translation type="unfinished"></translation>
+        <translation>播放選擇的演示</translation>
     </message>
     <message>
         <source>Load the selected game</source>
-        <translation type="unfinished"></translation>
+        <translation>讀取選擇的遊戲</translation>
     </message>
 </context>
 <context>
@@ -1793,8 +1930,8 @@
     </message>
     <message numerus="yes">
         <source>%1 players online</source>
-        <translation type="unfinished">
-            <numerusform>%1%n 玩家在線</numerusform>
+        <translation>
+            <numerusform>%1 玩家在線</numerusform>
         </translation>
     </message>
     <message>
@@ -1822,7 +1959,7 @@
     <name>PageScheme</name>
     <message>
         <source>New</source>
-        <translation type="unfinished">新增</translation>
+        <translation>新增</translation>
     </message>
     <message>
         <source>Delete</source>
@@ -1830,7 +1967,7 @@
     </message>
     <message>
         <source>Gain 80% of the damage you do back in health</source>
-        <translation type="unfinished">傷害的80%成為自身生命</translation>
+        <translation>傷害的80%成為自身生命</translation>
     </message>
     <message>
         <source>Share your opponents pain, share their damage</source>
@@ -1890,11 +2027,11 @@
     </message>
     <message>
         <source>Disable girders when generating random maps.</source>
-        <translation type="unfinished">生成隨機地圖時,禁用橋樑。</translation>
+        <translation>生成隨機地圖時,禁用橋樑。</translation>
     </message>
     <message>
         <source>Disable land objects when generating random maps.</source>
-        <translation type="unfinished">生成隨機地圖時,禁用地面物體。</translation>
+        <translation>生成隨機地圖時,禁用地面物體。</translation>
     </message>
     <message>
         <source>AI respawns on death.</source>
@@ -1906,7 +2043,7 @@
     </message>
     <message>
         <source>Attacking does not end your turn.</source>
-        <translation type="unfinished">進攻後不會自動結束你的回合。</translation>
+        <translation>進攻後不會自動結束你的回合。</translation>
     </message>
     <message>
         <source>Weapons are reset to starting values each turn.</source>
@@ -1918,7 +2055,7 @@
     </message>
     <message>
         <source>You will not have to worry about wind anymore.</source>
-        <translation type="unfinished">禁風,你將不用擔心風了。</translation>
+        <translation>禁風,你將不用擔心風了。</translation>
     </message>
     <message>
         <source>Wind will affect almost everything.</source>
@@ -1930,7 +2067,7 @@
     </message>
     <message>
         <source>Teams in each clan take successive turns sharing their turn time.</source>
-        <translation type="unfinished">同樣顏色的任意一隊伍每回合都可動作,但回合時間需共享。</translation>
+        <translation>同樣顏色的任意一隊伍每回合都可動作,但回合時間需共享。</translation>
     </message>
     <message>
         <source>Add an indestructible border around the terrain</source>
@@ -1958,95 +2095,96 @@
     </message>
     <message>
         <source>Each clan starts in its own part of the terrain.</source>
-        <translation type="unfinished"></translation>
+        <translation>每個隊伍在自己的地形開始。</translation>
     </message>
     <message>
         <source>Overall damage and knockback in percent</source>
-        <translation type="unfinished"></translation>
+        <extracomment>Description of the game scheme setting “Damage Modifier”. “Knockback” means how much hedgehogs and objects get pushed by explosions and other forces</extracomment>
+        <translation>以百分比表示整體的傷害</translation>
     </message>
     <message>
         <source>Turn time in seconds</source>
-        <translation type="unfinished"></translation>
+        <translation>回合時間以秒為單位</translation>
     </message>
     <message>
         <source>Initial health of hedgehogs</source>
-        <translation type="unfinished"></translation>
+        <translation>刺蝟開始的生命值</translation>
     </message>
     <message>
         <source>How many rounds have to be played before Sudden Death begins</source>
-        <translation type="unfinished"></translation>
+        <translation>意外死亡開始前有幾個回合</translation>
     </message>
     <message>
         <source>How much the water rises per turn while in Sudden Death. Set to 0 along with Sudden Death Health Decrease to disable Sudden Death.</source>
-        <translation type="unfinished"></translation>
+        <translation>意外死亡開始每回合水上升多少</translation>
     </message>
     <message>
         <source>How much health hedgehogs lose per turn while in Sudden Death, down to 1 health. Set to 0 along with Sudden Death Water Rise to disable Sudden Death.</source>
-        <translation type="unfinished"></translation>
+        <translation>意外死亡開始每個回合失去多少生命,直到剩下一點生命為止。</translation>
     </message>
     <message>
         <source>Maximum rope length in percent</source>
-        <translation type="unfinished"></translation>
+        <translation>最大繩索長度百分比</translation>
     </message>
     <message>
         <source>Likelihood of a dropped crate being a health crate. All other crates will be weapon or utility crates.</source>
-        <translation type="unfinished"></translation>
+        <translation>掉落的箱子是急救箱的機率。其他的箱子是武器或工具</translation>
     </message>
     <message>
         <source>Likelihood of a crate dropping before a turn</source>
-        <translation type="unfinished"></translation>
+        <translation>每回合箱子掉落的機率</translation>
     </message>
     <message>
         <source>Health bonus for collecting a health crate</source>
-        <translation type="unfinished"></translation>
+        <translation>急救箱的生命獎勵點數</translation>
     </message>
     <message>
         <source>Detonation timer of mines. The random timer lies between 0 and 5 seconds. The timer of air mines will be a quarter of the mines timer.</source>
-        <translation type="unfinished"></translation>
+        <translation>地雷引爆計時器。隨機計時器在0到5秒之間。浮空雷的緩衝時間只有地雷的四分之一。</translation>
     </message>
     <message>
         <source>Average number of mines to be placed a medium-sized island map. This number will be scaled for other maps.</source>
-        <translation type="unfinished"></translation>
+        <translation>地雷放置在中型島嶼地圖的平均數量。這個數字將等比縮放在其他大小的地圖上。</translation>
     </message>
     <message>
         <source>Likelihood of a mine being a dud. Does not affect mines placed by hedgehogs.</source>
-        <translation type="unfinished"></translation>
+        <translation>地雷啞彈的機率。不影響刺蝟放置的地雷</translation>
     </message>
     <message>
         <source>Average number of barrels to be placed a medium-sized island map. This number will be scaled for other maps.</source>
-        <translation type="unfinished"></translation>
+        <translation>炸藥桶放置在中型島嶼地圖的平均數量。這個數字將等比縮放在其他大小的地圖上。</translation>
     </message>
     <message>
         <source>Average number of air mines to be placed a medium-sized island map. This number will be scaled for other maps.</source>
-        <translation type="unfinished"></translation>
+        <translation>浮空雷放置在中型島嶼地圖的平均數量。這個數字將等比縮放在其他大小的地圖上。</translation>
     </message>
     <message>
         <source>Affects the left and right boundaries of the map</source>
-        <translation type="unfinished"></translation>
+        <translation>影響地圖的左右邊界</translation>
     </message>
     <message>
         <source>Time you get after an attack</source>
-        <translation type="unfinished"></translation>
+        <translation>你進行攻擊後剩下的活動時間。預設是3秒。</translation>
     </message>
     <message>
         <source>Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty.</source>
-        <translation type="unfinished"></translation>
+        <translation>額外的參數來配置遊戲風格。含義取決於使用的風格,請參閱文檔。如有疑問,請將其留空。</translation>
     </message>
     <message>
         <source>Name of this scheme</source>
-        <translation type="unfinished"></translation>
+        <translation>這個方案的名稱</translation>
     </message>
     <message>
         <source>Select a hedgehog at the beginning of a turn</source>
-        <translation type="unfinished"></translation>
+        <translation>每個回合開始時可選擇刺蝟</translation>
     </message>
     <message>
         <source>Land can not be destroyed by most weapons.</source>
-        <translation type="unfinished"></translation>
+        <translation>大部分武器不能破壞地形</translation>
     </message>
     <message>
         <source>%1 (%2)</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
 </context>
 <context>
@@ -2072,11 +2210,11 @@
     <name>PageSinglePlayer</name>
     <message>
         <source>Play a quick game against the computer with random settings</source>
-        <translation type="unfinished">使用隨機設置與電腦快速開始遊戲</translation>
+        <translation>使用隨機設置與電腦快速開始遊戲</translation>
     </message>
     <message>
         <source>Play a hotseat game against your friends, or AI teams</source>
-        <translation type="unfinished">與你的朋友或AI隊伍進行遊戲</translation>
+        <translation>與你的朋友或AI隊伍進行遊戲</translation>
     </message>
     <message>
         <source>Campaign Mode</source>
@@ -2084,7 +2222,7 @@
     </message>
     <message>
         <source>Practice your skills in a range of training missions</source>
-        <translation>透過一系列的培訓任務,練習你的技能</translation>
+        <translation type="vanished">透過一系列的培訓任務,練習你的技能</translation>
     </message>
     <message>
         <source>Watch recorded demos</source>
@@ -2094,6 +2232,10 @@
         <source>Load a previously saved game</source>
         <translation>讀取以前保存的遊戲</translation>
     </message>
+    <message>
+        <source>Singleplayer missions: Learn how to play in the training, practice your skills in challenges or try to complete goals in scenarios.</source>
+        <translation>單人任務: 在訓練中學習如何玩, 在挑戰中練習你的技巧, 嘗試完成場景中的目標</translation>
+    </message>
 </context>
 <context>
     <name>PageTraining</name>
@@ -2115,27 +2257,54 @@
     </message>
     <message>
         <source>Pick the training to play</source>
-        <translation type="unfinished"></translation>
+        <translation>挑一個訓練來玩</translation>
     </message>
     <message>
         <source>Pick the challenge to play</source>
-        <translation type="unfinished"></translation>
+        <translation>挑一個挑戰來玩</translation>
     </message>
     <message>
         <source>Pick the scenario to play</source>
-        <translation type="unfinished"></translation>
+        <translation>挑一個場景來玩</translation>
     </message>
     <message>
         <source>Trainings</source>
-        <translation type="unfinished"></translation>
+        <translation>訓練</translation>
     </message>
     <message>
         <source>Challenges</source>
-        <translation type="unfinished"></translation>
+        <translation>挑戰</translation>
     </message>
     <message>
         <source>Scenarios</source>
-        <translation type="unfinished"></translation>
+        <translation>場景</translation>
+    </message>
+    <message>
+        <source>Team</source>
+        <translation>隊伍</translation>
+    </message>
+    <message>
+        <source>Team highscore: %1</source>
+        <extracomment>Highest score of a team</extracomment>
+        <translation>隊伍高分: %1</translation>
+    </message>
+    <message>
+        <source>Team lowscore: %1</source>
+        <extracomment>Lowest score of a team</extracomment>
+        <translation>隊伍低分: %1</translation>
+    </message>
+    <message>
+        <source>Team&apos;s top accuracy: %1%</source>
+        <extracomment>Best accuracy of a team (in a challenge)</extracomment>
+        <translation>隊伍最高準度: %1%</translation>
+    </message>
+    <message>
+        <source>Team&apos;s best time: %L1 s</source>
+        <translation>隊伍最佳時間: %L1 s</translation>
+    </message>
+    <message>
+        <source>Team&apos;s longest time: %L1 s</source>
+        <translation>隊伍最長時間: %L1 s</translation>
     </message>
 </context>
 <context>
@@ -2150,7 +2319,7 @@
     </message>
     <message numerus="yes">
         <source>%1 bytes</source>
-        <translation type="unfinished">
+        <translation>
             <numerusform></numerusform>
         </translation>
     </message>
@@ -2168,21 +2337,21 @@
     </message>
     <message>
         <source>Date: %1</source>
-        <translation type="unfinished">日期:%1</translation>
+        <translation>日期:%1</translation>
     </message>
     <message>
         <source>Size: %1</source>
-        <translation type="unfinished">大小:%1</translation>
+        <translation>大小:%1</translation>
     </message>
     <message>
         <source>%1%</source>
         <extracomment>Video encoding progress. %1 = number</extracomment>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
         <source>%1 (%2%) - %3</source>
         <extracomment>Video encoding list entry. %1 = file name, %2 = percent complete, %3 = video operation type (e.g. “encoding”)</extracomment>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
 </context>
 <context>
@@ -2233,7 +2402,7 @@
     </message>
     <message>
         <source>Restrict Unregistered Players Join</source>
-        <translation type="unfinished">限制未註冊的玩家加入</translation>
+        <translation>限制未註冊的玩家加入</translation>
     </message>
     <message>
         <source>Show games in lobby</source>
@@ -2253,7 +2422,7 @@
     </message>
     <message>
         <source>Delegate room control</source>
-        <translation type="unfinished"></translation>
+        <translation>房間控制權下放</translation>
     </message>
 </context>
 <context>
@@ -2272,7 +2441,7 @@
     </message>
     <message>
         <source>Append date and time to record file name</source>
-        <translation type="unfinished">記錄檔名中包含具體時間日期</translation>
+        <translation>記錄檔名中包含具體時間日期</translation>
     </message>
     <message>
         <source>Check for updates at startup</source>
@@ -2280,11 +2449,11 @@
     </message>
     <message>
         <source>Show ammo menu tooltips</source>
-        <translation type="unfinished">顯示武器提示訊息</translation>
+        <translation>顯示武器提示訊息</translation>
     </message>
     <message>
         <source>Save password</source>
-        <translation type="unfinished">保存密碼</translation>
+        <translation>保存密碼</translation>
     </message>
     <message>
         <source>Save account name and password</source>
@@ -2296,7 +2465,7 @@
     </message>
     <message>
         <source>Record audio</source>
-        <translation type="unfinished">錄製音頻</translation>
+        <translation>錄製音頻</translation>
     </message>
     <message>
         <source>Use game resolution</source>
@@ -2340,7 +2509,7 @@
     </message>
     <message>
         <source>Hog</source>
-        <translation type="unfinished">刺蝟</translation>
+        <translation>刺蝟</translation>
     </message>
     <message>
         <source>Enable hedgehog tags by default</source>
@@ -2348,11 +2517,11 @@
     </message>
     <message>
         <source>Health</source>
-        <translation type="unfinished">生命</translation>
+        <translation>生命</translation>
     </message>
     <message>
         <source>Enable health tags by default</source>
-        <translation type="unfinished">預設顯示生命值標示</translation>
+        <translation>預設顯示生命值標示</translation>
     </message>
     <message>
         <source>Translucent</source>
@@ -2364,20 +2533,20 @@
     </message>
     <message>
         <source>Enable visual effects such as animated menu transitions and falling stars</source>
-        <translation type="unfinished"></translation>
+        <translation>啟用視覺效果,例如菜單動畫過渡和背景的流星</translation>
     </message>
     <message>
         <source>If enabled, Hedgewars adds the date and time in the form &quot;YYYY-MM-DD_hh-mm&quot; for automatically created demos.</source>
-        <translation type="unfinished"></translation>
+        <translation>如果啟用,對於自動建立的演示檔將以&quot;YYYY-MM-DD_hh-mm&quot;的形式命名。</translation>
     </message>
     <message>
         <source>Dampen when losing focus</source>
         <extracomment>Checkbox text. If checked, the in-game audio volume is reduced (=dampened) when the game window loses its focus</extracomment>
-        <translation type="unfinished"></translation>
+        <translation>在失去焦點時降低音量</translation>
     </message>
     <message>
         <source>Reduce the game audio volume if the game window has lost its focus</source>
-        <translation type="unfinished"></translation>
+        <translation>如果遊戲視窗已經失去焦點,則降低遊戲音量</translation>
     </message>
 </context>
 <context>
@@ -2396,95 +2565,95 @@
     </message>
     <message>
         <source>Community</source>
-        <translation type="unfinished"></translation>
+        <translation>社群</translation>
     </message>
     <message>
         <source>Disabled</source>
-        <translation type="unfinished">關閉</translation>
+        <translation>關閉</translation>
     </message>
     <message>
         <source>Red/Cyan</source>
-        <translation type="unfinished">紅色/青色</translation>
+        <translation>紅色/青色</translation>
     </message>
     <message>
         <source>Cyan/Red</source>
-        <translation type="unfinished">青色/紅</translation>
+        <translation>青色/紅</translation>
     </message>
     <message>
         <source>Red/Blue</source>
-        <translation type="unfinished">紅/藍</translation>
+        <translation>紅/藍</translation>
     </message>
     <message>
         <source>Blue/Red</source>
-        <translation type="unfinished">藍/紅</translation>
+        <translation>藍/紅</translation>
     </message>
     <message>
         <source>Red/Green</source>
-        <translation type="unfinished">紅/綠</translation>
+        <translation>紅/綠</translation>
     </message>
     <message>
         <source>Green/Red</source>
-        <translation type="unfinished">綠/紅</translation>
+        <translation>綠/紅</translation>
     </message>
     <message>
         <source>Side-by-side</source>
-        <translation type="unfinished"></translation>
+        <translation>並排</translation>
     </message>
     <message>
         <source>Top-Bottom</source>
-        <translation type="unfinished"></translation>
+        <translation>上下</translation>
     </message>
     <message>
         <source>Red/Cyan grayscale</source>
-        <translation type="unfinished">紅/青色灰度</translation>
+        <translation>紅/青色灰度</translation>
     </message>
     <message>
         <source>Cyan/Red grayscale</source>
-        <translation type="unfinished">青色/紅灰度</translation>
+        <translation>青色/紅灰度</translation>
     </message>
     <message>
         <source>Red/Blue grayscale</source>
-        <translation type="unfinished">紅/藍灰度</translation>
+        <translation>紅/藍灰度</translation>
     </message>
     <message>
         <source>Blue/Red grayscale</source>
-        <translation type="unfinished">藍/紅灰度</translation>
+        <translation>藍/紅灰度</translation>
     </message>
     <message>
         <source>Red/Green grayscale</source>
-        <translation type="unfinished">紅/綠灰度</translation>
+        <translation>紅/綠灰度</translation>
     </message>
     <message>
         <source>Green/Red grayscale</source>
-        <translation type="unfinished">綠/紅灰度</translation>
+        <translation>綠/紅灰度</translation>
     </message>
     <message>
         <source>Computer (Level %1)</source>
-        <translation type="unfinished"></translation>
+        <translation>電腦(等級 %1)</translation>
     </message>
     <message>
         <source>Stereoscopy creates an illusion of depth when you wear 3D glasses.</source>
-        <translation type="unfinished"></translation>
+        <translation>當佩戴3D眼鏡時,會產生深度上的錯覺。</translation>
     </message>
     <message>
         <source>24 FPS</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
         <source>25 FPS</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
         <source>30 FPS</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
         <source>50 FPS</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
         <source>60 FPS</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
 </context>
 <context>
@@ -2499,7 +2668,7 @@
     </message>
     <message>
         <source>Playing teams</source>
-        <translation type="unfinished">玩家隊伍</translation>
+        <translation>玩家隊伍</translation>
     </message>
     <message>
         <source>Net game</source>
@@ -2515,15 +2684,15 @@
     </message>
     <message>
         <source>Team Settings</source>
-        <translation type="unfinished">隊伍設置</translation>
+        <translation>隊伍設置</translation>
     </message>
     <message>
         <source>Videos</source>
-        <translation type="unfinished">視頻</translation>
+        <translation>視頻</translation>
     </message>
     <message>
         <source>Description</source>
-        <translation type="unfinished">描述</translation>
+        <translation>描述</translation>
     </message>
 </context>
 <context>
@@ -2566,7 +2735,7 @@
     </message>
     <message>
         <source>Damage Modifier</source>
-        <translation type="unfinished">傷害修正</translation>
+        <translation>傷害修正</translation>
     </message>
     <message>
         <source>Turn Time</source>
@@ -2578,11 +2747,11 @@
     </message>
     <message>
         <source>Sudden Death Timeout</source>
-        <translation type="unfinished">意外死亡倒數</translation>
+        <translation>意外死亡倒數</translation>
     </message>
     <message>
         <source>Scheme Name:</source>
-        <translation type="unfinished">方案名稱:</translation>
+        <translation>方案名稱:</translation>
     </message>
     <message>
         <source>Crate Drops</source>
@@ -2590,7 +2759,7 @@
     </message>
     <message>
         <source>Mines Time</source>
-        <translation type="unfinished">地雷爆炸緩衝</translation>
+        <translation>地雷爆炸緩衝</translation>
     </message>
     <message>
         <source>Mines</source>
@@ -2598,7 +2767,7 @@
     </message>
     <message>
         <source>% Dud Mines</source>
-        <translation type="unfinished">地雷啞彈率(%)</translation>
+        <translation>地雷啞彈率(%)</translation>
     </message>
     <message>
         <source>Name</source>
@@ -2618,7 +2787,7 @@
     </message>
     <message>
         <source>Voice</source>
-        <translation type="unfinished">語音</translation>
+        <translation>配音</translation>
     </message>
     <message>
         <source>Locale</source>
@@ -2630,27 +2799,27 @@
     </message>
     <message>
         <source>Quality</source>
-        <translation type="unfinished">品質</translation>
+        <translation>品質</translation>
     </message>
     <message>
         <source>% Health Crates</source>
-        <translation type="unfinished">急救箱率(%)</translation>
+        <translation>急救箱率(%)</translation>
     </message>
     <message>
         <source>Health in Crates</source>
-        <translation type="unfinished">急救箱生命</translation>
+        <translation>急救箱生命</translation>
     </message>
     <message>
         <source>Sudden Death Water Rise</source>
-        <translation type="unfinished">意外死亡水上升</translation>
+        <translation>意外死亡水上升</translation>
     </message>
     <message>
         <source>Sudden Death Health Decrease</source>
-        <translation type="unfinished">意外死亡生命減少</translation>
+        <translation>意外死亡生命減少</translation>
     </message>
     <message>
         <source>% Rope Length</source>
-        <translation type="unfinished">繩長(%)</translation>
+        <translation>繩長(%)</translation>
     </message>
     <message>
         <source>Stereo rendering</source>
@@ -2658,11 +2827,11 @@
     </message>
     <message>
         <source>Style</source>
-        <translation type="unfinished">風格</translation>
+        <translation>風格</translation>
     </message>
     <message>
         <source>Scheme</source>
-        <translation type="unfinished">方案</translation>
+        <translation>方案</translation>
     </message>
     <message>
         <source>% Get Away Time</source>
@@ -2786,7 +2955,7 @@
     </message>
     <message>
         <source>Script parameter</source>
-        <translation type="unfinished">腳本參數</translation>
+        <translation>腳本參數</translation>
     </message>
     <message>
         <source>Air Mines</source>
@@ -2794,27 +2963,32 @@
     </message>
     <message>
         <source>Player</source>
-        <translation type="unfinished"></translation>
+        <translation>玩家</translation>
     </message>
     <message>
         <source>Barrels</source>
-        <translation type="unfinished"></translation>
+        <translation>炸藥桶</translation>
     </message>
     <message>
         <source>% Retreat Time</source>
-        <translation type="unfinished"></translation>
+        <extracomment>Label of game scheme setting for the time you get after an attack</extracomment>
+        <translation>撤退時間(%)</translation>
     </message>
     <message>
         <source>Stereoscopy</source>
-        <translation type="unfinished"></translation>
+        <translation>立體視覺</translation>
     </message>
     <message>
         <source>Bitrate (Kibit/s)</source>
         <extracomment>“Kibit/s” is the symbol for 1024 bits per second</extracomment>
-        <translation type="unfinished"></translation>
+        <translation>比特率(Kibit/s)</translation>
     </message>
     <message>
         <source>Loading&lt;br&gt;CAPTCHA ...</source>
+        <translation>載入中&lt;br&gt;驗證碼 ...</translation>
+    </message>
+    <message>
+        <source>Zoom (%)</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -2826,7 +3000,7 @@
     </message>
     <message>
         <source>hedgehog %1</source>
-        <translation type="unfinished">刺蝟 %1</translation>
+        <translation>刺蝟 %1</translation>
     </message>
     <message>
         <source>anonymous</source>
@@ -2834,11 +3008,11 @@
     </message>
     <message>
         <source>unnamed (%1)</source>
-        <translation type="unfinished"></translation>
+        <translation>無名 (%1)</translation>
     </message>
     <message>
         <source>Hedgehog %1</source>
-        <translation type="unfinished"></translation>
+        <translation>刺蝟 %1</translation>
     </message>
 </context>
 <context>
@@ -2860,7 +3034,7 @@
     </message>
     <message>
         <source>File association failed.</source>
-        <translation type="unfinished">檔案關聯失敗。</translation>
+        <translation>檔案關聯失敗。</translation>
     </message>
     <message>
         <source>Error while authenticating at google.com:
@@ -2878,35 +3052,35 @@
     </message>
     <message>
         <source>Teams - Are you sure?</source>
-        <translation type="unfinished">隊伍 - 你確定嗎?</translation>
+        <translation>隊伍 - 你確定嗎?</translation>
     </message>
     <message>
         <source>Do you really want to delete the team &apos;%1&apos;?</source>
-        <translation type="unfinished">你確定要刪除隊伍&apos;%1&apos;?</translation>
+        <translation>你確定要刪除隊伍&apos;%1&apos;?</translation>
     </message>
     <message>
         <source>Cannot delete default scheme &apos;%1&apos;!</source>
-        <translation type="unfinished">不能刪除預設方案 &quot;%1&quot;!</translation>
+        <translation>不能刪除預設方案 &quot;%1&quot;!</translation>
     </message>
     <message>
         <source>Please select a record from the list</source>
-        <translation type="unfinished">請從列表中選擇一個紀錄</translation>
+        <translation>請從列表中選擇一個紀錄</translation>
     </message>
     <message>
         <source>Unable to start server</source>
-        <translation type="unfinished">無法開啟伺服器</translation>
+        <translation>無法開啟伺服器</translation>
     </message>
     <message>
         <source>Hedgewars - Error</source>
-        <translation type="unfinished">刺蝟大作戰 - 錯誤</translation>
+        <translation>刺蝟大作戰 - 錯誤</translation>
     </message>
     <message>
         <source>Hedgewars - Success</source>
-        <translation type="unfinished">刺蝟大作戰 - 成功</translation>
+        <translation>刺蝟大作戰 - 成功</translation>
     </message>
     <message>
         <source>All file associations have been set</source>
-        <translation type="unfinished">所有檔案關聯已經被設定</translation>
+        <translation>所有檔案關聯已經被設定</translation>
     </message>
     <message>
         <source>Cannot create directory %1</source>
@@ -2922,15 +3096,15 @@
     </message>
     <message>
         <source>Netgame - Error</source>
-        <translation type="unfinished">網路遊戲 - 錯誤</translation>
+        <translation>網路遊戲 - 錯誤</translation>
     </message>
     <message>
         <source>Please select a server from the list</source>
-        <translation type="unfinished">請從列表中選擇一個伺服器</translation>
+        <translation>請從列表中選擇一個伺服器</translation>
     </message>
     <message>
         <source>Please enter room name</source>
-        <translation type="unfinished">請鍵入房間名</translation>
+        <translation>請鍵入房間名</translation>
     </message>
     <message>
         <source>Record Play - Error</source>
@@ -2950,15 +3124,15 @@
     </message>
     <message>
         <source>Room Name - Error</source>
-        <translation type="unfinished">房間名 - 錯誤</translation>
+        <translation>房間名 - 錯誤</translation>
     </message>
     <message>
         <source>Please select room from the list</source>
-        <translation type="unfinished">請從列表選中房間</translation>
+        <translation>請從列表中選擇房間</translation>
     </message>
     <message>
         <source>Room Name - Are you sure?</source>
-        <translation type="unfinished">房間名 - 你確定嗎?</translation>
+        <translation>房間名 - 你確定嗎?</translation>
     </message>
     <message>
         <source>The game you are trying to join has started.
@@ -2968,45 +3142,45 @@
     </message>
     <message>
         <source>Schemes - Warning</source>
-        <translation type="unfinished">方案 - 警告</translation>
+        <translation>方案 - 警告</translation>
     </message>
     <message>
         <source>Schemes - Are you sure?</source>
-        <translation type="unfinished">方案 - 你確定嗎?</translation>
+        <translation>方案 - 你確定嗎?</translation>
     </message>
     <message>
         <source>Do you really want to delete the game scheme &apos;%1&apos;?</source>
-        <translation type="unfinished">你真的確定要刪除遊戲方案 &apos;%1&apos;?</translation>
+        <translation>你真的確定要刪除遊戲方案 &apos;%1&apos;?</translation>
     </message>
     <message>
         <source>Videos - Are you sure?</source>
-        <translation type="unfinished">視頻 - 你確定嗎?</translation>
+        <translation>視頻 - 你確定嗎?</translation>
     </message>
     <message>
         <source>Do you really want to delete the video &apos;%1&apos;?</source>
-        <translation type="unfinished">你確定要刪除視頻 &apos;%1&apos;嗎?</translation>
+        <translation>你確定要刪除視頻 &apos;%1&apos;嗎?</translation>
     </message>
     <message numerus="yes">
         <source>Do you really want to remove %1 file(s)?</source>
-        <translation type="unfinished">
-            <numerusform>你確定要移除檔案%1%n嗎?</numerusform>
+        <translation>
+            <numerusform>你確定要移除檔案 %1 嗎?</numerusform>
         </translation>
     </message>
     <message>
         <source>Do you really want to cancel uploading %1?</source>
-        <translation type="obsolete">你確定要取消上傳%1嗎?</translation>
+        <translation type="obsolete">你確定要取消上傳 %1 嗎?</translation>
     </message>
     <message>
         <source>File error</source>
-        <translation type="unfinished">檔案 - 錯誤</translation>
+        <translation>檔案錯誤</translation>
     </message>
     <message>
         <source>Cannot open &apos;%1&apos; for writing</source>
-        <translation type="unfinished">不能開啟&apos;%1&apos;</translation>
+        <translation>不能開啟&apos;%1&apos; 為了寫入</translation>
     </message>
     <message>
         <source>Cannot open &apos;%1&apos; for reading</source>
-        <translation type="unfinished">不能開啟&apos;%1&apos;</translation>
+        <translation>不能開啟&apos;%1&apos; 為了讀取</translation>
     </message>
     <message>
         <source>Cannot use the ammo &apos;%1&apos;!</source>
@@ -3014,7 +3188,7 @@
     </message>
     <message>
         <source>Weapons - Warning</source>
-        <translation type="unfinished">武器  - 警告</translation>
+        <translation>武器 - 警告</translation>
     </message>
     <message>
         <source>Cannot overwrite default weapon set &apos;%1&apos;!</source>
@@ -3022,102 +3196,114 @@
     </message>
     <message>
         <source>Cannot delete default weapon set &apos;%1&apos;!</source>
-        <translation type="unfinished">不能刪除預設武器設定&apos;%1&apos;!</translation>
+        <translation>不能刪除預設武器設定&apos;%1&apos;!</translation>
     </message>
     <message>
         <source>Weapons - Are you sure?</source>
-        <translation type="unfinished">武器  -  你確定嗎?</translation>
+        <translation>武器 - 你確定嗎?</translation>
     </message>
     <message>
         <source>Do you really want to delete the weapon set &apos;%1&apos;?</source>
-        <translation type="unfinished">你確定要刪除武器設定&apos;%1&apos;嗎?</translation>
+        <translation>你確定要刪除武器設定&apos;%1&apos;嗎?</translation>
     </message>
     <message>
         <source>Hedgewars - Nick not registered</source>
-        <translation type="unfinished">刺蝟大作戰 -  暱稱已經被註冊</translation>
+        <translation>刺蝟大作戰 - 暱稱未註冊</translation>
     </message>
     <message>
         <source>System Information Preview</source>
-        <translation type="unfinished">系統資訊預覽</translation>
+        <translation>系統資訊預覽</translation>
     </message>
     <message>
         <source>Failed to generate captcha</source>
-        <translation type="unfinished">產生驗證碼失敗</translation>
+        <translation>產生驗證碼失敗</translation>
     </message>
     <message>
         <source>Failed to download captcha</source>
-        <translation type="unfinished">下載驗證碼失敗</translation>
+        <translation>下載驗證碼失敗</translation>
     </message>
     <message>
         <source>Please fill out all fields. Email is optional.</source>
-        <translation type="unfinished">請填寫所有欄位. 電子郵件地址是選填的. </translation>
+        <translation>請填寫所有欄位. 電子郵件地址是選填的. </translation>
     </message>
     <message>
         <source>Hedgewars - Warning</source>
-        <translation type="unfinished">刺蝟大作戰 -  警告</translation>
+        <translation>刺蝟大作戰 -  警告</translation>
     </message>
     <message>
         <source>Hedgewars - Information</source>
-        <translation type="unfinished">刺蝟大作戰 -  資訊</translation>
+        <translation>刺蝟大作戰 -  資訊</translation>
     </message>
     <message>
         <source>Not all players are ready</source>
-        <translation type="unfinished">並不是所有的玩家都準備就緒</translation>
+        <translation>並不是所有的玩家都準備就緒</translation>
     </message>
     <message>
         <source>Are you sure you want to start this game?
 Not all players are ready.</source>
-        <translation type="unfinished">你確定要啟動這個遊戲嗎?
+        <translation>你確定要啟動這個遊戲嗎?
 並不是所有的玩家都準備就緒。</translation>
     </message>
     <message>
         <source>Teams - Name already taken</source>
-        <translation type="unfinished"></translation>
+        <translation>隊伍 - 名字已經被用了</translation>
     </message>
     <message>
         <source>The team name &apos;%1&apos; is already taken, so your team has been renamed to &apos;%2&apos;.</source>
-        <translation type="unfinished"></translation>
+        <translation>隊伍名稱 &apos;%1&apos; 已經被用了, 因此你的隊伍被重新命名為 &apos;%2&apos;</translation>
     </message>
     <message>
         <source>Please select a file from the list.</source>
-        <translation type="unfinished"></translation>
+        <translation>請從列表中選擇一個檔案</translation>
     </message>
     <message>
         <source>Cannot rename file to %1.</source>
-        <translation type="unfinished"></translation>
+        <translation>不能重新命名檔案 %1</translation>
     </message>
     <message>
         <source>Cannot delete file %1.</source>
-        <translation type="unfinished"></translation>
+        <translation>不能刪除檔案 %1</translation>
     </message>
     <message>
         <source>Welcome to Hedgewars</source>
-        <translation type="unfinished"></translation>
+        <translation>歡迎來到刺蝟大作戰</translation>
     </message>
     <message>
         <source>Welcome to Hedgewars!
 
 You seem to be new around here. Would you like to play some training missions first to learn the basics of Hedgewars?</source>
-        <translation type="unfinished"></translation>
+        <translation>歡迎來到刺蝟大作戰!
+
+你似乎是新來的。 你想先玩一些訓練任務來學習刺蝟大作戰的基礎知識嗎?
+        </translation>
     </message>
     <message>
         <source>Cannot use the weapon scheme &apos;%1&apos;!</source>
-        <translation type="unfinished"></translation>
+        <translation>不能使用武器方案 &apos;%1&apos;!</translation>
     </message>
     <message>
         <source>The connection to the server is lost.</source>
-        <translation type="unfinished"></translation>
+        <translation>伺服器連接丟失</translation>
     </message>
     <message>
         <source>Schemes - Name already taken</source>
-        <translation type="unfinished"></translation>
+        <translation>方案 - 名字已經被用了</translation>
     </message>
     <message>
         <source>A scheme with the name &apos;%1&apos; already exists. Your scheme has been renamed to &apos;%2&apos;.</source>
-        <translation type="unfinished"></translation>
+        <translation>名為&apos;%1&apos;的方案已經存在。你的方案已被重新命名為&apos;%2&apos;。</translation>
     </message>
     <message>
         <source>A weapon scheme with the name &apos;%1&apos; already exists. Changes made to the weapon scheme have been discarded.</source>
+        <translation>名為&apos;%1&apos;的武器方案已經存在。對武器計劃所做的更改已被廢棄。</translation>
+    </message>
+    <message>
+        <source>Server redirection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This server supports secure connections on port %1.
+Would you like to reconnect securely?</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -3125,14 +3311,14 @@
     <name>QObject</name>
     <message>
         <source>No description available</source>
-        <translation type="unfinished">沒有可用的描述</translation>
+        <translation>沒有可用的描述</translation>
     </message>
 </context>
 <context>
     <name>QPushButton</name>
     <message>
         <source>Play demo</source>
-        <translation type="unfinished">播放演示</translation>
+        <translation>播放演示</translation>
     </message>
     <message>
         <source>Connect</source>
@@ -3140,7 +3326,7 @@
     </message>
     <message>
         <source>Go!</source>
-        <translation type="obsolete">出場!</translation>
+        <translation type="vanished">出場!</translation>
     </message>
     <message>
         <source>Start</source>
@@ -3148,7 +3334,7 @@
     </message>
     <message>
         <source>Start server</source>
-        <translation type="unfinished">啟動伺服器</translation>
+        <translation>啟動伺服器</translation>
     </message>
     <message>
         <source>Update</source>
@@ -3160,7 +3346,7 @@
     </message>
     <message>
         <source>Specify</source>
-        <translation>指定</translation>
+        <translation type="vanished">指定</translation>
     </message>
     <message>
         <source>default</source>
@@ -3168,7 +3354,7 @@
     </message>
     <message>
         <source>Rename</source>
-        <translation type="unfinished">更名</translation>
+        <translation>更名</translation>
     </message>
     <message>
         <source>OK</source>
@@ -3192,11 +3378,11 @@
     </message>
     <message>
         <source>Set default options</source>
-        <translation type="unfinished">回到預設值</translation>
+        <translation>回到預設值</translation>
     </message>
     <message>
         <source>Open videos directory</source>
-        <translation type="unfinished">打開視頻目錄</translation>
+        <translation>打開視頻目錄</translation>
     </message>
     <message>
         <source>Play</source>
@@ -3212,19 +3398,19 @@
     </message>
     <message>
         <source>Restore default coding parameters</source>
-        <translation type="unfinished">恢復預設的編碼參數</translation>
+        <translation>恢復預設的編碼參數</translation>
     </message>
     <message>
         <source>Open the video directory in your system</source>
-        <translation type="unfinished">打開你系統上的視頻目錄</translation>
+        <translation>打開你系統上的視頻目錄</translation>
     </message>
     <message>
         <source>Play this video</source>
-        <translation type="unfinished">播放此視頻</translation>
+        <translation>播放此視頻</translation>
     </message>
     <message>
         <source>Delete this video</source>
-        <translation type="unfinished">刪除此視頻</translation>
+        <translation>刪除此視頻</translation>
     </message>
     <message>
         <source>Upload this video to your Youtube account</source>
@@ -3232,30 +3418,34 @@
     </message>
     <message>
         <source>Reset</source>
-        <translation type="unfinished">重置</translation>
+        <translation>重置</translation>
     </message>
     <message>
         <source>Set the default server port for Hedgewars</source>
-        <translation type="unfinished">設置為刺猬大作戰預設的伺服器端口</translation>
+        <translation>設置為刺猬大作戰預設的伺服器端口</translation>
     </message>
     <message>
         <source>Invite your friends to your server in just 1 click!</source>
-        <translation type="unfinished">只要1個點擊就可以邀請你的朋友到你的伺服器!</translation>
+        <translation>只要1個點擊就可以邀請朋友到你的伺服器!</translation>
     </message>
     <message>
         <source>Click to copy your unique server URL to your clipboard. Send this link to your friends and they will be able to join you.</source>
-        <translation type="unfinished">點擊複製你獨特的伺服器URL到剪貼簿。將此鏈接發送給你的朋友,他們就可以加入你。</translation>
+        <translation>點擊複製你獨特的伺服器URL到剪貼簿。將此鏈接發送給你的朋友,他們就可以加入你。</translation>
     </message>
     <message>
         <source>Start private server</source>
         <translation>啟動私人伺服器</translation>
     </message>
+    <message>
+        <source>Specify address</source>
+        <translation>指定IP位址</translation>
+    </message>
 </context>
 <context>
     <name>QSpinBox</name>
     <message>
         <source>Specify the bitrate of recorded videos as a multiple of 1024 bits per second</source>
-        <translation type="unfinished"></translation>
+        <translation>指定錄製的視頻其比特率為1Kb/s的倍數</translation>
     </message>
 </context>
 <context>
@@ -3281,68 +3471,68 @@
     <name>RoomsListModel</name>
     <message>
         <source>In progress</source>
-        <translation type="unfinished">進行中</translation>
+        <translation>進行中</translation>
     </message>
     <message>
         <source>Room Name</source>
-        <translation type="unfinished">房間名</translation>
+        <translation>房間名</translation>
     </message>
     <message>
         <source>C</source>
         <extracomment>Caption of the column for the number of connected clients in the list of rooms</extracomment>
-        <translation type="unfinished">人數</translation>
+        <translation>人數</translation>
     </message>
     <message>
         <source>T</source>
         <extracomment>Caption of the column for the number of teams in the list of rooms</extracomment>
-        <translation type="unfinished">隊伍</translation>
+        <translation>隊伍</translation>
     </message>
     <message>
         <source>Owner</source>
-        <translation type="unfinished">創建者</translation>
+        <translation>創建者</translation>
     </message>
     <message>
         <source>Map</source>
-        <translation type="unfinished">地圖</translation>
+        <translation>地圖</translation>
     </message>
     <message>
         <source>Rules</source>
-        <translation type="unfinished">規則</translation>
+        <translation>規則</translation>
     </message>
     <message>
         <source>Weapons</source>
-        <translation type="unfinished">武器</translation>
+        <translation>武器</translation>
     </message>
     <message>
         <source>Random Map</source>
-        <translation type="unfinished">隨機地圖</translation>
+        <translation>隨機地圖</translation>
     </message>
     <message>
         <source>Random Maze</source>
-        <translation type="unfinished">隨機迷宮</translation>
+        <translation>Maze隨機算法</translation>
     </message>
     <message>
         <source>Hand-drawn</source>
-        <translation type="unfinished">手繪</translation>
+        <translation>手繪</translation>
     </message>
     <message>
         <source>Script</source>
-        <translation type="unfinished">腳本</translation>
+        <translation>腳本</translation>
     </message>
     <message>
         <source>Random Perlin</source>
-        <translation type="unfinished"></translation>
+        <translation>Perlin隨機算法</translation>
     </message>
     <message>
         <source>Forts</source>
-        <translation type="unfinished"></translation>
+        <translation>堡壘</translation>
     </message>
 </context>
 <context>
     <name>SeedPrompt</name>
     <message>
         <source>The map seed is the basis for all random values generated by the game.</source>
-        <translation type="unfinished">地圖種子是基礎由遊戲生成的所有隨機值。</translation>
+        <translation>地圖種子是遊戲裡所有隨機值的基礎。</translation>
     </message>
     <message>
         <source>Cancel</source>
@@ -3350,7 +3540,7 @@
     </message>
     <message>
         <source>Set seed</source>
-        <translation type="unfinished">給定種子</translation>
+        <translation>給定種子</translation>
     </message>
     <message>
         <source>Close</source>
@@ -3359,14 +3549,14 @@
     <message>
         <source>Seed</source>
         <extracomment>Refers to the &quot;random seed&quot;; the source of randomness in the game</extracomment>
-        <translation type="unfinished">種子</translation>
+        <translation>種子</translation>
     </message>
 </context>
 <context>
     <name>SelWeaponWidget</name>
     <message>
         <source>Weapon set</source>
-        <translation type="unfinished">武器組合</translation>
+        <translation>武器組合</translation>
     </message>
     <message>
         <source>Probabilities</source>
@@ -3386,35 +3576,35 @@
     </message>
     <message>
         <source>copy of %1</source>
-        <translation type="obsolete">%1的拷貝</translation>
+        <translation type="vanished">%1的拷貝</translation>
     </message>
     <message>
         <source>New</source>
-        <translation type="unfinished">新增</translation>
+        <translation>新增</translation>
     </message>
     <message>
         <source>New (%1)</source>
-        <translation type="unfinished"></translation>
+        <translation>新增(%1)</translation>
     </message>
     <message>
         <source>Copy of %1</source>
-        <translation type="unfinished"></translation>
+        <translation>%1的拷貝</translation>
     </message>
     <message>
         <source>Copy of %1 (%2)</source>
-        <translation type="unfinished"></translation>
+        <translation>%1的拷貝(%2)</translation>
     </message>
 </context>
 <context>
     <name>TCPBase</name>
     <message>
         <source>Unable to start server at %1.</source>
-        <translation type="unfinished">無法在%1,啟動伺服器。</translation>
+        <translation>無法在%1,啟動伺服器。</translation>
     </message>
     <message>
         <source>Unable to run engine at %1
 Error code: %2</source>
-        <translation type="unfinished">無法在%1,運行引擎
+        <translation>無法在%1,運行引擎
 錯誤代碼:%2</translation>
     </message>
     <message>
@@ -3424,12 +3614,12 @@
 We are very sorry for the inconvenience :(
 
 If this keeps happening, please click the &apos;%2&apos; button in the main menu!</source>
-        <translation type="unfinished">遊戲引擎意外死亡
+        <translation>遊戲引擎意外死亡
 (退出代碼為%1)
 
 我們很抱歉給你帶來不便! :(
 
-如果這一情況持續發生,請點擊主菜單中的“%2”按鈕!</translation>
+如果這一情況持續發生,請點擊主選單中的“%2”按鈕!</translation>
     </message>
 </context>
 <context>
@@ -3447,15 +3637,15 @@
     </message>
     <message>
         <source>Search for a theme:</source>
-        <translation type="unfinished">搜索主題:</translation>
+        <translation>搜索主題:</translation>
     </message>
     <message>
         <source>Use selected theme</source>
-        <translation type="unfinished">使用選定的主題</translation>
+        <translation>使用選定的主題</translation>
     </message>
     <message>
         <source>Choose a theme</source>
-        <translation type="unfinished">選擇一個主題</translation>
+        <translation>選擇一個主題</translation>
     </message>
 </context>
 <context>
@@ -3490,35 +3680,35 @@
     </message>
     <message>
         <source>slot 1</source>
-        <translation type="unfinished">第1類</translation>
+        <translation>第1類</translation>
     </message>
     <message>
         <source>slot 2</source>
-        <translation type="unfinished">第2類</translation>
+        <translation>第2類</translation>
     </message>
     <message>
         <source>slot 3</source>
-        <translation type="unfinished">第3類</translation>
+        <translation>第3類</translation>
     </message>
     <message>
         <source>slot 4</source>
-        <translation type="unfinished">第4類</translation>
+        <translation>第4類</translation>
     </message>
     <message>
         <source>slot 5</source>
-        <translation type="unfinished">第5類</translation>
+        <translation>第5類</translation>
     </message>
     <message>
         <source>slot 6</source>
-        <translation type="unfinished">第6類</translation>
+        <translation>第6類</translation>
     </message>
     <message>
         <source>slot 7</source>
-        <translation type="unfinished">第7類</translation>
+        <translation>第7類</translation>
     </message>
     <message>
         <source>slot 8</source>
-        <translation type="unfinished">第8類</translation>
+        <translation>第8類</translation>
     </message>
     <message>
         <source>timer 1 sec</source>
@@ -3542,7 +3732,7 @@
     </message>
     <message>
         <source>capture</source>
-        <translation>抓取</translation>
+        <translation type="vanished">抓取</translation>
     </message>
     <message>
         <source>quit</source>
@@ -3574,7 +3764,7 @@
     </message>
     <message>
         <source>slot 9</source>
-        <translation type="unfinished">第9類</translation>
+        <translation>第9類</translation>
     </message>
     <message>
         <source>precise aim</source>
@@ -3602,7 +3792,7 @@
     </message>
     <message>
         <source>reset zoom</source>
-        <translation>重置</translation>
+        <translation type="vanished">重置</translation>
     </message>
     <message>
         <source>long jump</source>
@@ -3614,7 +3804,7 @@
     </message>
     <message>
         <source>slot 10</source>
-        <translation type="unfinished">第10類</translation>
+        <translation>第10類</translation>
     </message>
     <message>
         <source>mute audio</source>
@@ -3622,7 +3812,7 @@
     </message>
     <message>
         <source>record</source>
-        <translation type="unfinished">錄像切換</translation>
+        <translation>錄像切換</translation>
     </message>
     <message>
         <source>hedgehog info</source>
@@ -3639,26 +3829,82 @@
     <message>
         <source>toggle team bars</source>
         <extracomment>This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen</extracomment>
-        <translation type="unfinished"></translation>
+        <translation>切換隊伍資訊欄</translation>
     </message>
     <message>
         <source>pause / auto skip</source>
-        <translation type="unfinished"></translation>
+        <translation>暫停 / 自動跳過</translation>
     </message>
     <message>
         <source>toggle hedgehog tags</source>
-        <translation type="unfinished"></translation>
+        <translation>切換刺蝟標示</translation>
     </message>
     <message>
         <source>change timer</source>
-        <translation type="unfinished"></translation>
+        <translation>改變定時</translation>
     </message>
     <message>
         <source>show mission information</source>
-        <translation type="unfinished"></translation>
+        <translation>顯示任務資訊</translation>
     </message>
     <message>
         <source>clan chat</source>
+        <translation>隊伍聊天</translation>
+    </message>
+    <message>
+        <source>unselect weapon</source>
+        <translation>不選擇武器</translation>
+    </message>
+    <message>
+        <source>stand still on slippery land</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change direction without moving</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch backwards</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change bounciness</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>reset zoom to start value</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>set zoom to 100%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>save map as image</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>show object information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>change hedgehog tag types</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle hedgehog tag translucency</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>toggle HUD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>backwards jump</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>screenshot</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -3674,7 +3920,7 @@
     </message>
     <message>
         <source>Camera</source>
-        <translation type="unfinished">鏡頭</translation>
+        <translation>鏡頭</translation>
     </message>
     <message>
         <source>Miscellaneous</source>
@@ -3682,6 +3928,49 @@
     </message>
 </context>
 <context>
+    <name>binds (combination)</name>
+    <message>
+        <source>hold down precise</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + left/right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + timer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + reset zoom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + switch + toggle hedgehog tags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>high jump (twice)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>precise + screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>binds (descriptions)</name>
     <message>
         <source>Traverse gaps and obstacles by jumping:</source>
@@ -3761,11 +4050,11 @@
     </message>
     <message>
         <source>Heads-up display:</source>
-        <translation type="unfinished"></translation>
+        <translation>抬頭顯示:</translation>
     </message>
     <message>
         <source>Talk to your clan or all participants:</source>
-        <translation type="unfinished"></translation>
+        <translation>同隊友或全部參與者對話</translation>
     </message>
 </context>
 <context>
@@ -3856,71 +4145,67 @@
     </message>
     <message>
         <source>Numpad 0</source>
-        <translation>小鍵盤0</translation>
+        <translation type="vanished">小鍵盤0</translation>
     </message>
     <message>
         <source>Numpad 1</source>
-        <translation>小鍵盤1</translation>
+        <translation type="vanished">小鍵盤1</translation>
     </message>
     <message>
         <source>Numpad 2</source>
-        <translation>小鍵盤2</translation>
+        <translation type="vanished">小鍵盤2</translation>
     </message>
     <message>
         <source>Numpad 3</source>
-        <translation>小鍵盤3</translation>
+        <translation type="vanished">小鍵盤3</translation>
     </message>
     <message>
         <source>Numpad 4</source>
-        <translation>小鍵盤4</translation>
+        <translation type="vanished">小鍵盤4</translation>
     </message>
     <message>
         <source>Numpad 5</source>
-        <translation>小鍵盤5</translation>
+        <translation type="vanished">小鍵盤5</translation>
     </message>
     <message>
         <source>Numpad 6</source>
-        <translation>小鍵盤6</translation>
+        <translation type="vanished">小鍵盤6</translation>
     </message>
     <message>
         <source>Numpad 7</source>
-        <translation>小鍵盤7</translation>
+        <translation type="vanished">小鍵盤7</translation>
     </message>
     <message>
         <source>Numpad 8</source>
-        <translation>小鍵盤8</translation>
+        <translation type="vanished">小鍵盤8</translation>
     </message>
     <message>
         <source>Numpad 9</source>
-        <translation>小鍵盤9</translation>
+        <translation type="vanished">小鍵盤9</translation>
     </message>
     <message>
         <source>Numpad .</source>
-        <translation>小鍵盤.</translation>
+        <translation type="vanished">小鍵盤.</translation>
     </message>
     <message>
         <source>Numpad /</source>
-        <translation>小鍵盤/</translation>
+        <translation type="vanished">小鍵盤/</translation>
     </message>
     <message>
         <source>Numpad *</source>
-        <translation>小鍵盤*</translation>
+        <translation type="vanished">小鍵盤*</translation>
     </message>
     <message>
         <source>Numpad -</source>
-        <translation>小鍵盤-</translation>
+        <translation type="vanished">小鍵盤-</translation>
     </message>
     <message>
         <source>Numpad +</source>
-        <translation>小鍵盤+</translation>
+        <translation type="vanished">小鍵盤+</translation>
     </message>
     <message>
         <source>Enter</source>
-        <translation>Enter</translation>
-    </message>
-    <message>
-        <source>Equals</source>
-        <translation type="unfinished"></translation>
+        <translation type="vanished">Enter</translation>
     </message>
     <message>
         <source>Up</source>
@@ -3951,136 +4236,124 @@
         <translation></translation>
     </message>
     <message>
-        <source>Page up</source>
-        <translation></translation>
-    </message>
-    <message>
-        <source>Page down</source>
-        <translation></translation>
-    </message>
-    <message>
         <source>Num lock</source>
-        <translation>小鍵盤數位鎖</translation>
+        <translation type="vanished">小鍵盤數位鎖</translation>
     </message>
     <message>
         <source>Caps lock</source>
-        <translation>大小寫切換鍵</translation>
-    </message>
-    <message>
-        <source>Scroll lock</source>
-        <translation></translation>
+        <translation type="vanished">大小寫切換鍵</translation>
     </message>
     <message>
         <source>Right shift</source>
-        <translation>右Shift鍵</translation>
+        <translation type="vanished">右Shift鍵</translation>
     </message>
     <message>
         <source>Left shift</source>
-        <translation>左Shift鍵</translation>
+        <translation type="vanished">左Shift鍵</translation>
     </message>
     <message>
         <source>Right ctrl</source>
-        <translation>右Ctrl鍵</translation>
+        <translation type="vanished">右Ctrl鍵</translation>
     </message>
     <message>
         <source>Left ctrl</source>
-        <translation>左Ctrl鍵</translation>
+        <translation type="vanished">左Ctrl鍵</translation>
     </message>
     <message>
         <source>Right alt</source>
-        <translation>右Alt鍵</translation>
+        <translation type="vanished">右Alt鍵</translation>
     </message>
     <message>
         <source>Left alt</source>
-        <translation>左Alt鍵</translation>
+        <translation type="vanished">左Alt鍵</translation>
     </message>
     <message>
         <source>Right meta</source>
-        <translation>右meta鍵</translation>
+        <translation type="vanished">右meta鍵</translation>
     </message>
     <message>
         <source>Left meta</source>
-        <translation>左meta鍵</translation>
+        <translation type="vanished">左meta鍵</translation>
     </message>
     <message>
         <source>A button</source>
-        <translation type="unfinished">A鈕</translation>
+        <translation>A鈕</translation>
     </message>
     <message>
         <source>B button</source>
-        <translation type="unfinished">B鈕</translation>
+        <translation>B鈕</translation>
     </message>
     <message>
         <source>X button</source>
-        <translation type="unfinished">X鈕</translation>
+        <translation>X鈕</translation>
     </message>
     <message>
         <source>Y button</source>
-        <translation type="unfinished">Y鈕</translation>
+        <translation>Y鈕</translation>
     </message>
     <message>
         <source>LB button</source>
-        <translation type="unfinished">LB鈕</translation>
+        <translation>LB鈕</translation>
     </message>
     <message>
         <source>RB button</source>
-        <translation type="unfinished">RB鈕</translation>
+        <translation>RB鈕</translation>
     </message>
     <message>
         <source>Back button</source>
-        <translation type="unfinished">Back鈕</translation>
+        <translation>Back鈕</translation>
     </message>
     <message>
         <source>Start button</source>
-        <translation type="unfinished">Start鈕</translation>
+        <translation>Start鈕</translation>
     </message>
     <message>
         <source>Left stick</source>
-        <translation type="unfinished">左搖桿</translation>
+        <translation>左搖桿</translation>
     </message>
     <message>
         <source>Right stick</source>
-        <translation type="unfinished">右搖桿</translation>
+        <translation>右搖桿</translation>
     </message>
     <message>
         <source>Left stick (Right)</source>
-        <translation type="unfinished">左搖桿(右)</translation>
+        <translation>左搖桿(右)</translation>
     </message>
     <message>
         <source>Left stick (Left)</source>
-        <translation type="unfinished">左搖桿(左)</translation>
+        <translation>左搖桿(左)</translation>
     </message>
     <message>
         <source>Left stick (Down)</source>
-        <translation type="unfinished">左搖桿(下)</translation>
+        <translation>左搖桿(下)</translation>
     </message>
     <message>
         <source>Left stick (Up)</source>
-        <translation type="unfinished">左搖桿(上)</translation>
+        <translation>左搖桿(上)</translation>
     </message>
     <message>
         <source>Left trigger</source>
-        <translation type="unfinished">LT鈕</translation>
+        <translation>LT鈕</translation>
     </message>
     <message>
         <source>Right trigger</source>
-        <translation type="unfinished">RT鈕</translation>
+        <translation>RT鈕</translation>
     </message>
     <message>
         <source>Right stick (Down)</source>
-        <translation type="unfinished">右搖桿(下)</translation>
+        <translation>右搖桿(下)</translation>
     </message>
     <message>
         <source>Right stick (Up)</source>
-        <translation type="unfinished">右搖桿(上)</translation>
+        <translation>右搖桿(上)</translation>
     </message>
     <message>
         <source>Right stick (Right)</source>
-        <translation type="unfinished">右搖桿(右)</translation>
+        <translation>右搖桿(右)</translation>
     </message>
     <message>
         <source>Right stick (Left)</source>
-        <translation type="unfinished">右搖桿(左)</translation>
+        <translation>右搖桿(左)</translation>
     </message>
     <message>
         <source>DPad</source>
@@ -4088,23 +4361,626 @@
     </message>
     <message>
         <source>D-pad</source>
-        <translation type="unfinished"></translation>
+        <translation>十字键</translation>
     </message>
     <message>
         <source>Axis %1 %2</source>
         <extracomment>Game controller axis direction. %1 = axis number, %2 = direction</extracomment>
-        <translation type="unfinished"></translation>
+        <translation>軸 %1 %2</translation>
     </message>
     <message>
         <source>Button %1</source>
         <extracomment>Game controller button. %1 = button number</extracomment>
-        <translation type="unfinished"></translation>
+        <translation>按鈕 %1</translation>
     </message>
     <message>
         <source>D-pad %1 %2</source>
         <extracomment>Game controller D-pad button. %1 = D-pad number, %2 = direction</extracomment>
+        <translation>十字键 %1 %2</translation>
+    </message>
+    <message>
+        <source>(Don&apos;t use)</source>
+        <extracomment>Special entry in key selection when an action has no control assigned</extracomment>
+        <translation>(不使用)</translation>
+    </message>
+    <message>
+        <source>Mouse: X1 button </source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Mouse: X2 button</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad 9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad /</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad *</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad -</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad +</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Keypad Enter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageUp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PageDown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Numlock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CapsLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ScrollLock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Shift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Ctrl</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left Alt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Right GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (right)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Left GUI</source>
+        <extracomment>Windows key / Command key / Meta key /Super key (left)</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(QWERTY)</source>
+        <extracomment>Name of QWERTY US keyboard layout</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>credits</name>
+    <message>
+        <source>Programming</source>
+        <translation>程序設計</translation>
+    </message>
+    <message>
+        <source>Game engine</source>
+        <translation>遊戲引擎</translation>
+    </message>
+    <message>
+        <source>Creator</source>
+        <translation>創造者</translation>
+    </message>
+    <message>
+        <source>Many engine improvements</source>
+        <translation>許多引擎的改善</translation>
+    </message>
+    <message>
+        <source>Gamepad and Lua integration</source>
+        <translation>遊戲手柄與Lua整合</translation>
+    </message>
+    <message>
+        <source>Campaign support</source>
+        <translation>活動支持</translation>
+    </message>
+    <message>
+        <source>Theme customization improvements</source>
+        <translation>主體客製化改善</translation>
+    </message>
+    <message>
+        <source>Some Pas2C and GLES2 work</source>
+        <translation>一些Pas2C和GLES2工作</translation>
+    </message>
+    <message>
+        <source>Video recording</source>
+        <translation>視頻錄製</translation>
+    </message>
+    <message>
+        <source>Other improvements</source>
+        <translation>其他改善</translation>
+    </message>
+    <message>
+        <source>Map generation</source>
+        <translation>地圖生成</translation>
+    </message>
+    <message>
+        <source>Core map generators</source>
+        <translation>核心地圖生成器</translation>
+    </message>
+    <message>
+        <source>Perlin maps and other improvements</source>
+        <translation>Perlin地圖和其他改善</translation>
+    </message>
+    <message>
+        <source>Maze maps</source>
+        <translation>迷宮地圖</translation>
+    </message>
+    <message>
+        <source>Weapons</source>
+        <translation>武器</translation>
+    </message>
+    <message>
+        <source>Most core weapons</source>
+        <translation>大部分核心武器</translation>
+    </message>
+    <message>
+        <source>Air mine, rubber, others</source>
+        <translation>浮空雷, 橡皮筋, 其他</translation>
+    </message>
+    <message>
+        <source>Drill rocket, ballgun, RC plane</source>
+        <translation>鑽地火箭, 彈珠槍, 遙控飛機</translation>
+    </message>
+    <message>
+        <source>Freezer</source>
+        <translation>急凍槍</translation>
+    </message>
+    <message>
+        <source>Mine number and time game settings</source>
+        <translation>地雷數量和時間的遊戲設定</translation>
+    </message>
+    <message>
+        <source>Frontend / main menu</source>
+        <translation>前端 / 主選單</translation>
+    </message>
+    <message>
+        <source>Many frontend improvements</source>
+        <translation>許多前端的改善</translation>
+    </message>
+    <message>
+        <source>Keybinds, feedback, maps and hats interfaces</source>
+        <translation>鍵盤綁定,反饋,地圖和帽子界面</translation>
+    </message>
+    <message>
+        <source>Login dialogs, other improvements</source>
+        <translation>登錄對話框,以及其他改進</translation>
+    </message>
+    <message>
+        <source>Missions and styles</source>
+        <translation>任務和一些風格</translation>
+    </message>
+    <message>
+        <source>A Classic Fairytale</source>
+        <translation>經典故事</translation>
+    </message>
+    <message>
+        <source>A Space Adventure</source>
+        <translation>太空探險</translation>
+    </message>
+    <message>
+        <source>Created Capture the Flag, Construction Mode, Control, HedgeEditor, Highlander, Racer, TechRacer, The Specialists, WxW</source>
+        <translation>創建奪旗,施工模式,控制,刺蝟編輯器,漢蘭達,賽車手,科技賽車手,專家,WxW</translation>
+    </message>
+    <message>
+        <source>Training, time-trial and target practice challenges, Bazooka Battlefield, Tentacle Terror, Big Armory, bugfixes and maintenance</source>
+        <translation>訓練,計時賽和目標練習挑戰,火箭筒戰場,恐怖觸手,大軍械庫,錯誤修正和維護</translation>
+    </message>
+    <message>
+        <source>Some styles and missions</source>
+        <translation>一些風格和任務</translation>
+    </message>
+    <message>
+        <source>Battalion</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Continental supplies</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Teamwork 2</source>
+        <translation>團隊合作2</translation>
+    </message>
+    <message>
+        <source>Climb Home</source>
+        <translation>爬上家裡</translation>
+    </message>
+    <message>
+        <source>Portal Mind Challenge</source>
+        <translation>傳送門挑戰</translation>
+    </message>
+    <message>
+        <source>Game server</source>
+        <translation>遊戲伺服器</translation>
+    </message>
+    <message>
+        <source>Ports</source>
+        <translation>部份</translation>
+    </message>
+    <message>
+        <source>macOS/iPhone port, OpenGL-ES conversion</source>
+        <translation>macOS/iPhone部份,OpenGL-ES轉換</translation>
+    </message>
+    <message>
+        <source>Android port</source>
+        <translation>Android部份</translation>
+    </message>
+    <message>
+        <source>Android netplay, portability abstraction</source>
+        <translation>Android網路遊戲,移植性的抽象層</translation>
+    </message>
+    <message>
+        <source>WebGL port</source>
+        <translation>WebGL部份</translation>
+    </message>
+    <message>
+        <source>iPhone/iPad ports</source>
+        <translation>iPhone/iPad部份</translation>
+    </message>
+    <message>
+        <source>Graphics</source>
+        <translation>圖像</translation>
+    </message>
+    <message>
+        <source>General</source>
+        <translation>常規</translation>
+    </message>
+    <message>
+        <source>Themes</source>
+        <translation>主題</translation>
+    </message>
+    <message>
+        <source>Nature, Snow, City, Castle, Halloween, Island</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Bamboo, EarthRise, BambooPlinko</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Golf, Hoggywood, Stage</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Hoggywood</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Cave, Olympics</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Fruit, Cake</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Art</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Beach</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Brick</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Hell</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Jungle</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Sheep</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Maps</source>
+        <translation>地圖</translation>
+    </message>
+    <message>
+        <source>Basketball, BasketballField, Bath, Bubbleflow, Hammock, Hedgelove, Hedgewars, Hydrant, Mushrooms, Plane, Ropes, Tree</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>SB_Bones, SB_Crystal, SB_Grassy, SB_Grove, SB_Haunty, SB_Oaks, SB_Shrooms, SB_Tentacle</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Bamboo, Blox, Cake, Cogs, EarthRise, Freeway</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Castle, PirateFlag</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>ShoppaKing, TrophyRace</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Battlefield</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>CTF_Blizzard</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Cheese</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>ClimbHome</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Lonely_Island</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Octorama</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>portal</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Ruler</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Sticks</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Forts</source>
+        <translation>堡壘</translation>
+    </message>
+    <message>
+        <source>EvilChicken</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Olympic</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Tank</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Snail</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>SteelTower</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Hats, graves, other</source>
+        <translation>帽子, 墳墓, 其他</translation>
+    </message>
+    <message>
+        <source>See CREDITS text file</source>
+        <translation>看貢獻文字檔</translation>
+    </message>
+    <message>
+        <source>Sounds</source>
+        <translation>音效</translation>
+    </message>
+    <message>
+        <source>Hedgehogs voice</source>
+        <translation>刺蝟聲音</translation>
+    </message>
+    <message>
+        <source>Default_pl, Russian_pl voices</source>
+        <translation>預設聲音,俄羅斯聲音</translation>
+    </message>
+    <message>
+        <source>Various authors from www.freesound.org (see CREDITS text file)</source>
+        <translation>多個作者來自www.freesound.org(看貢獻文字檔)</translation>
+    </message>
+    <message>
+        <source>Music</source>
+        <translation>音樂</translation>
+    </message>
+    <message>
+        <source>City, Rock, others</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Compost</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>EarthRise, oriental, Pirate, snow</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Fruit, Jungle</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Nature</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>olympics_sd</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>sdmusic (Hitman [sheepluva edit])</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Translations</source>
+        <translation>翻譯</translation>
+    </message>
+    <message>
+        <source>Brazilian Portuguese</source>
+        <translation>巴西葡萄牙文</translation>
+    </message>
+    <message>
+        <source>Bulgarian</source>
+        <translation>保加利亞文</translation>
+    </message>
+    <message>
+        <source>Czech</source>
+        <translation>捷克文</translation>
+    </message>
+    <message>
+        <source>Chinese</source>
+        <translation>中文</translation>
+    </message>
+    <message>
+        <source>Finnish</source>
+        <translation>芬蘭文</translation>
+    </message>
+    <message>
+        <source>French</source>
+        <translation>法文</translation>
+    </message>
+    <message>
+        <source>German</source>
+        <translation>德文</translation>
+    </message>
+    <message>
+        <source>Greek</source>
+        <translation>希臘文</translation>
+    </message>
+    <message>
+        <source>Italian</source>
+        <translation>義大利文</translation>
+    </message>
+    <message>
+        <source>Japanese</source>
+        <translation>日文</translation>
+    </message>
+    <message>
+        <source>Korean</source>
+        <translation>韓文</translation>
+    </message>
+    <message>
+        <source>Lithuanian</source>
+        <translation>立陶宛文</translation>
+    </message>
+    <message>
+        <source>Polish</source>
+        <translation>波蘭文</translation>
+    </message>
+    <message>
+        <source>Portuguese</source>
+        <translation>葡萄牙文</translation>
+    </message>
+    <message>
+        <source>Russian</source>
+        <translation>俄羅斯文</translation>
+    </message>
+    <message>
+        <source>Scottish Gaelic</source>
+        <translation>蓋爾文</translation>
+    </message>
+    <message>
+        <source>Slovak</source>
+        <translation>斯洛伐克文</translation>
+    </message>
+    <message>
+        <source>Spanish</source>
+        <translation>西班牙文</translation>
+    </message>
+    <message>
+        <source>Swedish</source>
+        <translation>瑞典文</translation>
+    </message>
+    <message>
+        <source>Ukrainian</source>
+        <translation>烏克蘭文</translation>
+    </message>
+    <message>
+        <source>Special thanks</source>
+        <translation>特別感謝</translation>
+    </message>
+    <message>
+        <source>Project founder</source>
+        <translation>項目創始人</translation>
+    </message>
 </context>
 <context>
     <name>server</name>
@@ -4178,27 +5054,27 @@
     </message>
     <message>
         <source>Nickname is already in use</source>
-        <translation type="unfinished">暱稱已經被使用</translation>
+        <translation>暱稱已經被使用</translation>
     </message>
     <message>
         <source>No checker rights</source>
-        <translation type="unfinished">沒有檢查權</translation>
+        <translation>沒有檢查權</translation>
     </message>
     <message>
         <source>Authentication failed</source>
-        <translation type="unfinished">驗證失敗</translation>
+        <translation>驗證失敗</translation>
     </message>
     <message>
         <source>60 seconds cooldown after kick</source>
-        <translation type="unfinished">被踢出後60秒冷卻時間</translation>
+        <translation>被踢出後60秒冷卻時間</translation>
     </message>
     <message>
         <source>kicked</source>
-        <translation type="unfinished">被踢出</translation>
+        <translation>被踢出</translation>
     </message>
     <message>
         <source>Ping timeout</source>
-        <translation type="unfinished">Ping超時</translation>
+        <translation>Ping超時</translation>
     </message>
     <message>
         <source>bye</source>
@@ -4238,7 +5114,7 @@
     </message>
     <message>
         <source>New voting started</source>
-        <translation type="unfinished">新的投票開始</translation>
+        <translation>新的投票開始</translation>
     </message>
     <message>
         <source>Voting expired</source>
@@ -4246,11 +5122,11 @@
     </message>
     <message>
         <source>kick</source>
-        <translation type="unfinished">踢</translation>
+        <translation>踢</translation>
     </message>
     <message>
         <source>map</source>
-        <translation type="unfinished">地圖</translation>
+        <translation>地圖</translation>
     </message>
     <message>
         <source>pause</source>
@@ -4258,19 +5134,19 @@
     </message>
     <message>
         <source>Reconnected too fast</source>
-        <translation type="unfinished">太快重新連線</translation>
+        <translation>太快重新連線</translation>
     </message>
     <message>
         <source>Warning! Chat flood protection activated</source>
-        <translation type="unfinished">警告! 避免聊天氾濫的防護機制被啟動</translation>
+        <translation>警告! 避免聊天氾濫的防護機制被啟動</translation>
     </message>
     <message>
         <source>Excess flood</source>
-        <translation type="unfinished">超額洪水</translation>
+        <translation>超額洪水</translation>
     </message>
     <message>
         <source>Game messages flood detected - 1</source>
-        <translation type="unfinished">已經偵測到遊戲訊息氾濫 - 1</translation>
+        <translation>已經偵測到遊戲訊息氾濫 - 1</translation>
     </message>
     <message>
         <source>Game messages flood detected - 2</source>
@@ -4278,7 +5154,7 @@
     </message>
     <message>
         <source>Warning! Joins flood protection activated</source>
-        <translation type="unfinished">警告! 避免加入氾濫的防護機制被啟動</translation>
+        <translation>警告! 避免加入氾濫的防護機制被啟動</translation>
     </message>
     <message>
         <source>There&apos;s no voting going on</source>
@@ -4286,374 +5162,386 @@
     </message>
     <message>
         <source>new seed</source>
-        <translation type="unfinished"></translation>
+        <translation>新的種子</translation>
     </message>
     <message>
         <source>/maxteams: specify number from 2 to 8</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Available callvote commands: kick &lt;nickname&gt;, map &lt;name&gt;, pause, newseed, hedgehogs</source>
-        <translation type="unfinished"></translation>
+        <translation>/最多隊伍數:指定從2到8</translation>
     </message>
     <message>
         <source>The game can&apos;t be started with less than two clans!</source>
-        <translation type="unfinished"></translation>
+        <translation>少於兩隊遊戲不能開始</translation>
     </message>
     <message>
         <source>Empty config entry.</source>
-        <translation type="unfinished"></translation>
+        <translation>空配置條目。</translation>
     </message>
     <message>
         <source>Access denied.</source>
-        <translation type="unfinished"></translation>
+        <translation>拒絕訪問。</translation>
     </message>
     <message>
         <source>You&apos;re not the room master!</source>
-        <translation type="unfinished"></translation>
+        <translation>你不是房間主人!</translation>
     </message>
     <message>
         <source>Corrupted hedgehogs info!</source>
-        <translation type="unfinished"></translation>
+        <translation>毀損的刺蝟資訊!</translation>
     </message>
     <message>
         <source>Too many teams!</source>
-        <translation type="unfinished"></translation>
+        <translation>太多隊伍!</translation>
     </message>
     <message>
         <source>Too many hedgehogs!</source>
-        <translation type="unfinished"></translation>
+        <translation>太多刺蝟!</translation>
     </message>
     <message>
         <source>There&apos;s already a team with same name in the list.</source>
-        <translation type="unfinished"></translation>
+        <translation>已經有個相同的隊名在列表。</translation>
     </message>
     <message>
         <source>Joining not possible: Round is in progress.</source>
-        <translation type="unfinished"></translation>
+        <translation>不能加入:遊戲正在進行中。</translation>
     </message>
     <message>
         <source>This room currently does not allow adding new teams.</source>
-        <translation type="unfinished"></translation>
+        <translation>這個房間目前不允許添加新的隊伍。</translation>
     </message>
     <message>
         <source>Error: The team you tried to remove does not exist.</source>
-        <translation type="unfinished"></translation>
+        <translation>錯誤:您嘗試刪除的隊伍不存在。</translation>
     </message>
     <message>
         <source>You can&apos;t remove a team you don&apos;t own.</source>
-        <translation type="unfinished"></translation>
+        <translation>你無法刪除不屬於你的隊伍。</translation>
     </message>
     <message>
         <source>Illegal room name! The room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
-        <translation type="unfinished"></translation>
+        <translation>非法的房間名稱!房間名稱長必須介於1-40個字符之間,不得有尾隨或前導空格,且不得包含以下任何字符: $()*+?[]^{|}</translation>
     </message>
     <message>
         <source>A room with the same name already exists.</source>
-        <translation type="unfinished"></translation>
+        <translation>一個有相同名稱的房間已經存在。</translation>
     </message>
     <message>
         <source>/callvote kick: You need to specify a nickname.</source>
-        <translation type="unfinished"></translation>
+        <translation>/callvote kick: 您需要指定一個暱稱。</translation>
     </message>
     <message>
         <source>/callvote kick: No such user!</source>
-        <translation type="unfinished"></translation>
+        <translation>/callvote kick: 沒有這樣的用戶!</translation>
     </message>
     <message>
         <source>/callvote map: No such map!</source>
-        <translation type="unfinished"></translation>
+        <translation>/callvote map: 沒有這樣的地圖!</translation>
     </message>
     <message>
         <source>/callvote pause: No game in progress!</source>
-        <translation type="unfinished"></translation>
+        <translation>/callvote pause: 沒有遊戲在進行中!</translation>
     </message>
     <message>
         <source>/callvote hedgehogs: Specify number from 1 to 8.</source>
-        <translation type="unfinished"></translation>
+        <translation>/callvote hedgehogs: 指定1到8之間的數字。</translation>
     </message>
     <message>
         <source>Illegal room name! A room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
-        <translation type="unfinished"></translation>
+        <translation>非法的房間名稱!房間名稱長必須介於1-40個字符之間,不得有尾隨或前導空格,且不得包含以下任何字符: $()*+?[]^{|}</translation>
     </message>
     <message>
         <source>No such room.</source>
-        <translation type="unfinished"></translation>
+        <translation>沒有這樣的房間。</translation>
     </message>
     <message>
         <source>Room version incompatible to your Hedgewars version!</source>
-        <translation type="unfinished"></translation>
+        <translation>房間的版本與你的刺蝟大作戰版本不兼容!</translation>
     </message>
     <message>
         <source>Access denied. This room currently doesn&apos;t allow joining.</source>
-        <translation type="unfinished"></translation>
+        <translation>拒絕訪問。這個房間目前不允許加入。</translation>
     </message>
     <message>
         <source>Access denied. This room is for registered users only.</source>
-        <translation type="unfinished"></translation>
+        <translation>拒絕訪問。這個房間僅供註冊用戶使用。</translation>
     </message>
     <message>
         <source>You are banned from this room.</source>
-        <translation type="unfinished"></translation>
+        <translation>你被這個房間封鎖</translation>
     </message>
     <message>
         <source>Nickname already provided.</source>
-        <translation type="unfinished"></translation>
+        <translation>暱稱已經提供。</translation>
     </message>
     <message>
         <source>Illegal nickname! Nicknames must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}</source>
-        <translation type="unfinished"></translation>
+        <translation>非法暱稱!暱稱長必須介於1-40個字符之間,不得有尾隨或前導空格,且不得包含以下任何字符: $()*+?[]^{|}</translation>
     </message>
     <message>
         <source>Protocol already known.</source>
-        <translation type="unfinished"></translation>
+        <translation>協議已知。</translation>
     </message>
     <message>
         <source>Bad number.</source>
-        <translation type="unfinished"></translation>
+        <translation>不好的號碼。</translation>
     </message>
     <message>
         <source>There&apos;s no voting going on.</source>
-        <translation type="unfinished"></translation>
+        <translation>沒有投票在進行。</translation>
     </message>
     <message>
         <source>You already have voted.</source>
-        <translation type="unfinished"></translation>
+        <translation>你已經投過票了。</translation>
     </message>
     <message>
         <source>Your vote has been counted.</source>
-        <translation type="unfinished"></translation>
+        <translation>你的投票已被計算在內。</translation>
     </message>
     <message>
         <source>Voting closed.</source>
-        <translation type="unfinished"></translation>
+        <translation>投票結束。</translation>
     </message>
     <message>
         <source>Pause toggled.</source>
-        <translation type="unfinished"></translation>
+        <translation>暫停切換。</translation>
     </message>
     <message>
         <source>Voting expired.</source>
-        <translation type="unfinished"></translation>
+        <translation>投票已過期。</translation>
     </message>
     <message>
         <source>hedgehogs per team: </source>
-        <translation type="unfinished"></translation>
+        <translation>每個隊伍的刺蝟:</translation>
     </message>
     <message>
         <source>/info &lt;player&gt;: Show info about player</source>
-        <translation type="unfinished"></translation>
+        <translation>/info &lt;player&gt;: 顯示玩家資訊</translation>
     </message>
     <message>
         <source>/me &lt;message&gt;: Chat action, e.g. &apos;/me eats pizza&apos; becomes &apos;* Player eats pizza&apos;</source>
-        <translation type="unfinished"></translation>
+        <translation>/me &lt;message&gt;: 聊天操作,例如:&apos;/me 吃披薩&apos;變成&apos;玩家暱稱 吃披薩&apos;</translation>
     </message>
     <message>
         <source>/rnd: Flip a virtual coin and reply with &apos;heads&apos; or &apos;tails&apos;</source>
-        <translation type="unfinished"></translation>
+        <translation>/rnd: 翻轉虛擬硬幣並回覆&apos;頭&apos;或&apos;尾&apos;</translation>
     </message>
     <message>
         <source>/rnd [A] [B] [C] [...]: Reply with a random word from the given list</source>
-        <translation type="unfinished"></translation>
+        <translation>/rnd [A] [B] [C] [...]: 隨機回复給定列表中的一個單詞</translation>
     </message>
     <message>
         <source>/watch &lt;id&gt;: Watch a demo stored on the server with the given ID</source>
-        <translation type="unfinished"></translation>
+        <translation>/watch &lt;id&gt;: 觀看存儲在伺服器上指定ID的演示</translation>
     </message>
     <message>
         <source>/help: Show chat command help</source>
-        <translation type="unfinished"></translation>
+        <translation>/help: 顯示聊天命令提示</translation>
     </message>
     <message>
         <source>/callvote [arguments]: Start a vote</source>
-        <translation type="unfinished"></translation>
+        <translation>/callvote [arguments]: 開始一個投票</translation>
     </message>
     <message>
         <source>/vote &lt;yes/no&gt;: Vote &apos;yes&apos; or &apos;no&apos; for active vote</source>
-        <translation type="unfinished"></translation>
+        <translation>/vote &lt;yes/no&gt;: 對進行中的投票,投&apos;是&apos;或&apos;不&apos;</translation>
     </message>
     <message>
         <source>/delegate &lt;player&gt;: Surrender room control to player</source>
-        <translation type="unfinished"></translation>
+        <translation>/delegate &lt;player&gt;: 下放房間控製到某個玩家</translation>
     </message>
     <message>
         <source>/maxteams &lt;N&gt;: Limit maximum number of teams to N</source>
-        <translation type="unfinished"></translation>
+        <translation>/maxteams &lt;N&gt;: 將隊伍數上限設置為N</translation>
     </message>
     <message>
         <source>/global &lt;message&gt;: Send global chat message which can be seen by everyone on the server</source>
-        <translation type="unfinished"></translation>
+        <translation>/global &lt;message&gt;: 發送全域聊天訊息,伺服器上的每個人都可以看到</translation>
     </message>
     <message>
         <source>/registered_only: Toggle &apos;registered only&apos; state. If enabled, only registered players can join server</source>
-        <translation type="unfinished"></translation>
+        <translation>/registered_only: 切換&apos;註冊專用&apos;狀態。如果啟用,只有註冊的玩家才能加入伺服器</translation>
     </message>
     <message>
         <source>/super_power: Activate your super power. With it you can enter any room and are protected from kicking. Expires when you leave server</source>
-        <translation type="unfinished"></translation>
+        <translation>/super_power:激活你的超能力。有了它,你可以進入任何房間,並受到免踢保護。直到你離開伺服器</translation>
     </message>
     <message>
         <source>/stats: Query server stats</source>
-        <translation type="unfinished"></translation>
+        <translation>/stats: 查詢伺服器統計信息</translation>
     </message>
     <message>
         <source>/force &lt;yes/no&gt;: Force vote result for active vote</source>
-        <translation type="unfinished"></translation>
+        <translation>/force &lt;yes/no&gt;: 強制決定進行中的投票</translation>
     </message>
     <message>
         <source>/fix: Force this room to stay open when it is empty</source>
-        <translation type="unfinished"></translation>
+        <translation>/fix: 迫使這個房間空著時保持打開狀態</translation>
     </message>
     <message>
         <source>/unfix: Undo the /fix command</source>
-        <translation type="unfinished"></translation>
+        <translation>撤消/fix命令</translation>
     </message>
     <message>
         <source>List of lobby chat commands:</source>
-        <translation type="unfinished"></translation>
+        <translation>列出大廳聊天命令:</translation>
     </message>
     <message>
         <source>List of room chat commands:</source>
-        <translation type="unfinished"></translation>
+        <translation>列出房間聊天命令:</translation>
     </message>
     <message>
         <source>Commands for server admins only:</source>
-        <translation type="unfinished"></translation>
+        <translation>伺服器管理員專用命令:</translation>
     </message>
     <message>
         <source>room</source>
-        <translation type="unfinished"></translation>
+        <translation>房間</translation>
     </message>
     <message>
         <source>lobby</source>
-        <translation type="unfinished"></translation>
+        <translation>大廳</translation>
     </message>
     <message>
         <source>(playing)</source>
-        <translation type="unfinished"></translation>
+        <translation>(遊玩中)</translation>
     </message>
     <message>
         <source>(spectating)</source>
-        <translation type="unfinished"></translation>
+        <translation>(觀看中)</translation>
     </message>
     <message>
         <source>Player is not online.</source>
-        <translation type="unfinished"></translation>
+        <translation>玩家不在線上</translation>
     </message>
     <message>
         <source>/force: Please use &apos;yes&apos; or &apos;no&apos;.</source>
-        <translation type="unfinished"></translation>
+        <translation>/force: 請使用&apos;yes&apos;或&apos;no&apos;</translation>
     </message>
     <message>
         <source>/vote: Please use &apos;yes&apos; or &apos;no&apos;.</source>
-        <translation type="unfinished"></translation>
+        <translation>/vote: 請使用&apos;yes&apos;或&apos;no&apos;</translation>
     </message>
     <message>
         <source>Kicked</source>
-        <translation type="unfinished"></translation>
+        <translation>被踢</translation>
     </message>
     <message>
         <source>This server only allows registered users to join.</source>
-        <translation type="unfinished"></translation>
+        <translation>此伺服器僅允許註冊用戶加入。</translation>
     </message>
     <message>
         <source>heads</source>
-        <translation type="unfinished"></translation>
+        <translation>頭</translation>
     </message>
     <message>
         <source>tails</source>
-        <translation type="unfinished"></translation>
+        <translation>尾</translation>
     </message>
     <message>
         <source>This server does not support replays!</source>
-        <translation type="unfinished"></translation>
+        <translation>此伺服器不支持重播!</translation>
     </message>
     <message>
         <source>/greeting [message]: Set or clear greeting message to be shown to players who join the room</source>
-        <translation type="unfinished"></translation>
+        <translation>/greeting [message]: 設置或清除要加入房間的玩家的歡迎訊息設定</translation>
     </message>
     <message>
         <source>/save &lt;config ID&gt; &lt;config name&gt;: Add current room configuration as votable choice for /callvote map</source>
-        <translation type="unfinished"></translation>
+        <translation>/save &lt;config ID&gt; &lt;config name&gt;: 添加當前房間配置作為/callvote map的可表決選項</translation>
     </message>
     <message>
         <source>/delete &lt;config ID&gt;: Delete a votable room configuration</source>
-        <translation type="unfinished"></translation>
+        <translation>/delete &lt;config ID&gt;: 刪除一個可表決的房間配置</translation>
     </message>
     <message>
         <source>/saveroom &lt;file name&gt;: Save all votable room configurations (and the greeting) of this room into a file</source>
-        <translation type="unfinished"></translation>
+        <translation>/saveroom &lt;file name&gt;: 將此房間的所有可表決配置(和歡迎訊息)保存到文件中</translation>
     </message>
     <message>
         <source>/loadroom &lt;file name&gt;: Load votable room configurations (and greeting) from a file</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>&apos;Registered only&apos; state toggled.</source>
-        <translation type="unfinished"></translation>
+        <translation>/loadroom &lt;file name&gt;: 從文件加載可表決房間配置(和歡迎訊息)</translation>
     </message>
     <message>
         <source>Super power activated.</source>
-        <translation type="unfinished"></translation>
+        <translation>超能力被激活。</translation>
     </message>
     <message>
         <source>Unknown command or invalid parameters. Say &apos;/help&apos; in chat for a list of commands.</source>
-        <translation type="unfinished"></translation>
+        <translation>未知命令或無效參數。在聊天中輸入&apos;/help&apos;查找命令列表。</translation>
     </message>
     <message>
         <source>You can&apos;t kick yourself!</source>
-        <translation type="unfinished"></translation>
+        <translation>你不能踢掉你自己!</translation>
     </message>
     <message>
         <source>You can&apos;t kick the only other player!</source>
-        <translation type="unfinished"></translation>
+        <translation>你不能踢掉剩下唯一的玩家!</translation>
     </message>
     <message>
         <source>The player is not in your room.</source>
-        <translation type="unfinished"></translation>
+        <translation>玩家不在你的房間裡。</translation>
     </message>
     <message>
         <source>This player is protected from being kicked.</source>
-        <translation type="unfinished"></translation>
+        <translation>該玩家受到保護,不會被踢。</translation>
     </message>
     <message>
         <source>You&apos;re not the room master or a server admin!</source>
-        <translation type="unfinished"></translation>
+        <translation>你不是房間主人或伺服器管理員</translation>
     </message>
     <message>
         <source>You&apos;re already the room master.</source>
-        <translation type="unfinished"></translation>
+        <translation>你已經是房間的主人</translation>
     </message>
     <message>
         <source>Greeting message cleared.</source>
-        <translation type="unfinished"></translation>
+        <translation>歡迎訊息清除</translation>
     </message>
     <message>
         <source>Greeting message set.</source>
-        <translation type="unfinished"></translation>
+        <translation>歡迎訊息設定</translation>
     </message>
     <message>
         <source>/callvote kick: This is only allowed in rooms without a room master.</source>
-        <translation type="unfinished"></translation>
+        <translation>/callvote kick: 這僅限於沒有主人的房間。</translation>
     </message>
     <message>
         <source>/callvote map: No maps available.</source>
-        <translation type="unfinished"></translation>
+        <translation>/callvote map: 沒有可用的地圖。</translation>
     </message>
     <message>
         <source>You&apos;re the new room master!</source>
-        <translation type="unfinished"></translation>
+        <translation>你是新房間的主人!</translation>
     </message>
     <message>
         <source>/quit: Quit the server</source>
-        <translation type="unfinished"></translation>
+        <translation>/quit: 退出伺服器</translation>
     </message>
     <message>
         <source>This command is only available in the lobby.</source>
-        <translation type="unfinished"></translation>
+        <translation>此命令僅在大廳中可用。</translation>
     </message>
     <message>
         <source>This command is only available in rooms.</source>
+        <translation>此命令僅在房間中可用。</translation>
+    </message>
+    <message>
+        <source>This server no longer allows unregistered players to join.</source>
+        <translation>此伺服器不再允許未註冊的玩家加入。</translation>
+    </message>
+    <message>
+        <source>This server now allows unregistered players to join.</source>
+        <translation>此伺服器不允許未註冊的玩家加入。</translation>
+    </message>
+    <message>
+        <source>Available callvote commands: hedgehogs &lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</source>
+        <translation>可用的呼叫投票命令:刺蝟&lt;number&gt;, pause, newseed, map &lt;name&gt;, kick &lt;player&gt;</translation>
+    </message>
+    <message>
+        <source>Please confirm server restart with &apos;/restart_server yes&apos;.</source>
+        <translation>請用&apos;/restart_server yes&apos;確認服務器重啟</translation>
+    </message>
+    <message>
+        <source>Warning! Room name change flood protection activated</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
--- a/share/hedgewars/Data/Locale/it.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/it.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -26,7 +26,6 @@
 --      ["Above-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Accuracy Bonus! +15 points"] = "", -- Space_Invasion
 --      ["Accuracy bonus: +%d points"] = "", -- Basic_Training_-_Sniper_Rifle
-    ["Ace"] = "Asso",
 --      ["Achievement gotten: %s"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_That_Sinking_Feeling, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, Basic_Training_-_Rope, Tumbler
     ["A Classic Fairytale"] = "Una favola classica",
 --      ["A crate critical to this mission has been destroyed."] = "", -- SimpleMission
@@ -46,7 +45,6 @@
     ["Again with the 'cannibals' thing!"] = "Ancora colla storia dei 'cannibali'!",
 --      ["A Hedgewars minigame"] = "", -- Capture_the_Flag
 --      ["A Hedgewars mini-game"] = "", -- Racer, Space_Invasion, TechRacer, Tumbler
-    ["a Hedgewars mini-game"] = "un mini-gioco di Hedgewars",
 --      ["A Hedgewars tag game"] = "", -- Mutant
 --      ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome
 --      ["Aim at the ceiling and hold [Attack] pressed until the rope attaches."] = "", -- Basic_Training_-_Rope
@@ -141,13 +139,14 @@
 --      ["As you've seen, the dropped grenade roughly fell into your flying direction."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Athlete"] = "", -- Battalion
 --      ["Attack: Activate"] = "", -- Racer
---      ["Attack Captain Lime before he attacks back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack Captain Lime before he attacks back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack From Rope: %s"] = "", -- WxW
 --      ["Attack From Rope: You may only attack from a rope."] = "", -- WxW
 --      ["Attack rule: %s"] = "", -- WxW
 --      ["Attack: Select this continent"] = "", -- Continental_supplies
 --      ["Attack: [Space]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
---      ["Attack the assassins before they attack back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack: Tap the [Bomb]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
+--      ["Attack the assassins before they attack back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack: Throw ball"] = "", -- Knockball
 --      ["At the end of the game your health was %d."] = "", -- A_Space_Adventure:ice01
 --      ["At the start of the game each enemy hog has only the weapon that he is named after."] = "", -- A_Space_Adventure:death02
@@ -155,16 +154,18 @@
 --      ["Available weapon specials:"] = "", -- Continental_supplies
 --      ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion
---      ["Avoid the mines!"] = "", -- Basic_Training_-_Rope
 --      ["Axes"] = "", -- Bazooka_Battlefield
 --      ["Aye! Fellow! Let me exit this chamber of doom!"] = "", -- A_Classic_Fairytale:epil
     ["Back Breaker"] = "Back Breaker", -- A_Classic_Fairytale:backstab
     ["Back in the village, after telling the villagers about the threat..."] = "Tornati al villaggio, dopo aver detto agli abitanti della minaccia...",
 --      ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil
 --      ["Back Jump: [Backspace] ×2"] = "", -- Basic_Training_-_Movement
+--      ["Back Jump: Double-tap the [Curvy Arrow]"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (1/2)"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (2/2)"] = "", -- Basic_Training_-_Movement
     ["Backstab"] = "Backstab", -- A_Classic_Fairytale:backstab
+--      ["Backwards jump: Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Backwards jump: Tap the [Curvy Arrow] twice"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Bacon"] = "", -- 
 --      ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Badmad"] = "", -- portal
@@ -197,7 +198,6 @@
 --      ["Bazooka Battlefield"] = "", -- Bazooka_Battlefield
 --      ["Bazooka Master"] = "", -- Basic_Training_-_Bazooka
 --      ["Bazookas are influenced by wind."] = "", -- Basic_Training_-_Bazooka
---      ["Bazooka Team"] = "", -- Basic_Training_-_Bazooka
     ["Bazooka Training"] = "Addestramento sull'utilizzo del Bazooka",
 --      ["Bearded Beast"] = "", -- 
 --      ["Be careful, the future of Hogera is in your hands!"] = "", -- A_Space_Adventure:cosmos
@@ -231,7 +231,6 @@
     ["Bloodpie"] = "Dolce Sanguinoso", -- A_Classic_Fairytale:backstab
     ["Bloodrocutor"] = "Sputasangue", -- A_Classic_Fairytale:shadow
     ["Bloodsucker"] = "Sanguisuga", -- A_Classic_Fairytale:shadow
-    ["Bloody Rookies"] = "Sanguinosi",
 --      ["Blue"] = "", -- 
     ["Blue Team"] = "Squadra blu", -- User_Mission_-_Dangerous_Ducklings
 --      ["Bob"] = "", -- A_Space_Adventure:cosmos
@@ -314,7 +313,9 @@
 --      ["Challenge objectives"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit03, A_Space_Adventure:moon02
 --      ["Challenge over!"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa, ClimbHome
+--      ["Change bounciness: Tap [B]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Content: [Left], [Right]"] = "", -- HedgeEditor
+--      ["Change detonation timer: Tap the [Clock]"] = "", -- Basic_Training_-_Grenade, A_Classic_Fairytale:shadow
 --      ["Change direction: [Left]/[Right]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Change Health: [Left], [Right]"] = "", -- HedgeEditor
@@ -334,6 +335,8 @@
 --      ["Chicken"] = "", -- 
 --      ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01
 --      ["Chikorita"] = "", -- 
+--      ["Choose location: Left click"] = "", -- A_Classic_Fairytale:shadow
+--      ["Choose location: Tap the [Target] button, then tap on the spot you want to choose"] = "", -- A_Classic_Fairytale:shadow
 --      ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Choose your continent wisely, as your decision will be permanent."] = "", -- Continental_supplies
     ["Choose your side! If you want to join the strange man, walk up to him.|Otherwise, walk away from him. If you decide to att...nevermind..."] = "Scegli da che parte vuoi stare! Se vuoi stare con quell'uomo strano, vai con lui.|Altrimenti, allontanatene. Se decidi di attacc... niente...",
@@ -342,7 +345,6 @@
     ["Cleaver"] = "Mannaia", -- Construction_Mode
 --      ["CLEAVER PLACEMENT MODE"] = "", -- HedgeEditor
     ["Cleaver Placement Mode"] = "Modalità posizionamento mannaia", -- Construction_Mode
-    ["Climber"] = "Scalatore", -- ClimbHome
     ["Climb Home"] = "Scala fino a casa", -- ClimbHome
 --      ["Closing in"] = "", -- A_Classic_Fairytale:queen
 --      ["Clown"] = "", -- HedgeEditor
@@ -352,11 +354,13 @@
     ["Cluster Bomb Training"] = "Addestramento bomba a grappolo",
     ["Collateral Damage"] = "Danno collaterale",
     ["Collateral Damage II"] = "Danno collaterale II",
+--      ["- Collect all the blue crates"] = "", -- HedgeEditor
     ["Collect all the crates, but remember, our time in this life is limited!"] = "Raccogli tutte le casse, ma ricorda, il nostro tempo in questa vita è limitato!", -- A_Classic_Fairytale:first_blood
     ["Collect or destroy all the health crates."] = "Raccogli o distruggi tutte le casse di salute.", -- User_Mission_-_RCPlane_Challenge
 --      ["Collect or destroy the final crate to finish the training."] = "", -- Basic_Training_-_Flying_Saucer
+--      ["- Collect the blue crate"] = "", -- HedgeEditor
 --      ["Collect the crate and attack!"] = "", -- WxW
-    ["Collect the crate on the right.|Hint: Select the rope, [Up] or [Down] to aim, [Space] to fire, directional keys to move.|Ropes can be fired again in the air!"] = "Raccogli la cassa a destra. Suggerimento: Seleziona la corda, [Su] o [Giù] per puntare, [Spazio] per sparare, tasti direzionali per spostarti.", -- A_Classic_Fairytale:first_blood
+--      ["Collect the crate on the right."] = "", -- A_Classic_Fairytale:first_blood
     ["Collect the crates within the time limit!|If you fail, you'll have to try again."] = "Raccogli le casse nel tempo limite! | Se non ci riesci dovrai riprovare.", -- A_Classic_Fairytale:first_blood
 --      ["Collect the first crate to begin!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Collect the freezer and get the device part from Thanta."] = "", -- A_Space_Adventure:ice01
@@ -424,7 +428,6 @@
     ["Crates Left:"] = "Casse residue:", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates per turn: %d"] = "", -- WxW
---      ["crate(s)"] = "", -- SpeedShoppa
 --      ["Crazy Gravity: Gravity randomly changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity
 --      ["Crazy Runner"] = "", -- A_Space_Adventure:moon02
 --      ["Cricket Time"] = "", -- Continental_supplies
@@ -457,11 +460,10 @@
 --      ["Deals 15 damage to all enemies in the circle."] = "", -- Continental_supplies
 --      ["Deer"] = "", -- 
 --      ["Defeat all enemies!"] = "", -- portal
+--      ["Defeat!"] = "", -- HedgeEditor
 --      ["Defeat Professor Hogevil!"] = "", -- A_Space_Adventure:death01
---      ["Defeat the cannibals!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
+--      ["Defeat the cannibals!"] = "", -- A_Classic_Fairytale:shadow
     ["Defeat the cannibals!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "Sconfiggi i cannibali! | Suggerimento: imposta il timer con [1-5], mira con [Su] / [Giù] e tieni premuto [Spazio] per scegliere la potenza", -- A_Classic_Fairytale:shadow
-    ["Defeat the cannibals!|"] = "Sconfiggi i cannibali!|",
-    ["Defeat the cannibals"] = "Sconfiggi i cannibali",
     ["Defeat the cyborgs!"] = "Sconfiggi i cyborg!",
 --      ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen
 --      ["Delete Waypoint"] = "", -- HedgeEditor
@@ -482,11 +484,11 @@
 --      ["Destroyer of planes"] = "", -- User_Mission_-_RCPlane_Challenge
     ["Destroy him, Leaks A Lot! He is responsible for the deaths of many of us!"] = "Distruggilo Leaks A Lot! E' responsabile della morte di molti di noi!", -- A_Classic_Fairytale:first_blood
 --      ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion
+--      ["- Destroy the enemy"] = "", -- HedgeEditor
+--      ["- Destroy the red target"] = "", -- HedgeEditor
+--      ["- Destroy the red targets"] = "", -- HedgeEditor
 --      ["Destroy the targets!"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
-    ["Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."] = "Distruggi gli obiettivi! Suggerimento: Seleziona il Pugno di Fuoco e premi [Spazio]|P.S. Puoi usarlo a mezz'aria.", -- A_Classic_Fairytale:first_blood
-    ["Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"] = "Distruggi gli obiettivi! Suggerimento: [Su] [Giù] per mirare, [Spazio] per sparare", -- A_Classic_Fairytale:first_blood
 --      ["+%d flamer fuel!"] = "", -- Tumbler
---      ["%d Hapless Hogs left"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["+%d health"] = "", -- Mutant
 --      ["%d-Hit Combo! +%d points!"] = "", -- Space_Invasion
     ["Did anyone follow you?"] = "Ti ha seguito qualcuno?",
@@ -507,7 +509,6 @@
 --      ["Disguise as a Rockhopper Penguin"] = "", -- Continental_supplies
     ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "Travestiti da Rockhopper Penguin: [Scambia posto con un riccio qualsiasi nel cerchio]", -- Continental_supplies
 --      ["Displacer"] = "", -- 
---      ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Diver"] = "", -- User_Mission_-_Diver
 --      ["%d ms"] = "", -- HedgeEditor
 --      ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen
@@ -594,10 +595,8 @@
     ["Elderbot"] = "RoboSambuco", -- A_Classic_Fairytale:family
     ["Elimate your captor."] = "Elimita il tuo cacciatore", -- User_Mission_-_The_Great_Escape
     ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Distruggi tutti gli obiettivi entro il tempo previsto.|Hai armi illimitate per questa missione.",
---      ["Eliminate the Blue Team before the time runs out."] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Eliminate the enemy before the time runs out."] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree
     ["Eliminate the enemy hogs to win."] = "Elimina i ricci nemici per vincere.",
-    ["Eliminate the enemy specialists."] = "Elimina tutti i nemici specialisti.",
 --      ["Eliminate the enemy."] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh
 --      ["Eliminate Unit 3378."] = "", -- User_Mission_-_Teamwork
 --      ["Eliminate WatchBot 4000."] = "", -- User_Mission_-_Teamwork_2
@@ -622,13 +621,14 @@
     ["Exactly, man! That was my dream."] = "Si, è quello che ho sognato anch'io.", -- A_Classic_Fairytale:backstab
 --      ["Except me, of course! I just saved a whole planet!"] = "", -- A_Space_Adventure:final
 --      ["Experienced beginner"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Explore the tunnel with the other hedgehogs and search for the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Explore the tunnel with the other hedgehogs and search for the device."] = "", -- A_Space_Adventure:fruit02
 --      ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02
     ["Eye Chewer"] = "Mangia Occhi", -- A_Classic_Fairytale:journey
 --      ["Fair Wind"] = "", -- 
 --      ["Fall Damage"] = "", -- Basic_Training_-_Movement
 --      ["Fallen Angel"] = "", -- Tentacle_Terror
     ["Family Reunion"] = "Riunione familiare", -- A_Classic_Fairytale:family
+--      ["Fastest escape: %d turns"] = "", -- A_Space_Adventure:desert02
 --      ["Fastest lap: %.3fs by %s"] = "", -- TrophyRace
     ["Fastest lap: "] = "Giro migliore: ",
     ["Feeble Resistance"] = "Resistenza Finale",
@@ -648,11 +648,12 @@
 --      ["Final result"] = "", -- Mutant
 --      ["Final Targets"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
 --      ["Final team scores:"] = "", -- Space_Invasion
+--      ["Find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Find a way to detonate all the explosives and stay alive!"] = "", -- A_Space_Adventure:final
     ["Find your tribe!|Cross the lake!"] = "Trova la tua tribù!|Attraversa il lago!", -- A_Classic_Fairytale:dragon
 --      ["Finish this challenge as fast as possible to earn bonus points."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Finish waypoint placement"] = "", -- Racer
-    ["Finish your training|Hint: Animations can be skipped with the [Precise] key."] = "Fine dell'allenamento | Suggerimento: puoi saltare le animazioni con il tasto [Mirino di Precisione].", -- A_Classic_Fairytale:first_blood
+--      ["Finish your training."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Finite Ropes"] = "", -- Basic_Training_-_Rope
 --      ["Fire a rocket with napalm."] = "", -- Continental_supplies
 --      ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler
@@ -680,6 +681,7 @@
 --      ["Flying Saucer Training"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Fly into space to fight off the invaders with barrels!"] = "", -- Space_Invasion
 --      ["Fly to the meteorite and detonate the explosives"] = "", -- A_Space_Adventure:cosmos
+--      ["Follow the path and destroy the next target."] = "", -- Basic_Training_-_Rope
 --      ["Forgetfulness: You will lose all your weapons each turn."] = "", -- Continental_supplies
 --      ["For the next crate, you have to do back jumps."] = "", -- Basic_Training_-_Movement
 --      ["Four Eyes"] = "", -- 
@@ -699,8 +701,6 @@
 --      ["“g=150”, where 150 is 150% of normal gravity."] = "", -- Gravity
 --      ["“g=50, g2=150, period=4000” for gravity changing|from 50 to 150 and back with period of 4000 ms."] = "", -- Gravity
 --      ["Galaxy Guardians"] = "", -- Big_Armory
-    ["Game Modifiers: "] = "Modificatori di Gioco: ",
-    ["GAME OVER!"] = "GAME OVER!",
 --      ["Game over!"] = "", -- Space_Invasion
     ["Game Started!"] = "Gioco Iniziato!",
     ["Game? Was this a game to you?!"] = "Gioco? Era un gioco per te?", -- A_Classic_Fairytale:enemy
@@ -710,8 +710,6 @@
 --      ["Gasp! A smuggler!"] = "", -- A_Space_Adventure:desert01
 --      ["Gasp!"] = "", -- A_Space_Adventure:desert01
 --      ["Gathering fruits all day long."] = "", -- A_Classic_Fairytale:queen
---      ["Gear information hidden"] = "", -- HedgeEditor
---      ["Gear information shown"] = "", -- HedgeEditor
 --      ["Gear Placement Tool"] = "", -- HedgeEditor
 --      ["General information:"] = "", -- Continental_supplies
     ["General information"] = "Informazioni generali", -- Continental_supplies
@@ -721,7 +719,7 @@
     ["Get Dense Cloud out of the pit!"] = "Tira fuori Nuvola Densa dalla fossa!", -- A_Classic_Fairytale:journey
 --      ["Get him, Spike!"] = "", -- A_Space_Adventure:desert01
     ["Get on over there and take him out!"] = "Vai fuori da qui ed eliminalo!",
-    ["Get on the head of the mole"] = "Raggiungi la testa della talpa", -- A_Classic_Fairytale:first_blood
+--      ["Get on the head of the mole."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Get past the flower."] = "", -- A_Classic_Fairytale:journey
 --      ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01
     ["Get that crate!"] = "Prendi la cassa!", -- A_Classic_Fairytale:first_blood
@@ -759,7 +757,6 @@
     ["GO! GO! GO!"] = "VAI! VAI! VAI!",
     ["Good birdy......"] = "Bell'uccellino......",
 --      ["Good bye!"] = "", -- Basic_Training_-_Flying_Saucer
-    ["Good Dude"] = "Bravo ragazzo",
     ["Good idea, they'll never find us there!"] = "Buona idea, qui non ci troveranno mai", -- A_Classic_Fairytale:united
 --      ["Good job!"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Good job! Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -770,7 +767,7 @@
     ["Good so far!"] = "Molto bene finora!",
     ["Good to go!"] = "Vai!!",
 --      ["Good! You now control Cappy."] = "", -- Basic_Training_-_Movement
-    ["Go on top of the flower"] = "Vai in cima al fiore", -- A_Classic_Fairytale:first_blood
+--      ["Go on top of the flower."] = "", -- A_Classic_Fairytale:first_blood
     ["Go, quick!"] = "Vai, veloce!", -- A_Classic_Fairytale:backstab
     ["Gorkij"] = "Gorkij", -- A_Classic_Fairytale:journey
     ["Go surf!"] = "Fai surf!", -- WxW
@@ -793,7 +790,6 @@
     ["Great! You will be contacted soon for assistance."] = "Ottimo! Sarai contattato presto per assistenza.", -- A_Classic_Fairytale:shadow
 --      ["Green"] = "", -- 
 --      ["Green Bananas"] = "", -- A_Space_Adventure:fruit01
---      ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Green double rings also give you a new flying saucer."] = "", -- A_Space_Adventure:ice02
 --      ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01
 --      ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01
@@ -803,11 +799,8 @@
     ["Greetings, cloudy one!"] = "Saluti, Nuvola Densa!", -- A_Classic_Fairytale:shadow
 --      ["Greetings from the Navy, %s (%s), for being a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["Greetings, %s!"] = "", -- A_Classic_Fairytale:dragon
---      ["Greg"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
---      ["Grenade Group"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard
 --      ["Grenades explode after 1 to 5 seconds (you decide)."] = "", -- Basic_Training_-_Grenade
 --      ["Grenades with high bounciness bounce a lot and behave chaotic."] = "", -- Basic_Training_-_Grenade
---      ["Grenade Team"] = "", -- Basic_Training_-_Grenade
     ["Grenade Training"] = "Allenamento granate", -- Basic_Training_-_Grenade
     ["Grenadiers"] = "Granatieri", -- Basic_Training_-_Grenade
 --      ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor
@@ -848,7 +841,6 @@
 --      ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion
 --      ["Health Modification Mode"] = "", -- HedgeEditor
 --      ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor
---      ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
 --      ["Heavenly Defense"] = "", -- Tentacle_Terror
     ["Heavy Cannfantry"] = "Fanteria pesante", -- A_Classic_Fairytale:united
     ["Heavy"] = "Pesante",
@@ -861,6 +853,7 @@
 --      ["Hedgehog Projectile"] = "", -- Continental_supplies
     ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "Riccio proiettile: [Spara il tuo riccio come una bomba appiccicosa]", -- Continental_supplies
 --      ["Hedgehogs can not be deleted."] = "", -- HedgeEditor
+--      ["Hedgehogs left: %d"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Hedgehogs will be revived after their death."] = "", -- Mutant
 --      ["Hedgehogs will start in the first waypoint."] = "", -- Racer
     ["Hedgibal Lecter"] = "Riccibal Lecter",
@@ -876,7 +869,6 @@
 --      ["Help Enabled"] = "", -- HedgeEditor
 --      ["Helpers: Each team starts with %d helper points"] = "", -- Battalion
 --      ["Helpers: Hogs will get 1 out of 2 helpers randomly each turn"] = "", -- Battalion
---      ["Help Hog Solo to find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
     ["Help me, Leaks!"] = "Aiutami, Leaks!", -- A_Classic_Fairytale:journey
     ["Help me, please!!!"] = "Aiutami, per favore!!!",
     ["Help me, please!"] = "Aiutami, per favore!",
@@ -891,20 +883,20 @@
 --      ["Here you will find the current mission instructions."] = "", -- Basic_Training_-_Movement
 --      ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Heroic Wind"] = "", -- Continental_supplies
-    ["Hero Team"] = "Team Eroi", -- User_Mission_-_The_Great_Escape
     ["He's so brave..."] = "E' così coraggioso...",
 --      ["He was the lab assistant of Dr. Goodhogan, the inventor of the anti-gravity device."] = "", -- A_Space_Adventure:moon02
     ["He won't be selling us out anymore!"] = "Ora non ci tradirà più!", -- A_Classic_Fairytale:backstab
 --      ["Hey, don't forget us! We still need to climb up!"] = "", -- A_Classic_Fairytale:family
     ["Hey, guys!"] = "Ciao, ragazzi!", -- A_Classic_Fairytale:backstab
     ["Hey guys!"] = "Ciao ragazzi!", -- A_Classic_Fairytale:united
---      ["Hey, Hog Solo! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey! I was supposed to collect it!"] = "", -- A_Space_Adventure:fruit02
+--      ["Hey, %s! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey, %s! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos
     ["Hey! This is cheating!"] = "Ehi, questo è barare!", -- A_Classic_Fairytale:journey
 --      ["Hidden"] = "", -- portal
 --      ["High Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["High Jump: [Backspace]"] = "", -- Basic_Training_-_Movement
+--      ["High Jump: Tap the [Curvy Arrow] shortly"] = "", -- Basic_Training_-_Movement
 --      ["--- Highland ---"] = "", -- Battalion
 --      ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander
 --      ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion
@@ -915,20 +907,24 @@
 --      ["Hill Guard"] = "", -- Bazooka_Battlefield
 --      ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01
 --      ["--- Hint ---"] = "", -- Battalion
-    ["Hint: Double Jump - Press [Backspace] twice"] = "Suggerimento: Doppio salto - Premi due volte [Backspace]", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
 --      ["Hint: Drilling holes should solve everything."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: Hold down [M] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: If this mission panel disappears, you can|see it again by hitting the Pause or Quit key."] = "", -- Basic_Training_-_Movement
 --      ["Hint: It might be a good idea to place a girder before starting to drill. Just saying."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: It might be easier if you vary the angle only slightly."] = "", -- Basic_Training_-_Bazooka
+--      ["Hint: Just select the parachute, it opens automatically when you fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion
 --      ["Hint: Launch the bazooka horizontally at full power."] = "", -- Basic_Training_-_Bazooka
---      ["Hint: Press [Esc] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Pause the game to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Select the blow torch, aim and press [Fire]. Press [Fire] again to stop."] = "", -- A_Classic_Fairytale:journey
 --      ["Hint: Select the low gravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey
+--      ["Hint: Select the rope, [Up] or [Down] to aim, [Attack] to fire, directional keys to move."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Select the Shoryuken and hit [Attack].|P.S.: You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: %s needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family
 --      ["Hint: The rope only bends around objects.|When it doesn't hit anything, it's always straight."] = "", -- Basic_Training_-_Rope
 --      ["Hint: To jump higher, wait a bit before you hit “High Jump” a second time."] = "", -- Basic_Training_-_Movement
+--      ["Hint: To place a girder, select it,|then use [Left] and [Right] to select angle and length,|then choose a location for the girder."] = "", -- A_Classic_Fairytale:shadow
 --      ["Hint: Use the quit key to see the team’s continent."] = "", -- Continental_supplies
 --      ["Hint: When you shorten the rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope
 --      ["Hint: You might want to stay out of sight and take all the crates ..."] = "", -- A_Classic_Fairytale:journey
@@ -962,24 +958,11 @@
     ["Hogminator"] = "Ricc-minator",
 --      ["Hog nueve"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog octo"] = "", -- A_Space_Adventure:fruit03
---      ["Hogonauts"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Hog onze"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog Saturn"] = "", -- A_Space_Adventure:fruit03
     ["Hogs in sight!"] = "Ricci in vista!",
 --      ["Hog Solo and GB"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hog Solo"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01, A_Space_Adventure:moon02
---      ["Hog Solo couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo escaped successfully!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo has to reach the last crates"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo has to refuel his saucer."] = "", -- A_Space_Adventure:moon01
---      ["Hog Solo lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
---      ["Hog Solo wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["- Hogs will be revived"] = "", -- Capture_the_Flag
 --      ["- Hogs will drop the flag when killed"] = "", -- Capture_the_Flag
 --      ["Hog two"] = "", -- A_Space_Adventure:fruit03
@@ -989,9 +972,7 @@
     ["Homing Bee"] = "Ape a ricerca", -- Construction_Mode
 --      ["Honda"] = "", -- 
     ["Honest Lee"] = "L'onesto Lee", -- A_Classic_Fairytale:enemy
---      ["Hook"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
 --      ["Hooks"] = "", -- 
-    ["Hooray!"] = "Hurrà!!!",
 --      ["Hooray! I actually did it! Hogera is safe!"] = "", -- A_Space_Adventure:final
 --      ["Hooray! I've found it, now I have to get back to Captain Lime!"] = "", -- A_Space_Adventure:fruit02
 --      ["Hooray! You are a champion!"] = "", -- A_Space_Adventure:ice02
@@ -1007,7 +988,7 @@
     ["However, if you fail to do so, she dies a most violent death, just like your friend! Muahahaha!"] = "Tuttavia, se fallirai, morirà di una morte più violenta, proprio come il tuo amico! Muahahaha!", -- A_Classic_Fairytale:journey
     ["However, if you fail to do so, she dies a most violent death! Muahahaha!"] = "Tuttavia, se fallirai, morirà di una morte più violenta! Muahahaha!", -- A_Classic_Fairytale:journey
     ["However, my mates don't agree with me on letting you go..."] = "Tuttavia i miei compagni non vogliono lasciarti andare...", -- A_Classic_Fairytale:dragon
---      ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
+--      ["However, the army of %s is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
 --      ["How to Rope"] = "", -- Basic_Training_-_Rope
 --      ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen
 --      ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen
@@ -1027,7 +1008,6 @@
     ["I can't believe what I'm hearing!"] = "Non credo alle mie orecchie!",
 --      ["I can't let you go further because …"] = "", -- A_Classic_Fairytale:queen
     ["I can't wait any more, I have to save myself!"] = "Non posso più aspettare, devo salvarmi!",
---      ["Ice"] = "", -- Basic_Training_-_Movement
 --      ["Ice Jake"] = "", -- A_Space_Adventure:ice01
     ["I could just teleport myself there..."] = "Potrei teletrasportarmi lì...", -- A_Classic_Fairytale:family
 --      ["Icy Girder: [3]"] = "", -- HedgeEditor
@@ -1085,7 +1065,6 @@
     ["I just found out that they have captured your princess!"] = "Ho appena scoperto che hanno catturato la tua principessa!", -- A_Classic_Fairytale:family
 --      ["I just want the strange device you found!"] = "", -- A_Space_Adventure:ice01
     ["I just wonder where Ramon and Spiky disappeared..."] = "Mi chiedo dove siano scomparsi Ramon e Spiky...", -- A_Classic_Fairytale:journey
---      ["Ikeda"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["I know and I'm terribly sorry!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know, my hero!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know that your resources are low due to the battle but I'll send two of my best hogs to assist you."] = "", -- A_Space_Adventure:fruit02
@@ -1113,6 +1092,7 @@
 --      ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen
     ["I'm not sure about that!"] = "Non ne sono così sicuro!",
 --      ["IMPORTANT: To see the mission panel again, hold the mission panel key."] = "", -- Basic_Training_-_Movement
+--      ["IMPORTANT: To see the mission panel again, pause the game."] = "", -- Basic_Training_-_Movement
     ["Impressive...you are still dry as the corpse of a hawk after a week in the desert..."] = "Impressionante... sei ancora asciutto come il cadavere di un falco dopo una settimana nel deserto", -- A_Classic_Fairytale:first_blood
 --      ["%i ms"] = "", -- Gravity
 --      ["I'm so glad this is finally over!"] = "", -- A_Space_Adventure:final
@@ -1271,7 +1251,6 @@
 --      ["Kill the traitor, %s, or spare his life!"] = "", -- A_Classic_Fairytale:backstab
 --      ["--- King ---"] = "", -- Battalion
 --      ["King"] = "", -- Battalion
---      ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing
 --      ["--- King Mode ---"] = "", -- Battalion
 --      ["Knight"] = "", -- Battalion
 --      ["Knives"] = "", -- 
@@ -1290,7 +1269,7 @@
 --      ["Launch some bazookas to destroy the targets!"] = "", -- Basic_Training_-_Bazooka
     ["Leaderbot"] = "Capobot", -- A_Classic_Fairytale:queen
     ["Leader"] = "Capo", -- A_Classic_Fairytale:enemy
---      ["Lead the Green Bananas to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
+--      ["Lead your allies to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
     ["Leaks A Lot, depressed for killing his loved one, failed to save the village..."] = "Leaks A Lot, depresso per la morte dell'amata, non è riuscito a salvare il villaggio...", -- A_Classic_Fairytale:journey
     ["Leaks A Lot gave his life for his tribe! He should have survived!"] = "Leaks a Lot ha dato la sua vita per la sua tribù! Avrebbe dovuto sopravvivere!", -- A_Classic_Fairytale:first_blood
     ["Leaks A Lot"] = "Leaks A Lot", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
@@ -1305,7 +1284,6 @@
 --      ["Left/right: Choose crate contents"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode
---      ["Left Tong"] = "", -- Bazooka_Battlefield
 --      ["Legs"] = "", -- 
 --      ["Less tools, more fun"] = "", -- Battalion
 --      ["Lestat"] = "", -- portal
@@ -1334,18 +1312,19 @@
     ["Lively Lifeguard"] = "Bagnino Vivace",
 --      ["Lonely Cries"] = "", -- Continental_supplies
 --      ["Lonely Cries: [Rise the water if no hog is in the circle and deal 6 damage to all enemy hogs.]"] = "", -- Continental_supplies
-    ["Lonely Hog"] = "Riccio solitario", -- ClimbHome
 --      ["Long Jump: [Enter]"] = "", -- Basic_Training_-_Movement
+--      ["Long Jump: Tap the [Curvy Arrow] button for long"] = "", -- Basic_Training_-_Movement, A_Classic_Fairytale:first_blood
 --      ["Long Live The Queen"] = "", -- A_Classic_Fairytale:queen
 --      ["Look around: [Mouse movement]"] = "", -- Basic_Training_-_Movement
+--      ["Look around: [Tap or swipe on the screen]"] = "", -- Basic_Training_-_Movement
 --      ["Look, boss! There is the target!"] = "", -- A_Space_Adventure:moon01
     ["Look, I had no choice!"] = "Scusa, non avevo scelta!", -- A_Classic_Fairytale:backstab
     ["Look out! There's more of them!"] = "Occhio, ce ne sono altri!", -- A_Classic_Fairytale:backstab
     ["Look out! We're surrounded by cannibals!"] = "Attenzione! Siamo circondati da cannibali!", -- A_Classic_Fairytale:enemy
     ["Looks like the whole world is falling apart!"] = "Sembra che tutto il mondo si stia inabissando!", -- A_Classic_Fairytale:enemy
+--      ["Look to the left and do a backwards jump towards the mushroom."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Loon"] = "", -- The_Specialists
 --      ["Loopy"] = "", -- 
---      ["Lord Evil"] = "", -- Tentacle_Terror
 --      ["Losing Condition: Destroy"] = "", -- HedgeEditor
 --      ["Low Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander
@@ -1365,7 +1344,6 @@
 --      ["Mario"] = "", -- 
 --      ["Mark gears for win/lose conditions"] = "", -- HedgeEditor
 --      ["Mark/unmark gear: [Left Click]"] = "", -- HedgeEditor
---      ["Mark"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
     ["- Massive weapon bonus on first turn"] = "- Notevole bonus di armi al primo turno", -- Continental_supplies
 --      ["Max Citrus"] = "", -- A_Space_Adventure:fruit01
 --      ["Maybe you should try an easier map next time."] = "", -- Racer
@@ -1380,7 +1358,6 @@
 --      ["Mega kill!"] = "", -- Mutant
     ["Meiwes"] = "Maives", -- A_Classic_Fairytale:backstab
 --      ["mikade"] = "", -- 
---      ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer
     ["Mindy"] = "Mindy", -- A_Classic_Fairytale:united
     ["Mine Deployer"] = "Posatore di Mine",
 --      ["MINE PLACEMENT MODE"] = "", -- HedgeEditor
@@ -1399,12 +1376,12 @@
 --      ["Minion"] = "", -- A_Space_Adventure:moon01
 --      ["Minions"] = "", -- A_Space_Adventure:moon01
 --      ["Mission failed!"] = "", -- Big_Armory
-    ["MISSION FAILED"] = "MISSIONE FALLITA",
 --      ["Mission failure in %d s"] = "", -- Big_Armory
+--      ["Mission"] = "", -- HedgeEditor
 --      ["Mission lost!"] = "", -- Basic_Training_-_Grenade
 --      ["Mission Panel"] = "", -- Basic_Training_-_Movement
 --      ["Mission panel: [M]"] = "", -- Basic_Training_-_Movement
-    ["MISSION SUCCESSFUL"] = "MISSIONE COMPLETATA CON SUCCESSO",
+--      ["Mission succeeded!"] = "", -- portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, SimpleMission, HedgeEditor
 --      ["Mission won!"] = "", -- Basic_Training_-_Grenade
 --      ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02
 --      ["Mixed %d"] = "", -- WxW
@@ -1420,7 +1397,6 @@
 --      ["Monster kill!"] = "", -- Mutant
 --      ["Monsters"] = "", -- 
 --      ["Mooney"] = "", -- 
-    ["More Natives"] = "Altri nativi", -- A_Classic_Fairytale:epil
 --      ["Morris"] = "", -- 
 --      ["Most mines are not active."] = "", -- A_Space_Adventure:desert02
 --      ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01
@@ -1439,14 +1415,12 @@
 --      ["My flying saucer stopped working!"] = "", -- A_Space_Adventure:ice01
     ["Nade Boy"] = "Nud-uomo", -- Basic_Training_-_Grenade
 --      ["Nah, probably everyone was just stupid."] = "", -- A_Space_Adventure:final
-    ["Nameless Heroes"] = "Eroi Senza Nome",
     ["Name"] = "Nome", -- A_Classic_Fairytale:queen
     ["Nancy Screw"] = "Vite di Nancy", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:queen
     ["Napalm"] = "Napalm", -- Construction_Mode
 --      ["Napalm Rocket"] = "", -- Continental_supplies
     ["Napalm rocket: [Fire a bomb with napalm!]"] = "Razzo Napalm: [Lancia una bomba al napalm!]", -- Continental_supplies
 --      ["Naranja Jed"] = "", -- A_Space_Adventure:fruit01
-    ["Natives"] = "Nativi", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
     ["Naughty Ninja"] = "Ninja birichino", -- User_Mission_-_Dangerous_Ducklings
 --      ["Near a PAotH base on the moon ..."] = "", -- A_Space_Adventure:moon01
 --      ["Near Secret Base 17 of PAotH in the rural Hogland ..."] = "", -- A_Space_Adventure:cosmos
@@ -1541,11 +1515,8 @@
 --      ["Oh, my! I forgot something!"] = "", -- A_Classic_Fairytale:queen
     ["Oh, my!"] = "Oddio!", -- A_Classic_Fairytale:first_blood
     ["Oh, my! This is even more entertaining than I've expected!"] = "Ahahah! E' più divertente di quanto mi aspettassi!", -- A_Classic_Fairytale:backstab
-    ["Oh no! Just try again!"] = "Oh no! Prova ancora!",
 --      ["Oh no, not %s!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
---      ["Oh no, the Green Bananas have betrayed Hog Solo and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
-    ["Oh no! Time's up! Just try again."] = "Oh no! Tempo scaduto! Riprova!",
-    ["Oh no! You failed! Just try again."] = "Oh no! Hai fallito! Riprova!", -- Basic_Training_-_Cluster_Bomb
+--      ["Oh no, the companions have betrayed %s and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
 --      ["Oh no! You have died. Try again!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Oh! Please spare me. You can take all my treasures!"] = "", -- A_Space_Adventure:ice01
     ["Oh, silly me! I forgot that I'm the shaman."] = "Oh, stupido! Ho dimenticato di essere io lo sciamano!", -- A_Classic_Fairytale:backstab
@@ -1567,9 +1538,9 @@
 --      ["One shall not judge one by one's appearance!"] = "", -- A_Classic_Fairytale:epil
     ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "Una tribù era pacifica, andava a caccia e si allenanava, godendo dei piccoli piaceri della vita...", -- A_Classic_Fairytale:first_blood
 --      ["Oneye"] = "", -- portal
---      ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant
 --      ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant
+--      ["Only %s can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard
 --      ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01
@@ -1581,6 +1552,7 @@
 --      ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01
 --      ["Oops! You have selected the wrong hedgehog! Just try again."] = "", -- Basic_Training_-_Movement
 --      ["Open ammo menu: [Right click]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
+--      ["Open ammo menu: Tap the [Suitcase]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
     ["Open that crate and we will continue!"] = "Apri quella cassa e continuiamo!", -- A_Classic_Fairytale:first_blood
     ["Opposing Team: "] = "Squadra Nemica: ",
 --      ["Orange"] = "", -- 
@@ -1600,15 +1572,14 @@
 --      ["PAotH has sent explosives but unfortunately the trigger mechanism seems to be faulty!"] = "", -- A_Space_Adventure:cosmos
     ["Parachute"] = "Paracadute", -- Continental_supplies
 --      ["Patches"] = "", -- 
-    ["Pathetic Resistance"] = "Resistenza Patetica",
 --      ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02
 --      ["Pause: [P]"] = "", -- Basic_Training_-_Movement
+--      ["Pause: Tap the [Pause] button"] = "", -- Basic_Training_-_Movement
 --      ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW
 --      ["Penguin Roar"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hog’s health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
     ["Perfect! Now try to get the next crate without hurting yourself!"] = "Ottimo! Ora prova a prendere la prossima cassa senza farti male!", -- A_Classic_Fairytale:first_blood
-    ["Per-Hog Ammo"] = "Munizioni per Riccio",
 --      ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh
 --      ["Personal best: %.3f seconds"] = "", -- A_Space_Adventure:ice02
     ["Per team weapons"] = "Armi per team", -- Continental_supplies
@@ -1617,7 +1588,6 @@
 --      ["Physicist"] = "", -- HedgeEditor
     ["Piano Strike"] = "Strike con il piano", -- Construction_Mode
 --      ["Pikachu"] = "", -- 
---      ["Pincer Knights"] = "", -- Bazooka_Battlefield
 --      ["Pings left: %d"] = "", -- Space_Invasion
 --      ["Pink"] = "", -- 
 --      ["Pirates"] = "", -- 
@@ -1670,8 +1640,6 @@
 --      ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion
 --      ["--- Points ---"] = "", -- Battalion
 --      ["--- Points Mode ---"] = "", -- Battalion
-    ["points"] = "punti",
---      ["point(s)"] = "", -- TargetPractice, Mutant
 --      ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02
 --      ["Poisonous, deals no damage."] = "", -- Continental_supplies
     ["Poison"] = "Veleno",
@@ -1691,37 +1659,37 @@
 --      ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to fight"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos
-    ["Prepare yourself"] = "Preparati",
+--      ["Prepare yourself, %s!"] = "", -- The_Specialists
 --      ["Press [Attack] (space bar by default) to start,|repeadedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] (space bar by default) to start,|repeatedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] to begin."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Attack] to confirm."] = "", -- Continental_supplies
 --      ["Press [Attack] to select this continent!"] = "", -- Continental_supplies
 --      ["Press [Left] and [Right] to change the difficulty."] = "", -- A_Classic_Fairytale:first_blood
-    ["Press [Left] or [Right] to move around, [Enter] to jump"] = "Premi [Sinistra] o [Destra] per spostarti, [Invio] per saltare", -- A_Classic_Fairytale:first_blood
+--      ["Press [Left] or [Right] to move around, [Long Jump] to jump forwards."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW
 --      ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW
+--      ["Press [M] to see the mission texts"] = "", -- Basic_Training_-_Movement
     ["Press [Precise] to skip intro"] = "Premi [Mirino di Precisione] per saltare l'intro",
 --      ["Press [Up] and [Down] to move between menu items.|Press [Attack], [Left], or [Right] to toggle."] = "", -- WxW
     ["Prestigious Pilot"] = "Pilota prestigioso", -- User_Mission_-_RCPlane_Challenge
 --      ["Princess"] = "", -- A_Classic_Fairytale:family, A_Classic_Fairytale:journey
 --      ["Princess Peach"] = "", -- 
---      ["Private Nolak"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["Problems, dude? Chillax!"] = "", -- A_Classic_Fairytale:epil
 --      ["Professional pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professional stunt pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professor"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
 --      ["Professor Hogevil, then known as James Hogus, worked for PAotH back in my time."] = "", -- A_Space_Adventure:moon02
+--      ["Professor's Team"] = "", -- A_Space_Adventure:death01
 --      ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
---      ["Pro Killers"] = "", -- Big_Armory
 --      ["Protect the King: When the king dies, so does the team"] = "", -- Battalion
---      ["Protect yourselves!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
     ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "Proteggiti! |Suggerimento della granata: imposta il timer con [1-5], punta con [Su]/[Giù] e tieni premuto [Spazio] per la potenza.", -- A_Classic_Fairytale:shadow
 --      ["Purple"] = "", -- 
 --      ["Pyro"] = "", -- HedgeEditor, The_Specialists
 --      ["Pyromancer"] = "", -- Battalion
 --      ["Quit: [Esc]"] = "", -- Basic_Training_-_Movement
 --      ["Race complexity limit reached"] = "", -- Racer, TechRacer
+--      ["Race failed!"] = "", -- A_Space_Adventure:moon02
 --      ["Racer"] = "", -- Racer
 --      ["Racer tool"] = "", -- Racer
 --      ["Race"] = "", -- TrophyRace
@@ -1757,23 +1725,19 @@
 --      ["Replenishment: Weapons are restocked on turn start of a new hog"] = "", -- Highlander
 --      ["Repositioning Mode"] = "", -- HedgeEditor
 --      ["REPOSITIONING MODE"] = "", -- HedgeEditor
---      ["rescues"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Rescue the imprisoned PAotH team and get the fuel!"] = "", -- A_Space_Adventure:moon01
 --      ["Respawner: Resurrects dead hogs."] = "", -- Construction_Mode
     ["Respawner"] = "Rinascita", -- Construction_Mode
     ["Resurrector"] = "Risurrettore", -- Construction_Mode
 --      ["Retract/Extend rope: [Up]/[Down]"] = "", -- Basic_Training_-_Rope
 --      ["- Return the enemy flag to your base to score"] = "", -- Capture_the_Flag
-    [" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = " - Riporta la bandiera nemica alla tua base per guadagnare un punto| - La prima squadra a catturarne 3 vince! | - Puoi guadagnare punti solo quando la tua bandiera si trova nella tua base! | - I ricci lasceranno cadere la bandiera se uccisi o caduti in acqua! | - Le bandiere cadute possono essere restituite o ricatturate! | - I ricci risorgono dalla morte!",
 --      ["Return to Leaks A Lot!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Return to the mission menu by pressing the \"Go back\" button."] = "", -- A_Space_Adventure:cosmos
 --      ["Return to the Surface"] = "", -- A_Space_Adventure:fruit02
 --      ["Return to the training menu by pressing the “Go back” button."] = "", -- Basic_Training_-_Movement
---      ["Rhombus"] = "", -- Basic_Training_-_Movement
 --      ["Rider"] = "", -- portal
 --      ["Rifleman"] = "", -- Battalion
     ["Righteous Beard"] = "Barba saggia", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:queen, A_Classic_Fairytale:united
---      ["Right Tong"] = "", -- Bazooka_Battlefield
 --      ["Ripe"] = "", -- 
 --      ["Rise the water if nobody else is in the circle and deal 6 damage to all enemy hogs."] = "", -- Continental_supplies
 --      ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01
@@ -1782,8 +1746,8 @@
 --      ["Roof"] = "", -- WxW
 --      ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Rope Master"] = "", -- Basic_Training_-_Rope
---      ["Roper"] = "", -- SpeedShoppa
 --      ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
+--      ["Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Rope Team"] = "", -- Basic_Training_-_Rope
     ["Rope Training"] = "Allenamento corde", -- Basic_Training_-_Rope
 --      ["Rope Weapons"] = "", -- Basic_Training_-_Rope
@@ -1797,7 +1761,6 @@
 --      ["Round limit:"] = "", -- TechRacer
 --      ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer
 --      ["Round's slowest lap: %.3fs by %s"] = "", -- TrophyRace
---      ["Rounds until Sudden Death: %d"] = "", -- Battalion
 --      ["RS1"] = "", -- A_Space_Adventure:fruit03
 --      ["RS2"] = "", -- A_Space_Adventure:fruit03
 --      ["Rubber"] = "", -- Construction_Mode, HedgeEditor
@@ -1823,10 +1786,17 @@
     ["Salvation was one step closer now..."] = "Salvezza è più vicina ora...", -- A_Classic_Fairytale:dragon
 --      ["Sam"] = "", -- A_Space_Adventure:cosmos
 --      ["Sandals?! I thought you left your ring!"] = "", -- A_Classic_Fairytale:queen
+--      ["%s and GB"] = "", -- A_Space_Adventure:fruit02
 --      ["%s and %s enter the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sandstorm"] = "", -- A_Space_Adventure:desert01
 --      ["Sandy"] = "", -- A_Space_Adventure:desert01
-    ["Save as many hapless hogs as possible!"] = "Salva più ricci sfortunati che puoi!",
+--      ["%s arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
+--      ["Save as many hogs as possible!"] = "", -- User_Mission_-_That_Sinking_Feeling
     ["Save Fell From Heaven!"] = "Salva Scesa dal Cielo", -- A_Classic_Fairytale:journey
 --      ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow
 --      ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor
@@ -1838,9 +1808,9 @@
 --      ["Scallywag"] = "", -- 
     ["Scalp Muncher"] = "Tagliascalpo", -- A_Classic_Fairytale:backstab
 --      ["Scenario"] = "", -- Big_Armory, portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape
---      ["Scenario failed!"] = "", -- SimpleMission
 --      ["Scientist"] = "", -- Battalion
 --      ["%s climbed home in %d seconds!"] = "", -- ClimbHome
+--      ["%s (contd.)"] = "", -- A_Classic_Fairytale:epil
 --      ["Score: %d"] = "", -- Space_Invasion
 --      ["Score goal: %d"] = "", -- Control
 --      ["Score graph"] = "", -- Mutant, Space_Invasion
@@ -1850,6 +1820,7 @@
 --      ["Scores"] = "", -- Mutant
 --      ["Scores:"] = "", -- Mutant
 --      ["Scoring: "] = "", -- Mutant
+--      ["%s couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
 --      ["Script parameter examples:"] = "", -- Gravity
 --      ["%s (+%d)"] = "", -- Battalion
 --      ["%s: %d"] = "", -- Capture_the_Flag, Control
@@ -1862,10 +1833,9 @@
 --      ["%s died … and lives again!"] = "", -- Construction_Mode
 --      ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome
 --      ["%s, %d sec"] = "", -- Continental_supplies
---      ["Search for the device with the help of the other hedgehogs "] = "", -- A_Space_Adventure:fruit02
+--      ["Search for the device with the help of the other hedgehogs."] = "", -- A_Space_Adventure:fruit02
 --      ["Searching in the dust"] = "", -- A_Space_Adventure:desert01
 --      ["Searching the stars!"] = "", -- A_Space_Adventure:cosmos
---      ["seconds"] = "", -- ClimbHome
     ["Seduction"] = "Seduzione", -- Continental_supplies
 --      ["Seems like every time you take a \"walk\", the enemy finds us!"] = "", -- A_Classic_Fairytale:backstab
     ["See that crate farther on the right?"] = "Vedi quella cassa più avanti sulla destra?", -- A_Classic_Fairytale:first_blood
@@ -1892,6 +1862,7 @@
 --      ["Select your continent with [Up]/[Down] or by selecting a representative weapon."] = "", -- Continental_supplies
 --      ["%s enters the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sergey"] = "", -- 
+--      ["%s escaped successfully!"] = "", -- A_Space_Adventure:fruit01
 --      ["Set bounciness: [Left Shift] + [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set detonation timer: [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set Health: [Left Click]"] = "", -- HedgeEditor
@@ -1915,10 +1886,12 @@
 --      ["%s has been killed before taking enough damage first."] = "", -- SimpleMission
 --      ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has been rescued from death"] = "", -- Construction_Mode
+--      ["%s has dropped the flag!"] = "", -- CTF_Blizzard
 --      ["%s has fallen victim to gravity."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has mutated! +2 points"] = "", -- Mutant
 --      ["%s has passed the best height of %s!"] = "", -- ClimbHome
 --      ["%s has scored!"] = "", -- Capture_the_Flag
+--      ["%s has to refuel the saucer."] = "", -- A_Space_Adventure:moon01
 --      ["%s hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil
 --      ["sheepluva"] = "", -- 
@@ -1935,8 +1908,6 @@
 --      ["Shinobi"] = "", -- 
 --      ["%s hit the ground."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Shoppa Love"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
---      ["Shoppa Union"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes, Challenge_-_Speed_Shoppa_-_ShoppaKing
---      ["Shoppers"] = "", -- SpeedShoppa
     ["Shotgun"] = "Fucile a pompa",
 --      ["Sigh."] = "", -- A_Classic_Fairytale:epil
     ["Silly"] = "Stupido",
@@ -1949,11 +1920,11 @@
 --      ["%s is now as poor as a church mouse"] = "", -- Construction_Mode
 --      ["%s is now a zombie hedgehog"] = "", -- Construction_Mode
 --      ["%s is suddenly low on ammo"] = "", -- Construction_Mode
---      ["Skip your turn to try again."] = "", -- Basic_Training_-_Rope
 --      ["Skulls"] = "", -- Bazooka_Battlefield
 --      ["Slimer"] = "", -- 
     ["Slippery"] = "Scivoloso", -- A_Classic_Fairytale:journey
 --      ["%s lost all the weapons"] = "", -- Construction_Mode
+--      ["%s lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
 --      ["Slot %d: %s"] = "", -- Frenzy
     ["Slot keys save time! (F1-F10 by default)"] = "Tasti slot fanno risparmiare tempo! (F1-F10 predefiniti)", -- Frenzy
 --      ["Slowpoke"] = "", -- 
@@ -1967,6 +1938,7 @@
     ["Smith 0.99f"] = "Smith 0.99f", -- A_Classic_Fairytale:enemy
     ["Smith 1.0"] = "Smith 1.0", -- A_Classic_Fairytale:enemy
 --      ["Smugglers"] = "", -- A_Space_Adventure:desert01
+--      ["%s must collect the final crates."] = "", -- A_Space_Adventure:fruit02
 --      ["%s must skip this turn for rule violation."] = "", -- WxW
 --      ["Sneaks"] = "", -- Bazooka_Battlefield
 --      ["%s never got the ninja diploma."] = "", -- ClimbHome
@@ -1975,10 +1947,8 @@
 --      ["Sniper"] = "", -- HedgeEditor, The_Specialists
     ["Sniper Rifle"] = "Fucile di precisione", -- Continental_supplies
     ["Sniper Training"] = "Addestramento sull'utilizzo del Fucile di Precisione",
-    ["Sniperz"] = "Cecchini",
 --      ["So, as promised I have brought you where I think that the device you are looking for is hidden."] = "", -- A_Space_Adventure:fruit02
 --      ["So far, you had infinite ropes, but in the|real world, ropes are usually limited."] = "", -- Basic_Training_-_Rope
---      ["So Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos
     ["So humiliating..."] = "Così umiliante...", -- A_Classic_Fairytale:first_blood
 --      ["So, I believe that it's a good place to start."] = "", -- A_Space_Adventure:desert01
 --      ["So, I kindly ask for your help."] = "", -- A_Space_Adventure:fruit01
@@ -1988,11 +1958,12 @@
 --      ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03
 --      ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen
 --      ["Some weapons can be dropped from the rope."] = "", -- Basic_Training_-_Rope
---      ["Somewhere else on the planet of fruits, Captain Lime helps Hog Solo"] = "", -- A_Space_Adventure:fruit02
---      ["Somewhere else on the planet of fruits Hog Solo gets closer to the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, Captain Lime helps %s"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, %s gets closer to the device"] = "", -- A_Space_Adventure:fruit02
 --      ["Somewhere on the Planet of Fruits a terrible war is about to begin ..."] = "", -- A_Space_Adventure:fruit01
 --      ["Somewhere on the uninhabitable Death Planet ..."] = "", -- A_Space_Adventure:death01
 --      ["So, now I got the last part and I have your friends captured."] = "", -- A_Space_Adventure:death01
+--      ["So, %s, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So the princess was never heard of again ..."] = "", -- A_Classic_Fairytale:family
 --      ["So, uhmm, how did you manage to teleport them so far?"] = "", -- A_Classic_Fairytale:epil
 --      ["Sour"] = "", -- 
@@ -2093,8 +2064,6 @@
     ["Structure Placement Mode"] = "Modalità posizionamento strutture", -- Construction_Mode
 --      ["Structure Placer"] = "", -- Construction_Mode
 --      ["Stupid, stupid Hogerians!"] = "", -- A_Space_Adventure:final
---      ["Subject 1"] = "", -- portal
---      ["Subjects"] = "", -- portal
 --      ["Subtract %d"] = "", -- HedgeEditor
 --      ["--- Sudden Death ---"] = "", -- Battalion
 --      ["Summer Squash"] = "", -- A_Space_Adventure:fruit01
@@ -2111,7 +2080,7 @@
     ["Surfer! +15 points!"] = "Surfista! +15 punti!", -- Space_Invasion
     ["Surfer!"] = "Surfista", -- WxW
 --      ["Surprise supplies: Get 1-3 random weapons each turn."] = "", -- Continental_supplies
-    ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "Sopravvivi!|Suggerimento: Le animazioni possono essere saltate con il tasto [Mirino di Precisione]", -- A_Classic_Fairytale:shadow
+--      ["Survive!"] = "", -- A_Classic_Fairytale:shadow
 --      ["%s violated the “All But Last” rule and will be penalized."] = "", -- WxW
 --      ["%s violated the “Kill The Leader” rule and will be penalized."] = "", -- WxW
 --      ["Swap place with a random enemy in the circle."] = "", -- Continental_supplies
@@ -2130,6 +2099,7 @@
 --      ["%s! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
     ["Swing, Leaks A Lot, on the wings of the wind!"] = "Vai, Leaks a Lot, ondeggia sulle ali del vento!", -- A_Classic_Fairytale:first_blood
 --      ["Swing: [Left]/[Right]"] = "", -- Basic_Training_-_Rope
+--      ["%s wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome
 --      ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer
 --      ["Switch: Drop ball of dirt from parachute (once)"] = "", -- Continental_supplies
@@ -2143,6 +2113,7 @@
     ["switch"] = "scambio", -- Continental_supplies
 --      ["Switch: Select weapon special"] = "", -- Continental_supplies
 --      ["Switch: Toggle crate radar"] = "", -- WxW
+--      ["%s won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Swords"] = "", -- Bazooka_Battlefield
     ["Syntax Errol"] = "Ellole di Sintassi", -- A_Classic_Fairytale:dragon
 --      ["%s, you may choose the rules."] = "", -- WxW
@@ -2151,6 +2122,8 @@
 --      ["Tails"] = "", -- 
     ["Talk about mixed signals..."] = "Devo recuperare le casse...", -- A_Classic_Fairytale:dragon
 --      ["Tall Potato"] = "", -- A_Space_Adventure:fruit01
+--      ["Tap [Pause] to see the mission texts"] = "", -- Basic_Training_-_Movement
+--      ["Tap the “rotating arrow” button on the left|until you have selected Cappy, the hedgehog with the cap!"] = "", -- Basic_Training_-_Movement
 --      ["Target"] = "", -- HedgeEditor
 --      ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor
     ["Target Placement Mode"] = "Modalità posizionamento target", -- Construction_Mode
@@ -2166,15 +2139,18 @@
 --      ["Tatters"] = "", -- 
 --      ["Team %d"] = "", -- SimpleMission
     ["Team %d: "] = "Squadra %d: ",
+--      ["Team highscore: %d"] = "", -- Utils
 --      ["Team Identity Mode"] = "", -- HedgeEditor
 --      ["TEAM IDENTITY MODE"] = "", -- HedgeEditor
---      ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
+--      ["Team lowscore: %d"] = "", -- Utils
 --      ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion
+--      ["Team's best time: %.3fs"] = "", -- Utils
 --      ["Team Scores:"] = "", -- Control
 --      ["Team scores:"] = "", -- Space_Invasion
+--      ["Team's longest time: %.3fs"] = "", -- Utils
+--      ["Team's top accuracy: %d%"] = "", -- Utils
 --      ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2
 --      ["Teamwork"] = "", -- User_Mission_-_Teamwork
---      ["Team Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
 --      ["TechRacer"] = "", -- TechRacer
     ["Teleporation Node"] = "Nodo Teletrasporto", -- Construction_Mode
     ["Teleportation Mode"] = "Modalità Teletrasporto", -- Construction_Mode
@@ -2266,11 +2242,12 @@
 --      ["The forgotten continent"] = "", -- Continental_supplies
     ["The giant umbrella from the last crate should help break the fall."] = "L'ombrello gigante nell'ultima cassa dovrebbe rallentare la caduta", -- A_Classic_Fairytale:first_blood
     ["The Great Escape"] = "La grande fuga", -- User_Mission_-_The_Great_Escape
---      ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01
+--      ["- The green target must survive"] = "", -- HedgeEditor
+--      ["- The green targets must survive"] = "", -- HedgeEditor
     ["The guardian"] = "Il guardiano", -- A_Classic_Fairytale:shadow
 --      ["The hardships of the war turned %s (%s) into a killing machine: %d invaders destroyed in one round!"] = "", -- Space_Invasion
+--      ["The health of your current hedgehog|is shown at the top right corner."] = "", -- Basic_Training_-_Movement
 --      ["The hedgehog with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant
---      ["The Hogies"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["The Hospital"] = "", -- 
     ["The Individualist"] = "L'individualista", -- A_Classic_Fairytale:shadow
     ["Their buildings were very primitive back then, even for an uncivilised island."] = "I loro edifici erano ancora molto primitivi, anche per un'isola incivilizzata.", -- A_Classic_Fairytale:united
@@ -2288,7 +2265,6 @@
 --      ["The Mutant has super weapons and a lot of health."] = "", -- Mutant
 --      ["The Mutant loses health quickly, but gains health by killing."] = "", -- Mutant
     ["The Mutant loses health quickly if he doesn't keep scoring kills."] = "Il Mutante perde vita velocemente se non fa uccisioni.", -- Mutant
-    ["The Nameless One"] = "Il Senzanome",
 --      ["The Navy greets %s for managing to get in a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["The next 4 times you play the \"The last encounter\" mission you'll get 20 more hit points and a laser sight."] = "", -- A_Space_Adventure:death02
 --      ["The next crate is an utility crate."] = "", -- Basic_Training_-_Movement
@@ -2302,6 +2278,7 @@
 --      ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil
 --      ["The oppression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
 --      ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
+--      ["The other hog has died, he should have survived!"] = "", -- A_Space_Adventure:moon02
     ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "Gli altri erano tutti cannibali e passavano le giornate mangiando gli organi di altri ricci...", -- A_Classic_Fairytale:first_blood
 --      ["The Police"] = "", -- 
 --      ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -2326,7 +2303,7 @@
     ["The Showdown"] = "La resa dei conti", -- A_Classic_Fairytale:shadow
     ["The Slaughter"] = "Il macello", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:first_blood
 --      ["The Society of Perfectionists greets %s (%s): No misses and %d hits in its best round."] = "", -- Space_Invasion
-    ["THE SPECIALISTS"] = "GLI SPECIALISTI",
+--      ["The Specialists: Each hedgehog starts with its own weapon set"] = "", -- The_Specialists
 --      ["The spinning arrows above your hedgehog show|which hedgehog is selected right now."] = "", -- Basic_Training_-_Movement
     ["The spirits of the ancerstors are surely pleased, Leaks A Lot."] = "Gli spiriti degli antenati sono sicuramente contenti, Leaks a Lot.", -- A_Classic_Fairytale:first_blood
 --      ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
@@ -2374,7 +2351,6 @@
 --      ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["This also increases the effectiveness of Medicine."] = "", -- Continental_supplies
 --      ["This game wasn’t really exciting."] = "", -- Space_Invasion
---      ["This Hog Solo is so naive! When he returns I'll shoot him and keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This is a new personal best, congratulations!"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert02, A_Space_Adventure:fruit03
 --      ["This is a new personal best time, congratulations!"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["This is Cappy."] = "", -- Basic_Training_-_Movement
@@ -2392,6 +2368,7 @@
     ["This rain is really something..."] = "Questa pioggia ha qualcosa di strano...",
 --      ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome
 --      ["This seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01
+--      ["This %s is so naive! I'm going to shoot this fool so I can keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This was an awesome performance! But this challenge can be finished with even just one RC plane. Can you figure out how?"] = "", -- User_Mission_-_RCPlane_Challenge
     ["This will be fun!"] = "Questo sarà divertente!", -- A_Classic_Fairytale:enemy
 --      ["This will be useful when I need a new platform or if I want to rise."] = "", -- portal
@@ -2432,11 +2409,11 @@
 --      ["To begin with the training, hit the attack key!"] = "", -- Basic_Training_-_Movement
 --      ["To begin with the training, select the bazooka from the ammo menu!"] = "", -- Basic_Training_-_Bazooka
 --      ["To begin with the training, select the grenade from the ammo menu!"] = "", -- Basic_Training_-_Grenade
+--      ["To begin with the training, tap the attack button!"] = "", -- Basic_Training_-_Movement
 --      ["To finish hedgehog selection, just do anything|with him, like walking."] = "", -- Basic_Training_-_Movement
 --      ["To get over the next obstacles, keep some distance from the wall before you back jump."] = "", -- Basic_Training_-_Movement
 --      ["To get over the water, you have to do multiple|rope shots and swings."] = "", -- Basic_Training_-_Rope
 --      ["Toggle Editing Weapons and Tools: [Precise]+[2]"] = "", -- HedgeEditor
---      ["Toggle Gear Information: [Precise]+[3]"] = "", -- HedgeEditor
 --      ["Toggle Help: [Precise]+[1]"] = "", -- HedgeEditor
 --      ["Toggle Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Toggle Shield: [Long jump]"] = "", -- Space_Invasion
@@ -2446,14 +2423,14 @@
 --      ["Too bad! Then you should really leave!"] = "", -- A_Space_Adventure:fruit01
 --      ["Too slow! Try again ..."] = "", -- A_Space_Adventure:moon02
 --      ["Top-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge
-    ["To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"] = "Per posizionare un trave, selezionala, utilizza [Sinistra] e [Destra] per impostare angolo e lunghezza, posiziona con [Click Sinistro]", -- A_Classic_Fairytale:shadow
 --      ["To reach higher ground, walk to a ledge, look to the left, then do a back jump."] = "", -- Basic_Training_-_Movement
     ["Torn Muscle"] = "Muscolo strappato", -- A_Classic_Fairytale:journey
     ["To the caves..."] = "Alle grotte...", -- A_Classic_Fairytale:united
 --      ["Touch all waypoints as fast as you can!"] = "", -- Racer
---      ["To win the game, Hog Solo has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
+--      ["- Touch the sparkles near your base to teleport"] = "", -- CTF_Blizzard
+--      ["To win the game, %s has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
 --      ["To win the game you had to collect the 2 crates with no specific order."] = "", -- A_Space_Adventure:desert01
---      ["To win the game you have to eliminate all your enemies."] = "", -- A_Space_Adventure:death01
+--      ["To win the game you have to eliminate Professor Hogevil."] = "", -- A_Space_Adventure:death01
 --      ["To win the game you have to find the right crate."] = "", -- A_Space_Adventure:desert01
 --      ["To win the game you have to go next to Thanta."] = "", -- A_Space_Adventure:ice01
 --      ["To win the game you have to go to the surface."] = "", -- A_Space_Adventure:desert02
@@ -2461,13 +2438,10 @@
 --      ["To win the game you have to stand next to Thanta."] = "", -- A_Space_Adventure:ice01
     ["Toxic Team"] = "Team Velenoso", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Track completed!"] = "", -- Racer, TechRacer
---      ["Trainee"] = "", -- TargetPractice
 --      ["Training"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Training complete!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Training Team"] = "", -- TargetPractice
 --      ["Traitors don't get to shout around here!"] = "", -- A_Classic_Fairytale:epil
     ["Traitors"] = "Traditori",
---      ["Trapped"] = "", -- Basic_Training_-_Movement
 --      ["Trapper"] = "", -- HedgeEditor
 --      ["Travel carefully as your fuel is limited"] = "", -- A_Space_Adventure:cosmos
 --      ["Travel to all the neighbor planets and collect all the pieces"] = "", -- A_Space_Adventure:cosmos
@@ -2484,7 +2458,6 @@
 --      ["Try to land softly, as you can still take fall damage!"] = "", -- Basic_Training_-_Flying_Saucer
     ["Try to protect the chief! You won't lose if he dies, but it is advised that he survives."] = "Cerca di proteggere il capo! Non perderai se muore, ma è meglio che sopravviva.", -- A_Classic_Fairytale:united
 --      ["Try to reach and destroy the next target quickly."] = "", -- Basic_Training_-_Rope
-    ["T_T"] = "T_T",
 --      ["Tumbler"] = "", -- Tumbler
 --      ["Turn around: [Left Shift] + [Left]/[Right]"] = "", -- Basic_Training_-_Movement
 --      ["Turning Around"] = "", -- Basic_Training_-_Movement
@@ -2503,7 +2476,6 @@
     ["Uhmm...ok no."] = "Uhmm...ok no.", -- A_Classic_Fairytale:enemy
 --      ["Ukemi"] = "", -- 
 --      ["Ultra kill!"] = "", -- Mutant
---      ["Ultrasoldier"] = "", -- Big_Armory
 --      ["unC0Rr"] = "", -- 
     ["Under Construction"] = "In costruzione", -- A_Classic_Fairytale:shadow
 --      ["Under normal circumstances we could easily defeat them but we have kindly sent most of our men to the Kingdom of Sand to help with the annual dusting of the king's palace."] = "", -- A_Space_Adventure:fruit01
@@ -2527,7 +2499,6 @@
     ["United We Stand"] = "Sempre Uniti", -- A_Classic_Fairytale:united
     ["Unit"] = "Unità",
 --      ["Unlike bazookas, grenades are not influenced by wind."] = "", -- Basic_Training_-_Grenade
-    ["Unlimited Attacks"] = "Attacchi illimitati",
 --      ["Unlimited Attacks: Attacks don't end your turn"] = "", -- User_Mission_-_Diver, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree
     ["Unlucky Sods"] = "Zolle Sfortunate", -- User_Mission_-_Rope_Knock_Challenge
     ["Unstoppable!"] = "Inarrestabile!",
@@ -2543,13 +2514,14 @@
     ["Use it with precaution!"] = "Usala con attenzione!", -- A_Classic_Fairytale:first_blood
     ["User Challenge"] = "Sfida Utente",
 --      ["!"] = "", -- User_Mission_-_Dangerous_Ducklings
+--      ["User Mission"] = "", -- HedgeEditor
 --      ["Use the attack key twice to change the flying saucer while being in air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the attack key twice to change the flying saucer while floating in mid-air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the bazooka and the flying saucer to get the freezer."] = "", -- A_Space_Adventure:ice01
 --      ["Use the flying saucer from the crate to fly to the moon."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly the other planets."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly to the other planets."] = "", -- A_Space_Adventure:cosmos
---      ["Use the parachute ([Space] while in air) to get the next crate"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Use the parachute to get the next crate."] = "", -- A_Classic_Fairytale:first_blood
     ["Use the portal gun to get to the next crate, then use the new gun to get to the final destination!|"] = "Usa la spara-portali per prendere la prossima cassa, poi usala di nuovo per raggiungere la destinazione finale!|", -- A_Classic_Fairytale:dragon
 --      ["Use the RC plane and destroy the all the targets."] = "", -- A_Space_Adventure:desert03
 --      ["Use the rope in order to catch the blue hedgehog"] = "", -- A_Space_Adventure:moon02
@@ -2582,7 +2554,6 @@
 --      ["Victory Condition: Collect"] = "", -- HedgeEditor
 --      ["Victory Condition: Destroy"] = "", -- HedgeEditor
 --      ["Victory for %s!"] = "", -- Capture_the_Flag
-    ["Victory for the "] = "La vittoria è di ",
     ["Victory!"] = "Vittoria", -- Basic_Training_-_Rope
     ["Violence is not the answer to your problems!"] = "La violenza non è una risposta ai nostri problemi!", -- A_Classic_Fairytale:first_blood
 --      ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos
@@ -2602,9 +2573,6 @@
 --      ["Walls left: %d"] = "", -- WxW
 --      ["Wall to wall"] = "", -- WxW
 --      ["Waluigi"] = "", -- 
-    ["Wannabe Flyboys"] = "Volatori speranzosi", -- User_Mission_-_RCPlane_Challenge
---      ["Wannabe Ropers"] = "", -- Basic_Training_-_Rope
-    ["Wannabe Shoppsta"] = "Shopper speranzosi", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Wario"] = "", -- 
 --      ["Warming Up"] = "", -- Basic_Training_-_Grenade
 --      ["Warning: Fire cake detected"] = "", -- ClimbHome
@@ -2633,7 +2601,6 @@
 --      ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion
 --      ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion
 --      ["Weapon specials: Some weapons have special modes (see weapon description)."] = "", -- Continental_supplies
-    ["Weapons Reset"] = "Armi Azzerate",
 --      ["Weapons reset: The weapons are reset after each turn."] = "", -- WxW
     ["We are indeed."] = "Si, siamo al sicuro.", -- A_Classic_Fairytale:backstab
     ["We can't defeat them!"] = "Non possiamo sconfiggerli!", -- A_Classic_Fairytale:shadow
@@ -2650,9 +2617,9 @@
 --      ["We have to hurry! Are you armed?"] = "", -- A_Space_Adventure:moon01
     ["We have to protect the village!"] = "Dobbiamo proteggere il villaggio", -- A_Classic_Fairytale:united
     ["We have to unite and defeat those cylergs!"] = "Dobbiamo unirci e difendere questi cylergs", -- A_Classic_Fairytale:enemy
---      ["Welcome Hog Solo, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome home! Please take a seat"] = "", -- ClimbHome
     ["Welcome, Leaks A Lot!"] = "Benvenuto Leaks A Lot!", -- A_Classic_Fairytale:journey
+--      ["Welcome, %s, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome to the Death Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
@@ -2819,16 +2786,16 @@
 --      ["You can’t open a portal on the blue surface."] = "", -- portal
 --      ["You can use the other 2 hogs to assist you."] = "", -- A_Space_Adventure:fruit02
 --      ["You can use the rope to reach new places."] = "", -- Basic_Training_-_Rope
---      ["You choose well, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You choose well, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You completed the mission in %.3f seconds."] = "", -- A_Space_Adventure:ice02
 --      ["You completed the mission in %d rounds."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03
---      ["You couldn't have come to a worse time, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You couldn't have come to a worse time, %s!"] = "", -- A_Space_Adventure:fruit01
     ["You couldn't possibly believe that after refusing my offer I'd just let you go!"] = "Non puoi aver pensato che dopo aver rifiutato la mia offerta ti avrei lasciata andare!", -- A_Classic_Fairytale:journey
     ["You'd almost swear the water was rising!"] = "Guarda, l'acqua si sta alzando rapidamente!",
     ["You'd better watch your steps..."] = "E' meglio che tu stia attento...", -- A_Classic_Fairytale:journey
 --      ["You defended yourself against Captain Lime."] = "", -- A_Space_Adventure:fruit02
---      ["You defended yourself against the Fruit Assassins."] = "", -- A_Space_Adventure:fruit02
---      ["You did great, Hog Solo! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
+--      ["You defended yourself against %s."] = "", -- A_Space_Adventure:fruit02
+--      ["You did great, %s! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
     ["You did not make it in time, try again!"] = "Non hai fatto in tempo, prova ancora!",
 --      ["You don't deserve my sacrifice!"] = "", -- A_Classic_Fairytale:queen
 --      ["You drove Professor Hogevil away."] = "", -- A_Space_Adventure:moon01
@@ -2844,12 +2811,12 @@
 --      ["You got me!"] = "", -- A_Space_Adventure:moon02
 --      ["You had %.1fs remaining on the clock (+%d points)."] = "", -- TargetPractice
 --      ["You had %.2fs remaining on the clock (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle
---      ["You had %d additional flying saucers left."] = "", -- A_Space_Adventure:ice02
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: You might want to use some mines ..."] = "", -- A_Classic_Fairytale:backstab
     ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: you might want to use some mines..."] = "Hai 7 turni all'ondata successiva.|Assicurati che i cannibali vengano salutati in modo appropriato!|Se il riccio muore, la causa è persa.|Suggerimento: potresti utilizzare alcune mine...", -- A_Classic_Fairytale:backstab
 --      ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01
 --      ["You have activated Switch Hedgehog!"] = "", -- Basic_Training_-_Movement
 --      ["You have beaten the challenge!"] = "", -- ClimbHome
+--      ["You have beaten the team record, congratulations!"] = "", -- Utils
     ["You have been giving us out to the enemy, haven't you!"] = "Tu ci hai consegnati al nemico, vero?!", -- A_Classic_Fairytale:backstab
     ["You have chosen the perfect moment to leave."] = "Hai scelto il momento perfetto per andartene...", -- A_Classic_Fairytale:united
 --      ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01
@@ -2868,7 +2835,6 @@
 --      ["You have eliminated all visible enemy hedgehogs!"] = "", -- A_Space_Adventure:fruit01
 --      ["You have eliminated Professor Hogevil."] = "", -- A_Space_Adventure:moon01
 --      ["You have eliminated the evil minions."] = "", -- A_Space_Adventure:moon01
---      ["You have eliminated the whole evil team. You're pretty tough!"] = "", -- A_Space_Adventure:moon01
 --      ["You have escaped successfully."] = "", -- A_Space_Adventure:desert02
     ["You have failed to complete your task, young one!"] = "Non hai portato a termine le tue attività, ragazzo!", -- A_Classic_Fairytale:journey
     ["You have failed to save the tribe!"] = "Non sei riuscito a salvare la tribù!", -- A_Classic_Fairytale:backstab
@@ -2922,6 +2888,7 @@
 --      ["You have to travel again"] = "", -- A_Space_Adventure:cosmos
 --      ["You have to try again!"] = "", -- A_Space_Adventure:cosmos
 --      ["You have triggered the secret Do-Not-Rope-to-the-Moon Defense System."] = "", -- A_Space_Adventure:cosmos
+--      ["You have unlocked the target radar!"] = "", -- TargetPractice
 --      ["You have used %d flying saucers."] = "", -- A_Space_Adventure:ice02
 --      ["You have used %d RC planes."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["You have used only 1 RC plane. Outstanding!"] = "", -- User_Mission_-_RCPlane_Challenge
@@ -2940,10 +2907,9 @@
 --      ["You'll have only 2 watermelon bombs during the game."] = "", -- A_Space_Adventure:fruit03
 --      ["You'll have only one RC plane at the start of the mission."] = "", -- A_Space_Adventure:desert03
 --      ["You'll have to eliminate Captain Lime at the end."] = "", -- A_Space_Adventure:fruit02
---      ["You'll have to eliminate the Fruit Assassins at the end."] = "", -- A_Space_Adventure:fruit02
+--      ["You'll have to eliminate %s at the end."] = "", -- A_Space_Adventure:fruit02
 --      ["You'll lose if you die or if your time is up."] = "", -- A_Space_Adventure:moon02
     ["You'll see what I mean!"] = "Vedrai cosa intendo!", -- A_Classic_Fairytale:enemy
---      ["You lose!"] = "", -- Basic_Training_-_Sniper_Rifle, Big_Armory, Basic_Training_-_Bazooka, TargetPractice, ClimbHome
 --      ["You lost your target, try again!"] = "", -- TargetPractice
 --      ["You may find it handy."] = "", -- A_Space_Adventure:cosmos
     ["You may only attack from a rope!"] = "Puoi attaccare solo da una corda!",
@@ -2965,8 +2931,7 @@
 --      ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice
 --      ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice
 --      ["Your ammo is limited this time."] = "", -- Basic_Training_-_Bazooka
---      ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy
---      ["Your deaths will be avenged, Natives!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Your deaths will be avenged, %s!"] = "", -- A_Classic_Fairytale:enemy
     ["Your death will not be in vain, Dense Cloud!"] = "La tua morte non sarà invana, Nuvola Densa!", -- A_Classic_Fairytale:shadow
 --      ["You're a coward!"] = "", -- A_Classic_Fairytale:queen
     ["You're...alive!? But we saw you die!"] = "Sei...vivo!? Noi ti abbiamo visto morire!",
@@ -2994,21 +2959,21 @@
 --      ["Your next task is to collect some crates by using the rope!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Your personal best time so far: %.3f seconds"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["Your rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["You saved %d of 8 Hapless Hogs."] = "", -- User_Mission_-_That_Sinking_Feeling
+--      ["Your rope is gone! Try again!"] = "", -- Basic_Training_-_Rope
+--      ["You saved %d of 8 hegehogs."] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen
 --      ["You see the wind strength at the bottom right corner."] = "", -- Basic_Training_-_Bazooka
+--      ["You see the wind strength at the top."] = "", -- Basic_Training_-_Bazooka
 --      ["You should have known that we don't rely on meatbags!"] = "", -- A_Classic_Fairytale:queen
 --      ["You should know this more than anyone, Leaks!"] = "", -- A_Classic_Fairytale:queen
 --      ["You speak great truth, Hannibal. Here, take a sip!"] = "", -- A_Classic_Fairytale:epil
     ["You've been assaulting us, we have been just defending ourselves!"] = "Tu ci hai assalito, noi ci stavamo solo difendendo!", -- A_Classic_Fairytale:enemy
-    ["You've failed. Try again."] = "Hai fallito. Prova di nuovo.",
     ["You've reached the goal!| |Time: "] = "Hai raggiunto il traguardo!| |Tempo: ",
     ["You will be avenged!"] = "Sarai vendicato!",
 --      ["You will fail if you run out of ammo and there are still targets available."] = "", -- A_Space_Adventure:desert03
 --      ["You will gain some extra ammo from the crates the next time you play the \"Getting to the device\" mission."] = "", -- A_Space_Adventure:fruit03
 --      ["You will play every 3 turns."] = "", -- A_Space_Adventure:fruit01
     ["- You will recieve 2-4 weapons on each kill! (Even on own hogs)"] = "- Riceverai 2-4 armi per ogni uccisione! (anche dei tuoi ricci)", -- Continental_supplies
---      ["You win!"] = "", -- Big_Armory
     ["You won't believe what happened to me!"] = "Non crederete a quello che mi è successo!",
     ["Yuck! I bet they'll keep worshipping her even after I save the village!"] = "Scommetto che continueranno ad adorarla anche dopo che avrò salvato il villaggio!", -- A_Classic_Fairytale:family
 --      ["Yumme Gunpowder"] = "", -- 
@@ -3016,6 +2981,7 @@
 --      ["Zombie"] = "", -- 
 --      ["Zombi"] = "", -- portal
     ["'Zooka Team"] = "Squadra Zooka",
---      ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
+--      ["Zoom: [Pinch] with 2 fingers"] = "", -- Basic_Training_-_Movement
+--      ["Zoom: [Rotate mouse wheel]"] = "", -- Basic_Training_-_Movement
     ["Zork"] = "Zork",
 }
--- a/share/hedgewars/Data/Locale/ko.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/ko.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -26,7 +26,6 @@
 --      ["Above-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Accuracy Bonus! +15 points"] = "", -- Space_Invasion
 --      ["Accuracy bonus: +%d points"] = "", -- Basic_Training_-_Sniper_Rifle
---      ["Ace"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge
 --      ["Achievement gotten: %s"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_That_Sinking_Feeling, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, Basic_Training_-_Rope, Tumbler
 --      ["A Classic Fairytale"] = "", -- A_Classic_Fairytale:first_blood
 --      ["A crate critical to this mission has been destroyed."] = "", -- SimpleMission
@@ -46,7 +45,6 @@
 --      ["Again with the 'cannibals' thing!"] = "", -- A_Classic_Fairytale:enemy
 --      ["A Hedgewars minigame"] = "", -- Capture_the_Flag
 --      ["A Hedgewars mini-game"] = "", -- Racer, Space_Invasion, TechRacer, Tumbler
---      ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
 --      ["A Hedgewars tag game"] = "", -- Mutant
 --      ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome
 --      ["Aim at the ceiling and hold [Attack] pressed until the rope attaches."] = "", -- Basic_Training_-_Rope
@@ -141,13 +139,14 @@
 --      ["As you've seen, the dropped grenade roughly fell into your flying direction."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Athlete"] = "", -- Battalion
 --      ["Attack: Activate"] = "", -- Racer
---      ["Attack Captain Lime before he attacks back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack Captain Lime before he attacks back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack From Rope: %s"] = "", -- WxW
 --      ["Attack From Rope: You may only attack from a rope."] = "", -- WxW
 --      ["Attack rule: %s"] = "", -- WxW
 --      ["Attack: Select this continent"] = "", -- Continental_supplies
 --      ["Attack: [Space]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
---      ["Attack the assassins before they attack back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack: Tap the [Bomb]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
+--      ["Attack the assassins before they attack back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack: Throw ball"] = "", -- Knockball
 --      ["At the end of the game your health was %d."] = "", -- A_Space_Adventure:ice01
 --      ["At the start of the game each enemy hog has only the weapon that he is named after."] = "", -- A_Space_Adventure:death02
@@ -155,16 +154,18 @@
 --      ["Available weapon specials:"] = "", -- Continental_supplies
 --      ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion
---      ["Avoid the mines!"] = "", -- Basic_Training_-_Rope
 --      ["Axes"] = "", -- Bazooka_Battlefield
 --      ["Aye! Fellow! Let me exit this chamber of doom!"] = "", -- A_Classic_Fairytale:epil
 --      ["Back Breaker"] = "", -- A_Classic_Fairytale:backstab
 --      ["Back in the village, after telling the villagers about the threat..."] = "", -- A_Classic_Fairytale:united
 --      ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil
 --      ["Back Jump: [Backspace] ×2"] = "", -- Basic_Training_-_Movement
+--      ["Back Jump: Double-tap the [Curvy Arrow]"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (1/2)"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (2/2)"] = "", -- Basic_Training_-_Movement
 --      ["Backstab"] = "", -- A_Classic_Fairytale:backstab
+--      ["Backwards jump: Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Backwards jump: Tap the [Curvy Arrow] twice"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Bacon"] = "", -- 
 --      ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Badmad"] = "", -- portal
@@ -197,7 +198,6 @@
 --      ["Bazooka Battlefield"] = "", -- Bazooka_Battlefield
 --      ["Bazooka Master"] = "", -- Basic_Training_-_Bazooka
 --      ["Bazookas are influenced by wind."] = "", -- Basic_Training_-_Bazooka
---      ["Bazooka Team"] = "", -- Basic_Training_-_Bazooka
 --      ["Bazooka Training"] = "",
 --      ["Bearded Beast"] = "", -- 
 --      ["Be careful, the future of Hogera is in your hands!"] = "", -- A_Space_Adventure:cosmos
@@ -231,7 +231,6 @@
 --      ["Bloodpie"] = "", -- A_Classic_Fairytale:backstab
 --      ["Bloodrocutor"] = "", -- A_Classic_Fairytale:shadow
 --      ["Bloodsucker"] = "", -- A_Classic_Fairytale:shadow
---      ["Bloody Rookies"] = "", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 --      ["Blue"] = "", -- 
 --      ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Bob"] = "", -- A_Space_Adventure:cosmos
@@ -314,7 +313,9 @@
 --      ["Challenge objectives"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit03, A_Space_Adventure:moon02
 --      ["Challenge over!"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa, ClimbHome
+--      ["Change bounciness: Tap [B]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Content: [Left], [Right]"] = "", -- HedgeEditor
+--      ["Change detonation timer: Tap the [Clock]"] = "", -- Basic_Training_-_Grenade, A_Classic_Fairytale:shadow
 --      ["Change direction: [Left]/[Right]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Change Health: [Left], [Right]"] = "", -- HedgeEditor
@@ -334,6 +335,8 @@
 --      ["Chicken"] = "", -- 
 --      ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01
 --      ["Chikorita"] = "", -- 
+--      ["Choose location: Left click"] = "", -- A_Classic_Fairytale:shadow
+--      ["Choose location: Tap the [Target] button, then tap on the spot you want to choose"] = "", -- A_Classic_Fairytale:shadow
 --      ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Choose your continent wisely, as your decision will be permanent."] = "", -- Continental_supplies
 --      ["Choose your side! If you want to join the strange man, walk up to him.|Otherwise, walk away from him. If you decide to att...nevermind..."] = "", -- A_Classic_Fairytale:shadow
@@ -342,7 +345,6 @@
 --      ["Cleaver"] = "", -- Construction_Mode
 --      ["Cleaver Placement Mode"] = "", -- Construction_Mode
 --      ["CLEAVER PLACEMENT MODE"] = "", -- HedgeEditor
---      ["Climber"] = "", -- ClimbHome
 --      ["Climb Home"] = "", -- ClimbHome
 --      ["Closing in"] = "", -- A_Classic_Fairytale:queen
 --      ["Clown"] = "", -- HedgeEditor
@@ -352,11 +354,13 @@
 --      ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb
 --      ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey
 --      ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey
+--      ["- Collect all the blue crates"] = "", -- HedgeEditor
 --      ["Collect all the crates, but remember, our time in this life is limited!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect or destroy all the health crates."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Collect or destroy the final crate to finish the training."] = "", -- Basic_Training_-_Flying_Saucer
+--      ["- Collect the blue crate"] = "", -- HedgeEditor
 --      ["Collect the crate and attack!"] = "", -- WxW
---      ["Collect the crate on the right.|Hint: Select the rope, [Up] or [Down] to aim, [Space] to fire, directional keys to move.|Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Collect the crate on the right."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the crates within the time limit!|If you fail, you'll have to try again."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the first crate to begin!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Collect the freezer and get the device part from Thanta."] = "", -- A_Space_Adventure:ice01
@@ -424,7 +428,6 @@
 --      ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates per turn: %d"] = "", -- WxW
---      ["crate(s)"] = "", -- SpeedShoppa
 --      ["Crazy Gravity: Gravity randomly changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity
 --      ["Crazy Runner"] = "", -- A_Space_Adventure:moon02
 --      ["Cricket Time"] = "", -- Continental_supplies
@@ -457,11 +460,10 @@
 --      ["Deals 15 damage to all enemies in the circle."] = "", -- Continental_supplies
 --      ["Deer"] = "", -- 
 --      ["Defeat all enemies!"] = "", -- portal
+--      ["Defeat!"] = "", -- HedgeEditor
 --      ["Defeat Professor Hogevil!"] = "", -- A_Space_Adventure:death01
---      ["Defeat the cannibals"] = "", -- A_Classic_Fairytale:backstab
---      ["Defeat the cannibals!|"] = "", -- A_Classic_Fairytale:united
+--      ["Defeat the cannibals!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cannibals!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Defeat the cannibals!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cyborgs!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen
 --      ["Delete Waypoint"] = "", -- HedgeEditor
@@ -482,11 +484,11 @@
 --      ["Destroyer of planes"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Destroy him, Leaks A Lot! He is responsible for the deaths of many of us!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion
+--      ["- Destroy the enemy"] = "", -- HedgeEditor
+--      ["- Destroy the red target"] = "", -- HedgeEditor
+--      ["- Destroy the red targets"] = "", -- HedgeEditor
 --      ["Destroy the targets!"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
---      ["Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
---      ["Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"] = "", -- A_Classic_Fairytale:first_blood
 --      ["+%d flamer fuel!"] = "", -- Tumbler
---      ["%d Hapless Hogs left"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["+%d health"] = "", -- Mutant
 --      ["%d-Hit Combo! +%d points!"] = "", -- Space_Invasion
 --      ["Did anyone follow you?"] = "", -- A_Classic_Fairytale:united
@@ -507,7 +509,6 @@
 --      ["Disguise as a Rockhopper Penguin"] = "", -- Continental_supplies
 --      ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies
 --      ["Displacer"] = "", -- 
---      ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Diver"] = "", -- User_Mission_-_Diver
 --      ["%d ms"] = "", -- HedgeEditor
 --      ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen
@@ -594,10 +595,8 @@
 --      ["Elderbot"] = "", -- A_Classic_Fairytale:family
 --      ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape
 --      ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "", --Bazooka, Shotgun, SniperRifle
---      ["Eliminate the Blue Team before the time runs out."] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Eliminate the enemy before the time runs out."] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 --      ["Eliminate the enemy hogs to win."] = "",
---      ["Eliminate the enemy specialists."] = "",
 --      ["Eliminate the enemy."] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh
 --      ["Eliminate Unit 3378."] = "", -- User_Mission_-_Teamwork
 --      ["Eliminate WatchBot 4000."] = "", -- User_Mission_-_Teamwork_2
@@ -622,13 +621,14 @@
 --      ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab
 --      ["Except me, of course! I just saved a whole planet!"] = "", -- A_Space_Adventure:final
 --      ["Experienced beginner"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Explore the tunnel with the other hedgehogs and search for the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Explore the tunnel with the other hedgehogs and search for the device."] = "", -- A_Space_Adventure:fruit02
 --      ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02
 --      ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey
 --      ["Fair Wind"] = "", -- 
 --      ["Fall Damage"] = "", -- Basic_Training_-_Movement
 --      ["Fallen Angel"] = "", -- Tentacle_Terror
 --      ["Family Reunion"] = "", -- A_Classic_Fairytale:family
+--      ["Fastest escape: %d turns"] = "", -- A_Space_Adventure:desert02
 --      ["Fastest lap: "] = "",
 --      ["Fastest lap: %.3fs by %s"] = "", -- TrophyRace
 --      ["Feeble Resistance"] = "",
@@ -648,11 +648,12 @@
 --      ["Final result"] = "", -- Mutant
 --      ["Final Targets"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
 --      ["Final team scores:"] = "", -- Space_Invasion
+--      ["Find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Find a way to detonate all the explosives and stay alive!"] = "", -- A_Space_Adventure:final
 --      ["Find your tribe!|Cross the lake!"] = "", -- A_Classic_Fairytale:dragon
 --      ["Finish this challenge as fast as possible to earn bonus points."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Finish waypoint placement"] = "", -- Racer
---      ["Finish your training|Hint: Animations can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Finish your training."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Finite Ropes"] = "", -- Basic_Training_-_Rope
 --      ["Fire a rocket with napalm."] = "", -- Continental_supplies
 --      ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler
@@ -680,6 +681,7 @@
 --      ["Flying Saucer Training"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Fly into space to fight off the invaders with barrels!"] = "", -- Space_Invasion
 --      ["Fly to the meteorite and detonate the explosives"] = "", -- A_Space_Adventure:cosmos
+--      ["Follow the path and destroy the next target."] = "", -- Basic_Training_-_Rope
 --      ["Forgetfulness: You will lose all your weapons each turn."] = "", -- Continental_supplies
 --      ["For the next crate, you have to do back jumps."] = "", -- Basic_Training_-_Movement
 --      ["Four Eyes"] = "", -- 
@@ -699,8 +701,6 @@
 --      ["“g=150”, where 150 is 150% of normal gravity."] = "", -- Gravity
 --      ["“g=50, g2=150, period=4000” for gravity changing|from 50 to 150 and back with period of 4000 ms."] = "", -- Gravity
 --      ["Galaxy Guardians"] = "", -- Big_Armory
---      ["Game Modifiers: "] = "",
---      ["GAME OVER!"] = "",
 --      ["Game over!"] = "", -- Space_Invasion
 --      ["Game Started!"] = "",
 --      ["Game? Was this a game to you?!"] = "", -- A_Classic_Fairytale:enemy
@@ -710,8 +710,6 @@
 --      ["Gasp! A smuggler!"] = "", -- A_Space_Adventure:desert01
 --      ["Gasp!"] = "", -- A_Space_Adventure:desert01
 --      ["Gathering fruits all day long."] = "", -- A_Classic_Fairytale:queen
---      ["Gear information hidden"] = "", -- HedgeEditor
---      ["Gear information shown"] = "", -- HedgeEditor
 --      ["Gear Placement Tool"] = "", -- HedgeEditor
 --      ["General information"] = "", -- Continental_supplies
 --      ["General information:"] = "", -- Continental_supplies
@@ -721,7 +719,7 @@
 --      ["Get Dense Cloud out of the pit!"] = "", -- A_Classic_Fairytale:journey
 --      ["Get him, Spike!"] = "", -- A_Space_Adventure:desert01
 --      ["Get on over there and take him out!"] = "",
---      ["Get on the head of the mole"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Get on the head of the mole."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Get past the flower."] = "", -- A_Classic_Fairytale:journey
 --      ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01
 --      ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood
@@ -759,7 +757,6 @@
 --      ["GO! GO! GO!"] = "",
 --      ["Good birdy......"] = "",
 --      ["Good bye!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Good Dude"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Good idea, they'll never find us there!"] = "", -- A_Classic_Fairytale:united
 --      ["Good job!"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Good job! Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -770,7 +767,7 @@
 --      ["Good so far!"] = "",
 --      ["Good to go!"] = "",
 --      ["Good! You now control Cappy."] = "", -- Basic_Training_-_Movement
---      ["Go on top of the flower"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Go on top of the flower."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Go, quick!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Gorkij"] = "", -- A_Classic_Fairytale:journey
 --      ["Go surf!"] = "", -- WxW
@@ -793,7 +790,6 @@
 --      ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow
 --      ["Green"] = "", -- 
 --      ["Green Bananas"] = "", -- A_Space_Adventure:fruit01
---      ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Green double rings also give you a new flying saucer."] = "", -- A_Space_Adventure:ice02
 --      ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01
 --      ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01
@@ -803,11 +799,8 @@
 --      ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Greetings from the Navy, %s (%s), for being a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["Greetings, %s!"] = "", -- A_Classic_Fairytale:dragon
---      ["Greg"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
---      ["Grenade Group"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard
 --      ["Grenades explode after 1 to 5 seconds (you decide)."] = "", -- Basic_Training_-_Grenade
 --      ["Grenades with high bounciness bounce a lot and behave chaotic."] = "", -- Basic_Training_-_Grenade
---      ["Grenade Team"] = "", -- Basic_Training_-_Grenade
 --      ["Grenade Training"] = "", -- Basic_Training_-_Grenade
 --      ["Grenadiers"] = "", -- Basic_Training_-_Grenade
 --      ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor
@@ -848,7 +841,6 @@
 --      ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion
 --      ["Health Modification Mode"] = "", -- HedgeEditor
 --      ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor
---      ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
 --      ["Heavenly Defense"] = "", -- Tentacle_Terror
 --      ["Heavy"] = "",
 --      ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united
@@ -861,6 +853,7 @@
 --      ["Hedgehog Projectile"] = "", -- Continental_supplies
 --      ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies
 --      ["Hedgehogs can not be deleted."] = "", -- HedgeEditor
+--      ["Hedgehogs left: %d"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Hedgehogs will be revived after their death."] = "", -- Mutant
 --      ["Hedgehogs will start in the first waypoint."] = "", -- Racer
 --      ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab
@@ -876,7 +869,6 @@
 --      ["Help Enabled"] = "", -- HedgeEditor
 --      ["Helpers: Each team starts with %d helper points"] = "", -- Battalion
 --      ["Helpers: Hogs will get 1 out of 2 helpers randomly each turn"] = "", -- Battalion
---      ["Help Hog Solo to find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Help me, Leaks!"] = "", -- A_Classic_Fairytale:journey
 --      ["Help me, please!!!"] = "", -- A_Classic_Fairytale:journey
 --      ["Help me, please!"] = "", -- A_Classic_Fairytale:journey
@@ -891,20 +883,20 @@
 --      ["Here you will find the current mission instructions."] = "", -- Basic_Training_-_Movement
 --      ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Heroic Wind"] = "", -- Continental_supplies
---      ["Hero Team"] = "", -- User_Mission_-_The_Great_Escape
 --      ["He's so brave..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["He was the lab assistant of Dr. Goodhogan, the inventor of the anti-gravity device."] = "", -- A_Space_Adventure:moon02
 --      ["He won't be selling us out anymore!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey, don't forget us! We still need to climb up!"] = "", -- A_Classic_Fairytale:family
 --      ["Hey, guys!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey guys!"] = "", -- A_Classic_Fairytale:united
---      ["Hey, Hog Solo! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey! I was supposed to collect it!"] = "", -- A_Space_Adventure:fruit02
+--      ["Hey, %s! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey, %s! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey
 --      ["Hidden"] = "", -- portal
 --      ["High Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["High Jump: [Backspace]"] = "", -- Basic_Training_-_Movement
+--      ["High Jump: Tap the [Curvy Arrow] shortly"] = "", -- Basic_Training_-_Movement
 --      ["--- Highland ---"] = "", -- Battalion
 --      ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander
 --      ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion
@@ -915,20 +907,24 @@
 --      ["Hill Guard"] = "", -- Bazooka_Battlefield
 --      ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01
 --      ["--- Hint ---"] = "", -- Battalion
---      ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
 --      ["Hint: Drilling holes should solve everything."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: Hold down [M] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: If this mission panel disappears, you can|see it again by hitting the Pause or Quit key."] = "", -- Basic_Training_-_Movement
 --      ["Hint: It might be a good idea to place a girder before starting to drill. Just saying."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: It might be easier if you vary the angle only slightly."] = "", -- Basic_Training_-_Bazooka
+--      ["Hint: Just select the parachute, it opens automatically when you fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion
 --      ["Hint: Launch the bazooka horizontally at full power."] = "", -- Basic_Training_-_Bazooka
---      ["Hint: Press [Esc] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Pause the game to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Select the blow torch, aim and press [Fire]. Press [Fire] again to stop."] = "", -- A_Classic_Fairytale:journey
 --      ["Hint: Select the low gravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey
+--      ["Hint: Select the rope, [Up] or [Down] to aim, [Attack] to fire, directional keys to move."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Select the Shoryuken and hit [Attack].|P.S.: You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: %s needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family
 --      ["Hint: The rope only bends around objects.|When it doesn't hit anything, it's always straight."] = "", -- Basic_Training_-_Rope
 --      ["Hint: To jump higher, wait a bit before you hit “High Jump” a second time."] = "", -- Basic_Training_-_Movement
+--      ["Hint: To place a girder, select it,|then use [Left] and [Right] to select angle and length,|then choose a location for the girder."] = "", -- A_Classic_Fairytale:shadow
 --      ["Hint: Use the quit key to see the team’s continent."] = "", -- Continental_supplies
 --      ["Hint: When you shorten the rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope
 --      ["Hint: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey
@@ -962,24 +958,11 @@
 --      ["Hogminator"] = "", -- A_Classic_Fairytale:family
 --      ["Hog nueve"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog octo"] = "", -- A_Space_Adventure:fruit03
---      ["Hogonauts"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Hog onze"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog Saturn"] = "", -- A_Space_Adventure:fruit03
 --      ["Hogs in sight!"] = "", -- Continental_supplies
 --      ["Hog Solo and GB"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hog Solo"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01, A_Space_Adventure:moon02
---      ["Hog Solo couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo escaped successfully!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo has to reach the last crates"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo has to refuel his saucer."] = "", -- A_Space_Adventure:moon01
---      ["Hog Solo lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
---      ["Hog Solo wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["- Hogs will be revived"] = "", -- Capture_the_Flag
 --      ["- Hogs will drop the flag when killed"] = "", -- Capture_the_Flag
 --      ["Hog two"] = "", -- A_Space_Adventure:fruit03
@@ -989,9 +972,7 @@
 --      ["Homing Bee"] = "", -- Construction_Mode
 --      ["Honda"] = "", -- 
 --      ["Honest Lee"] = "", -- A_Classic_Fairytale:enemy
---      ["Hook"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
 --      ["Hooks"] = "", -- 
---      ["Hooray!"] = "",
 --      ["Hooray! I actually did it! Hogera is safe!"] = "", -- A_Space_Adventure:final
 --      ["Hooray! I've found it, now I have to get back to Captain Lime!"] = "", -- A_Space_Adventure:fruit02
 --      ["Hooray! You are a champion!"] = "", -- A_Space_Adventure:ice02
@@ -1007,7 +988,7 @@
 --      ["However, if you fail to do so, she dies a most violent death, just like your friend! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, if you fail to do so, she dies a most violent death! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, my mates don't agree with me on letting you go..."] = "", -- A_Classic_Fairytale:dragon
---      ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
+--      ["However, the army of %s is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
 --      ["How to Rope"] = "", -- Basic_Training_-_Rope
 --      ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen
 --      ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen
@@ -1027,7 +1008,6 @@
 --      ["I can't believe what I'm hearing!"] = "", -- A_Classic_Fairytale:backstab
 --      ["I can't let you go further because …"] = "", -- A_Classic_Fairytale:queen
 --      ["I can't wait any more, I have to save myself!"] = "", -- A_Classic_Fairytale:shadow
---      ["Ice"] = "", -- Basic_Training_-_Movement
 --      ["Ice Jake"] = "", -- A_Space_Adventure:ice01
 --      ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family
 --      ["Icy Girder: [3]"] = "", -- HedgeEditor
@@ -1085,7 +1065,6 @@
 --      ["I just found out that they have captured your princess!"] = "", -- A_Classic_Fairytale:family
 --      ["I just want the strange device you found!"] = "", -- A_Space_Adventure:ice01
 --      ["I just wonder where Ramon and Spiky disappeared..."] = "", -- A_Classic_Fairytale:journey
---      ["Ikeda"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["I know and I'm terribly sorry!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know, my hero!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know that your resources are low due to the battle but I'll send two of my best hogs to assist you."] = "", -- A_Space_Adventure:fruit02
@@ -1113,6 +1092,7 @@
 --      ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen
 --      ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united
 --      ["IMPORTANT: To see the mission panel again, hold the mission panel key."] = "", -- Basic_Training_-_Movement
+--      ["IMPORTANT: To see the mission panel again, pause the game."] = "", -- Basic_Training_-_Movement
 --      ["Impressive...you are still dry as the corpse of a hawk after a week in the desert..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["%i ms"] = "", -- Gravity
 --      ["I'm so glad this is finally over!"] = "", -- A_Space_Adventure:final
@@ -1271,7 +1251,6 @@
 --      ["Kill the traitor, %s, or spare his life!"] = "", -- A_Classic_Fairytale:backstab
 --      ["--- King ---"] = "", -- Battalion
 --      ["King"] = "", -- Battalion
---      ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing
 --      ["--- King Mode ---"] = "", -- Battalion
 --      ["Knight"] = "", -- Battalion
 --      ["Knives"] = "", -- 
@@ -1290,7 +1269,7 @@
 --      ["Launch some bazookas to destroy the targets!"] = "", -- Basic_Training_-_Bazooka
 --      ["Leader"] = "", -- A_Classic_Fairytale:enemy
 --      ["Leaderbot"] = "", -- A_Classic_Fairytale:queen
---      ["Lead the Green Bananas to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
+--      ["Lead your allies to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
 --      ["Leaks A Lot"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Leaks A Lot, depressed for killing his loved one, failed to save the village..."] = "", -- A_Classic_Fairytale:journey
 --      ["Leaks A Lot gave his life for his tribe! He should have survived!"] = "", -- A_Classic_Fairytale:first_blood
@@ -1305,7 +1284,6 @@
 --      ["Left/right: Choose crate contents"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode
---      ["Left Tong"] = "", -- Bazooka_Battlefield
 --      ["Legs"] = "", -- 
 --      ["Less tools, more fun"] = "", -- Battalion
 --      ["Lestat"] = "", -- portal
@@ -1334,18 +1312,19 @@
 --      ["Lively Lifeguard"] = "",
 --      ["Lonely Cries"] = "", -- Continental_supplies
 --      ["Lonely Cries: [Rise the water if no hog is in the circle and deal 6 damage to all enemy hogs.]"] = "", -- Continental_supplies
---      ["Lonely Hog"] = "", -- ClimbHome
 --      ["Long Jump: [Enter]"] = "", -- Basic_Training_-_Movement
+--      ["Long Jump: Tap the [Curvy Arrow] button for long"] = "", -- Basic_Training_-_Movement, A_Classic_Fairytale:first_blood
 --      ["Long Live The Queen"] = "", -- A_Classic_Fairytale:queen
 --      ["Look around: [Mouse movement]"] = "", -- Basic_Training_-_Movement
+--      ["Look around: [Tap or swipe on the screen]"] = "", -- Basic_Training_-_Movement
 --      ["Look, boss! There is the target!"] = "", -- A_Space_Adventure:moon01
 --      ["Look, I had no choice!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! There's more of them!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! We're surrounded by cannibals!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Looks like the whole world is falling apart!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Look to the left and do a backwards jump towards the mushroom."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Loon"] = "", -- The_Specialists
 --      ["Loopy"] = "", -- 
---      ["Lord Evil"] = "", -- Tentacle_Terror
 --      ["Losing Condition: Destroy"] = "", -- HedgeEditor
 --      ["Low Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander
@@ -1365,7 +1344,6 @@
 --      ["Mario"] = "", -- 
 --      ["Mark gears for win/lose conditions"] = "", -- HedgeEditor
 --      ["Mark/unmark gear: [Left Click]"] = "", -- HedgeEditor
---      ["Mark"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
 --      ["- Massive weapon bonus on first turn"] = "", -- Continental_supplies
 --      ["Max Citrus"] = "", -- A_Space_Adventure:fruit01
 --      ["Maybe you should try an easier map next time."] = "", -- Racer
@@ -1380,7 +1358,6 @@
 --      ["Mega kill!"] = "", -- Mutant
 --      ["Meiwes"] = "", -- A_Classic_Fairytale:backstab
 --      ["mikade"] = "", -- 
---      ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer
 --      ["Mindy"] = "", -- A_Classic_Fairytale:united
 --      ["Mine Deployer"] = "",
 --      ["Mine Placement Mode"] = "", -- Construction_Mode
@@ -1399,12 +1376,12 @@
 --      ["Minion"] = "", -- A_Space_Adventure:moon01
 --      ["Minions"] = "", -- A_Space_Adventure:moon01
 --      ["Mission failed!"] = "", -- Big_Armory
---      ["MISSION FAILED"] = "", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Mission failure in %d s"] = "", -- Big_Armory
+--      ["Mission"] = "", -- HedgeEditor
 --      ["Mission lost!"] = "", -- Basic_Training_-_Grenade
 --      ["Mission Panel"] = "", -- Basic_Training_-_Movement
 --      ["Mission panel: [M]"] = "", -- Basic_Training_-_Movement
---      ["MISSION SUCCESSFUL"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+--      ["Mission succeeded!"] = "", -- portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, SimpleMission, HedgeEditor
 --      ["Mission won!"] = "", -- Basic_Training_-_Grenade
 --      ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02
 --      ["Mixed %d"] = "", -- WxW
@@ -1420,7 +1397,6 @@
 --      ["Monster kill!"] = "", -- Mutant
 --      ["Monsters"] = "", -- 
 --      ["Mooney"] = "", -- 
---      ["More Natives"] = "", -- A_Classic_Fairytale:epil
 --      ["Morris"] = "", -- 
 --      ["Most mines are not active."] = "", -- A_Space_Adventure:desert02
 --      ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01
@@ -1440,13 +1416,11 @@
 --      ["Nade Boy"] = "", -- Basic_Training_-_Grenade
 --      ["Nah, probably everyone was just stupid."] = "", -- A_Space_Adventure:final
 --      ["Name"] = "", -- A_Classic_Fairytale:queen
---      ["Nameless Heroes"] = "",
 --      ["Nancy Screw"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:queen
 --      ["Napalm"] = "", -- Construction_Mode
 --      ["Napalm Rocket"] = "", -- Continental_supplies
 --      ["Napalm rocket: [Fire a bomb with napalm!]"] = "", -- Continental_supplies
 --      ["Naranja Jed"] = "", -- A_Space_Adventure:fruit01
---      ["Natives"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Naughty Ninja"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Near a PAotH base on the moon ..."] = "", -- A_Space_Adventure:moon01
 --      ["Near Secret Base 17 of PAotH in the rural Hogland ..."] = "", -- A_Space_Adventure:cosmos
@@ -1541,11 +1515,8 @@
 --      ["Oh, my!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oh, my! I forgot something!"] = "", -- A_Classic_Fairytale:queen
 --      ["Oh, my! This is even more entertaining than I've expected!"] = "", -- A_Classic_Fairytale:backstab
---      ["Oh no! Just try again!"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Oh no, not %s!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
---      ["Oh no, the Green Bananas have betrayed Hog Solo and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
---      ["Oh no! Time's up! Just try again."] = "", --Bazooka, Shotgun, SniperRifle
---      ["Oh no! You failed! Just try again."] = "", -- Basic_Training_-_Cluster_Bomb
+--      ["Oh no, the companions have betrayed %s and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
 --      ["Oh no! You have died. Try again!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Oh! Please spare me. You can take all my treasures!"] = "", -- A_Space_Adventure:ice01
 --      ["Oh, silly me! I forgot that I'm the shaman."] = "", -- A_Classic_Fairytale:backstab
@@ -1567,9 +1538,9 @@
 --      ["One shall not judge one by one's appearance!"] = "", -- A_Classic_Fairytale:epil
 --      ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oneye"] = "", -- portal
---      ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant
 --      ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant
+--      ["Only %s can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard
 --      ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01
@@ -1581,6 +1552,7 @@
 --      ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01
 --      ["Oops! You have selected the wrong hedgehog! Just try again."] = "", -- Basic_Training_-_Movement
 --      ["Open ammo menu: [Right click]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
+--      ["Open ammo menu: Tap the [Suitcase]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
 --      ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Opposing Team: "] = "",
 --      ["Orange"] = "", -- 
@@ -1600,15 +1572,14 @@
 --      ["PAotH has sent explosives but unfortunately the trigger mechanism seems to be faulty!"] = "", -- A_Space_Adventure:cosmos
 --      ["Parachute"] = "", -- Continental_supplies
 --      ["Patches"] = "", -- 
---      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02
 --      ["Pause: [P]"] = "", -- Basic_Training_-_Movement
+--      ["Pause: Tap the [Pause] button"] = "", -- Basic_Training_-_Movement
 --      ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW
 --      ["Penguin Roar"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hog’s health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Perfect! Now try to get the next crate without hurting yourself!"] = "", -- A_Classic_Fairytale:first_blood
---      ["Per-Hog Ammo"] = "",
 --      ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh
 --      ["Personal best: %.3f seconds"] = "", -- A_Space_Adventure:ice02
 --      ["Per team weapons"] = "", -- Continental_supplies
@@ -1617,7 +1588,6 @@
 --      ["Physicist"] = "", -- HedgeEditor
 --      ["Piano Strike"] = "", -- Construction_Mode
 --      ["Pikachu"] = "", -- 
---      ["Pincer Knights"] = "", -- Bazooka_Battlefield
 --      ["Pings left: %d"] = "", -- Space_Invasion
 --      ["Pink"] = "", -- 
 --      ["Pirates"] = "", -- 
@@ -1669,9 +1639,7 @@
 --      ["Please wait …"] = "", -- WxW
 --      ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion
 --      ["--- Points ---"] = "", -- Battalion
---      ["points"] = "", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
 --      ["--- Points Mode ---"] = "", -- Battalion
---      ["point(s)"] = "", -- TargetPractice, Mutant
 --      ["Poison"] = "",
 --      ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02
 --      ["Poisonous, deals no damage."] = "", -- Continental_supplies
@@ -1691,37 +1659,37 @@
 --      ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to fight"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos
---      ["Prepare yourself"] = "",
+--      ["Prepare yourself, %s!"] = "", -- The_Specialists
 --      ["Press [Attack] (space bar by default) to start,|repeadedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] (space bar by default) to start,|repeatedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] to begin."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Attack] to confirm."] = "", -- Continental_supplies
 --      ["Press [Attack] to select this continent!"] = "", -- Continental_supplies
 --      ["Press [Left] and [Right] to change the difficulty."] = "", -- A_Classic_Fairytale:first_blood
---      ["Press [Left] or [Right] to move around, [Enter] to jump"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Press [Left] or [Right] to move around, [Long Jump] to jump forwards."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW
 --      ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW
+--      ["Press [M] to see the mission texts"] = "", -- Basic_Training_-_Movement
 --      ["Press [Precise] to skip intro"] = "",
 --      ["Press [Up] and [Down] to move between menu items.|Press [Attack], [Left], or [Right] to toggle."] = "", -- WxW
 --      ["Prestigious Pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Princess"] = "", -- A_Classic_Fairytale:family, A_Classic_Fairytale:journey
 --      ["Princess Peach"] = "", -- 
---      ["Private Nolak"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["Problems, dude? Chillax!"] = "", -- A_Classic_Fairytale:epil
 --      ["Professional pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professional stunt pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professor"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
 --      ["Professor Hogevil, then known as James Hogus, worked for PAotH back in my time."] = "", -- A_Space_Adventure:moon02
+--      ["Professor's Team"] = "", -- A_Space_Adventure:death01
 --      ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
---      ["Pro Killers"] = "", -- Big_Armory
 --      ["Protect the King: When the king dies, so does the team"] = "", -- Battalion
 --      ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Protect yourselves!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Purple"] = "", -- 
 --      ["Pyro"] = "", -- HedgeEditor, The_Specialists
 --      ["Pyromancer"] = "", -- Battalion
 --      ["Quit: [Esc]"] = "", -- Basic_Training_-_Movement
 --      ["Race complexity limit reached"] = "", -- Racer, TechRacer
+--      ["Race failed!"] = "", -- A_Space_Adventure:moon02
 --      ["Racer"] = "", -- Racer
 --      ["Racer tool"] = "", -- Racer
 --      ["Race"] = "", -- TrophyRace
@@ -1757,23 +1725,19 @@
 --      ["Replenishment: Weapons are restocked on turn start of a new hog"] = "", -- Highlander
 --      ["Repositioning Mode"] = "", -- HedgeEditor
 --      ["REPOSITIONING MODE"] = "", -- HedgeEditor
---      ["rescues"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Rescue the imprisoned PAotH team and get the fuel!"] = "", -- A_Space_Adventure:moon01
 --      ["Respawner"] = "", -- Construction_Mode
 --      ["Respawner: Resurrects dead hogs."] = "", -- Construction_Mode
 --      ["Resurrector"] = "", -- Construction_Mode
 --      ["Retract/Extend rope: [Up]/[Down]"] = "", -- Basic_Training_-_Rope
 --      ["- Return the enemy flag to your base to score"] = "", -- Capture_the_Flag
---      [" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = "",
 --      ["Return to Leaks A Lot!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Return to the mission menu by pressing the \"Go back\" button."] = "", -- A_Space_Adventure:cosmos
 --      ["Return to the Surface"] = "", -- A_Space_Adventure:fruit02
 --      ["Return to the training menu by pressing the “Go back” button."] = "", -- Basic_Training_-_Movement
---      ["Rhombus"] = "", -- Basic_Training_-_Movement
 --      ["Rider"] = "", -- portal
 --      ["Rifleman"] = "", -- Battalion
 --      ["Righteous Beard"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:queen, A_Classic_Fairytale:united
---      ["Right Tong"] = "", -- Bazooka_Battlefield
 --      ["Ripe"] = "", -- 
 --      ["Rise the water if nobody else is in the circle and deal 6 damage to all enemy hogs."] = "", -- Continental_supplies
 --      ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01
@@ -1782,8 +1746,8 @@
 --      ["Roof"] = "", -- WxW
 --      ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Rope Master"] = "", -- Basic_Training_-_Rope
---      ["Roper"] = "", -- SpeedShoppa
 --      ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
+--      ["Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Rope Team"] = "", -- Basic_Training_-_Rope
 --      ["Rope Training"] = "", -- Basic_Training_-_Rope
 --      ["Rope Weapons"] = "", -- Basic_Training_-_Rope
@@ -1797,7 +1761,6 @@
 --      ["Round limit:"] = "", -- TechRacer
 --      ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer
 --      ["Round's slowest lap: %.3fs by %s"] = "", -- TrophyRace
---      ["Rounds until Sudden Death: %d"] = "", -- Battalion
 --      ["RS1"] = "", -- A_Space_Adventure:fruit03
 --      ["RS2"] = "", -- A_Space_Adventure:fruit03
 --      ["Rubber"] = "", -- Construction_Mode, HedgeEditor
@@ -1823,10 +1786,17 @@
 --      ["Salvation was one step closer now..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Sam"] = "", -- A_Space_Adventure:cosmos
 --      ["Sandals?! I thought you left your ring!"] = "", -- A_Classic_Fairytale:queen
+--      ["%s and GB"] = "", -- A_Space_Adventure:fruit02
 --      ["%s and %s enter the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sandstorm"] = "", -- A_Space_Adventure:desert01
 --      ["Sandy"] = "", -- A_Space_Adventure:desert01
---      ["Save as many hapless hogs as possible!"] = "",
+--      ["%s arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
+--      ["Save as many hogs as possible!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey
 --      ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow
 --      ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor
@@ -1838,9 +1808,9 @@
 --      ["Scallywag"] = "", -- 
 --      ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab
 --      ["Scenario"] = "", -- Big_Armory, portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape
---      ["Scenario failed!"] = "", -- SimpleMission
 --      ["Scientist"] = "", -- Battalion
 --      ["%s climbed home in %d seconds!"] = "", -- ClimbHome
+--      ["%s (contd.)"] = "", -- A_Classic_Fairytale:epil
 --      ["Score: %d"] = "", -- Space_Invasion
 --      ["Score goal: %d"] = "", -- Control
 --      ["Score graph"] = "", -- Mutant, Space_Invasion
@@ -1850,6 +1820,7 @@
 --      ["Scores"] = "", -- Mutant
 --      ["Scores:"] = "", -- Mutant
 --      ["Scoring: "] = "", -- Mutant
+--      ["%s couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
 --      ["Script parameter examples:"] = "", -- Gravity
 --      ["%s (+%d)"] = "", -- Battalion
 --      ["%s: %d"] = "", -- Capture_the_Flag, Control
@@ -1862,10 +1833,9 @@
 --      ["%s died … and lives again!"] = "", -- Construction_Mode
 --      ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome
 --      ["%s, %d sec"] = "", -- Continental_supplies
---      ["Search for the device with the help of the other hedgehogs "] = "", -- A_Space_Adventure:fruit02
+--      ["Search for the device with the help of the other hedgehogs."] = "", -- A_Space_Adventure:fruit02
 --      ["Searching in the dust"] = "", -- A_Space_Adventure:desert01
 --      ["Searching the stars!"] = "", -- A_Space_Adventure:cosmos
---      ["seconds"] = "", -- ClimbHome
 --      ["Seduction"] = "", -- Continental_supplies
 --      ["Seems like every time you take a \"walk\", the enemy finds us!"] = "", -- A_Classic_Fairytale:backstab
 --      ["See that crate farther on the right?"] = "", -- A_Classic_Fairytale:first_blood
@@ -1892,6 +1862,7 @@
 --      ["Select your continent with [Up]/[Down] or by selecting a representative weapon."] = "", -- Continental_supplies
 --      ["%s enters the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sergey"] = "", -- 
+--      ["%s escaped successfully!"] = "", -- A_Space_Adventure:fruit01
 --      ["Set bounciness: [Left Shift] + [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set detonation timer: [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set Health: [Left Click]"] = "", -- HedgeEditor
@@ -1915,10 +1886,12 @@
 --      ["%s has been killed before taking enough damage first."] = "", -- SimpleMission
 --      ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has been rescued from death"] = "", -- Construction_Mode
+--      ["%s has dropped the flag!"] = "", -- CTF_Blizzard
 --      ["%s has fallen victim to gravity."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has mutated! +2 points"] = "", -- Mutant
 --      ["%s has passed the best height of %s!"] = "", -- ClimbHome
 --      ["%s has scored!"] = "", -- Capture_the_Flag
+--      ["%s has to refuel the saucer."] = "", -- A_Space_Adventure:moon01
 --      ["%s hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil
 --      ["sheepluva"] = "", -- 
@@ -1935,8 +1908,6 @@
 --      ["Shinobi"] = "", -- 
 --      ["%s hit the ground."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Shoppa Love"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
---      ["Shoppa Union"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes, Challenge_-_Speed_Shoppa_-_ShoppaKing
---      ["Shoppers"] = "", -- SpeedShoppa
 --      ["Shotgun"] = "", -- Continental_supplies
 --      ["Sigh."] = "", -- A_Classic_Fairytale:epil
 --      ["Silly"] = "",
@@ -1949,11 +1920,11 @@
 --      ["%s is now as poor as a church mouse"] = "", -- Construction_Mode
 --      ["%s is now a zombie hedgehog"] = "", -- Construction_Mode
 --      ["%s is suddenly low on ammo"] = "", -- Construction_Mode
---      ["Skip your turn to try again."] = "", -- Basic_Training_-_Rope
 --      ["Skulls"] = "", -- Bazooka_Battlefield
 --      ["Slimer"] = "", -- 
 --      ["Slippery"] = "", -- A_Classic_Fairytale:journey
 --      ["%s lost all the weapons"] = "", -- Construction_Mode
+--      ["%s lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
 --      ["Slot %d: %s"] = "", -- Frenzy
 --      ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy
 --      ["Slowpoke"] = "", -- 
@@ -1967,6 +1938,7 @@
 --      ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smugglers"] = "", -- A_Space_Adventure:desert01
+--      ["%s must collect the final crates."] = "", -- A_Space_Adventure:fruit02
 --      ["%s must skip this turn for rule violation."] = "", -- WxW
 --      ["Sneaks"] = "", -- Bazooka_Battlefield
 --      ["%s never got the ninja diploma."] = "", -- ClimbHome
@@ -1975,10 +1947,8 @@
 --      ["Sniper"] = "", -- HedgeEditor, The_Specialists
 --      ["Sniper Rifle"] = "", -- Continental_supplies
 --      ["Sniper Training"] = "",
---      ["Sniperz"] = "",
 --      ["So, as promised I have brought you where I think that the device you are looking for is hidden."] = "", -- A_Space_Adventure:fruit02
 --      ["So far, you had infinite ropes, but in the|real world, ropes are usually limited."] = "", -- Basic_Training_-_Rope
---      ["So Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["So, I believe that it's a good place to start."] = "", -- A_Space_Adventure:desert01
 --      ["So, I kindly ask for your help."] = "", -- A_Space_Adventure:fruit01
@@ -1988,11 +1958,12 @@
 --      ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03
 --      ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen
 --      ["Some weapons can be dropped from the rope."] = "", -- Basic_Training_-_Rope
---      ["Somewhere else on the planet of fruits, Captain Lime helps Hog Solo"] = "", -- A_Space_Adventure:fruit02
---      ["Somewhere else on the planet of fruits Hog Solo gets closer to the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, Captain Lime helps %s"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, %s gets closer to the device"] = "", -- A_Space_Adventure:fruit02
 --      ["Somewhere on the Planet of Fruits a terrible war is about to begin ..."] = "", -- A_Space_Adventure:fruit01
 --      ["Somewhere on the uninhabitable Death Planet ..."] = "", -- A_Space_Adventure:death01
 --      ["So, now I got the last part and I have your friends captured."] = "", -- A_Space_Adventure:death01
+--      ["So, %s, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So the princess was never heard of again ..."] = "", -- A_Classic_Fairytale:family
 --      ["So, uhmm, how did you manage to teleport them so far?"] = "", -- A_Classic_Fairytale:epil
 --      ["Sour"] = "", -- 
@@ -2093,8 +2064,6 @@
 --      ["Structure Placement Mode"] = "", -- Construction_Mode
 --      ["Structure Placer"] = "", -- Construction_Mode
 --      ["Stupid, stupid Hogerians!"] = "", -- A_Space_Adventure:final
---      ["Subject 1"] = "", -- portal
---      ["Subjects"] = "", -- portal
 --      ["Subtract %d"] = "", -- HedgeEditor
 --      ["--- Sudden Death ---"] = "", -- Battalion
 --      ["Summer Squash"] = "", -- A_Space_Adventure:fruit01
@@ -2111,7 +2080,7 @@
 --      ["Surfer! +15 points!"] = "", -- Space_Invasion
 --      ["Surfer!"] = "", -- WxW
 --      ["Surprise supplies: Get 1-3 random weapons each turn."] = "", -- Continental_supplies
---      ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:shadow
+--      ["Survive!"] = "", -- A_Classic_Fairytale:shadow
 --      ["%s violated the “All But Last” rule and will be penalized."] = "", -- WxW
 --      ["%s violated the “Kill The Leader” rule and will be penalized."] = "", -- WxW
 --      ["Swap place with a random enemy in the circle."] = "", -- Continental_supplies
@@ -2130,6 +2099,7 @@
 --      ["%s! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
 --      ["Swing, Leaks A Lot, on the wings of the wind!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Swing: [Left]/[Right]"] = "", -- Basic_Training_-_Rope
+--      ["%s wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome
 --      ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer
 --      ["switch"] = "", -- Continental_supplies
@@ -2143,6 +2113,7 @@
 --      ["Switch Hog"] = "", -- Construction_Mode
 --      ["Switch: Select weapon special"] = "", -- Continental_supplies
 --      ["Switch: Toggle crate radar"] = "", -- WxW
+--      ["%s won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Swords"] = "", -- Bazooka_Battlefield
 --      ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon
 --      ["%s, you may choose the rules."] = "", -- WxW
@@ -2151,6 +2122,8 @@
 --      ["Tails"] = "", -- 
 --      ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Tall Potato"] = "", -- A_Space_Adventure:fruit01
+--      ["Tap [Pause] to see the mission texts"] = "", -- Basic_Training_-_Movement
+--      ["Tap the “rotating arrow” button on the left|until you have selected Cappy, the hedgehog with the cap!"] = "", -- Basic_Training_-_Movement
 --      ["Target"] = "", -- HedgeEditor
 --      ["Target Placement Mode"] = "", -- Construction_Mode
 --      ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor
@@ -2166,15 +2139,18 @@
 --      ["Tatters"] = "", -- 
 --      ["Team %d: "] = "",
 --      ["Team %d"] = "", -- SimpleMission
+--      ["Team highscore: %d"] = "", -- Utils
 --      ["Team Identity Mode"] = "", -- HedgeEditor
 --      ["TEAM IDENTITY MODE"] = "", -- HedgeEditor
---      ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
+--      ["Team lowscore: %d"] = "", -- Utils
 --      ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion
+--      ["Team's best time: %.3fs"] = "", -- Utils
 --      ["Team Scores:"] = "", -- Control
 --      ["Team scores:"] = "", -- Space_Invasion
+--      ["Team's longest time: %.3fs"] = "", -- Utils
+--      ["Team's top accuracy: %d%"] = "", -- Utils
 --      ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2
 --      ["Teamwork"] = "", -- User_Mission_-_Teamwork
---      ["Team Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
 --      ["TechRacer"] = "", -- TechRacer
 --      ["Teleporation Node"] = "", -- Construction_Mode
 --      ["Teleportation Mode"] = "", -- Construction_Mode
@@ -2266,11 +2242,12 @@
 --      ["The forgotten continent"] = "", -- Continental_supplies
 --      ["The giant umbrella from the last crate should help break the fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Great Escape"] = "", -- User_Mission_-_The_Great_Escape
---      ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01
+--      ["- The green target must survive"] = "", -- HedgeEditor
+--      ["- The green targets must survive"] = "", -- HedgeEditor
 --      ["The guardian"] = "", -- A_Classic_Fairytale:shadow
 --      ["The hardships of the war turned %s (%s) into a killing machine: %d invaders destroyed in one round!"] = "", -- Space_Invasion
+--      ["The health of your current hedgehog|is shown at the top right corner."] = "", -- Basic_Training_-_Movement
 --      ["The hedgehog with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant
---      ["The Hogies"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["The Hospital"] = "", -- 
 --      ["The Individualist"] = "", -- A_Classic_Fairytale:shadow
 --      ["Their buildings were very primitive back then, even for an uncivilised island."] = "", -- A_Classic_Fairytale:united
@@ -2288,7 +2265,6 @@
 --      ["The Mutant has super-weapons and a lot of health."] = "", -- Mutant
 --      ["The Mutant loses health quickly, but gains health by killing."] = "", -- Mutant
 --      ["The Mutant loses health quickly if he doesn't keep scoring kills."] = "", -- Mutant
---      ["The Nameless One"] = "",
 --      ["The Navy greets %s for managing to get in a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["The next 4 times you play the \"The last encounter\" mission you'll get 20 more hit points and a laser sight."] = "", -- A_Space_Adventure:death02
 --      ["The next crate is an utility crate."] = "", -- Basic_Training_-_Movement
@@ -2302,6 +2278,7 @@
 --      ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil
 --      ["The oppression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
 --      ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
+--      ["The other hog has died, he should have survived!"] = "", -- A_Space_Adventure:moon02
 --      ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Police"] = "", -- 
 --      ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -2326,7 +2303,7 @@
 --      ["The Showdown"] = "", -- A_Classic_Fairytale:shadow
 --      ["The Slaughter"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:first_blood
 --      ["The Society of Perfectionists greets %s (%s): No misses and %d hits in its best round."] = "", -- Space_Invasion
---      ["THE SPECIALISTS"] = "",
+--      ["The Specialists: Each hedgehog starts with its own weapon set"] = "", -- The_Specialists
 --      ["The spinning arrows above your hedgehog show|which hedgehog is selected right now."] = "", -- Basic_Training_-_Movement
 --      ["The spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
@@ -2374,7 +2351,6 @@
 --      ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["This also increases the effectiveness of Medicine."] = "", -- Continental_supplies
 --      ["This game wasn’t really exciting."] = "", -- Space_Invasion
---      ["This Hog Solo is so naive! When he returns I'll shoot him and keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This is a new personal best, congratulations!"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert02, A_Space_Adventure:fruit03
 --      ["This is a new personal best time, congratulations!"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["This is Cappy."] = "", -- Basic_Training_-_Movement
@@ -2392,6 +2368,7 @@
 --      ["This rain is really something..."] = "",
 --      ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome
 --      ["This seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01
+--      ["This %s is so naive! I'm going to shoot this fool so I can keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This was an awesome performance! But this challenge can be finished with even just one RC plane. Can you figure out how?"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["This will be fun!"] = "", -- A_Classic_Fairytale:enemy
 --      ["This will be useful when I need a new platform or if I want to rise."] = "", -- portal
@@ -2432,11 +2409,11 @@
 --      ["To begin with the training, hit the attack key!"] = "", -- Basic_Training_-_Movement
 --      ["To begin with the training, select the bazooka from the ammo menu!"] = "", -- Basic_Training_-_Bazooka
 --      ["To begin with the training, select the grenade from the ammo menu!"] = "", -- Basic_Training_-_Grenade
+--      ["To begin with the training, tap the attack button!"] = "", -- Basic_Training_-_Movement
 --      ["To finish hedgehog selection, just do anything|with him, like walking."] = "", -- Basic_Training_-_Movement
 --      ["To get over the next obstacles, keep some distance from the wall before you back jump."] = "", -- Basic_Training_-_Movement
 --      ["To get over the water, you have to do multiple|rope shots and swings."] = "", -- Basic_Training_-_Rope
 --      ["Toggle Editing Weapons and Tools: [Precise]+[2]"] = "", -- HedgeEditor
---      ["Toggle Gear Information: [Precise]+[3]"] = "", -- HedgeEditor
 --      ["Toggle Help: [Precise]+[1]"] = "", -- HedgeEditor
 --      ["Toggle Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Toggle Shield: [Long jump]"] = "", -- Space_Invasion
@@ -2446,14 +2423,14 @@
 --      ["Too bad! Then you should really leave!"] = "", -- A_Space_Adventure:fruit01
 --      ["Too slow! Try again ..."] = "", -- A_Space_Adventure:moon02
 --      ["Top-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"] = "", -- A_Classic_Fairytale:shadow
 --      ["To reach higher ground, walk to a ledge, look to the left, then do a back jump."] = "", -- Basic_Training_-_Movement
 --      ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey
 --      ["To the caves..."] = "", -- A_Classic_Fairytale:united
 --      ["Touch all waypoints as fast as you can!"] = "", -- Racer
---      ["To win the game, Hog Solo has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
+--      ["- Touch the sparkles near your base to teleport"] = "", -- CTF_Blizzard
+--      ["To win the game, %s has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
 --      ["To win the game you had to collect the 2 crates with no specific order."] = "", -- A_Space_Adventure:desert01
---      ["To win the game you have to eliminate all your enemies."] = "", -- A_Space_Adventure:death01
+--      ["To win the game you have to eliminate Professor Hogevil."] = "", -- A_Space_Adventure:death01
 --      ["To win the game you have to find the right crate."] = "", -- A_Space_Adventure:desert01
 --      ["To win the game you have to go next to Thanta."] = "", -- A_Space_Adventure:ice01
 --      ["To win the game you have to go to the surface."] = "", -- A_Space_Adventure:desert02
@@ -2461,13 +2438,10 @@
 --      ["To win the game you have to stand next to Thanta."] = "", -- A_Space_Adventure:ice01
 --      ["Toxic Team"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Track completed!"] = "", -- Racer, TechRacer
---      ["Trainee"] = "", -- TargetPractice
 --      ["Training"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Training complete!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Training Team"] = "", -- TargetPractice
 --      ["Traitors"] = "", -- A_Classic_Fairytale:epil
 --      ["Traitors don't get to shout around here!"] = "", -- A_Classic_Fairytale:epil
---      ["Trapped"] = "", -- Basic_Training_-_Movement
 --      ["Trapper"] = "", -- HedgeEditor
 --      ["Travel carefully as your fuel is limited"] = "", -- A_Space_Adventure:cosmos
 --      ["Travel to all the neighbor planets and collect all the pieces"] = "", -- A_Space_Adventure:cosmos
@@ -2484,7 +2458,6 @@
 --      ["Try to land softly, as you can still take fall damage!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Try to protect the chief! You won't lose if he dies, but it is advised that he survives."] = "", -- A_Classic_Fairytale:united
 --      ["Try to reach and destroy the next target quickly."] = "", -- Basic_Training_-_Rope
---      ["T_T"] = "",
 --      ["Tumbler"] = "", -- Tumbler
 --      ["Turn around: [Left Shift] + [Left]/[Right]"] = "", -- Basic_Training_-_Movement
 --      ["Turning Around"] = "", -- Basic_Training_-_Movement
@@ -2503,7 +2476,6 @@
 --      ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy
 --      ["Ukemi"] = "", -- 
 --      ["Ultra kill!"] = "", -- Mutant
---      ["Ultrasoldier"] = "", -- Big_Armory
 --      ["unC0Rr"] = "", -- 
 --      ["Under Construction"] = "", -- A_Classic_Fairytale:shadow
 --      ["Under normal circumstances we could easily defeat them but we have kindly sent most of our men to the Kingdom of Sand to help with the annual dusting of the king's palace."] = "", -- A_Space_Adventure:fruit01
@@ -2527,7 +2499,6 @@
 --      ["Unit 883"] = "", -- 
 --      ["United We Stand"] = "", -- A_Classic_Fairytale:united
 --      ["Unlike bazookas, grenades are not influenced by wind."] = "", -- Basic_Training_-_Grenade
---      ["Unlimited Attacks"] = "",
 --      ["Unlimited Attacks: Attacks don't end your turn"] = "", -- User_Mission_-_Diver, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree
 --      ["Unlucky Sods"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Unstoppable!"] = "",
@@ -2543,13 +2514,14 @@
 --      ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["User Challenge"] = "",
 --      ["!"] = "", -- User_Mission_-_Dangerous_Ducklings
+--      ["User Mission"] = "", -- HedgeEditor
 --      ["Use the attack key twice to change the flying saucer while being in air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the attack key twice to change the flying saucer while floating in mid-air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the bazooka and the flying saucer to get the freezer."] = "", -- A_Space_Adventure:ice01
 --      ["Use the flying saucer from the crate to fly to the moon."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly the other planets."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly to the other planets."] = "", -- A_Space_Adventure:cosmos
---      ["Use the parachute ([Space] while in air) to get the next crate"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Use the parachute to get the next crate."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Use the portal gun to get to the next crate, then use the new gun to get to the final destination!|"] = "", -- A_Classic_Fairytale:dragon
 --      ["Use the RC plane and destroy the all the targets."] = "", -- A_Space_Adventure:desert03
 --      ["Use the rope in order to catch the blue hedgehog"] = "", -- A_Space_Adventure:moon02
@@ -2583,7 +2555,6 @@
 --      ["Victory Condition: Collect"] = "", -- HedgeEditor
 --      ["Victory Condition: Destroy"] = "", -- HedgeEditor
 --      ["Victory for %s!"] = "", -- Capture_the_Flag
---      ["Victory for the "] = "", -- CTF_Blizzard, Capture_the_Flag
 --      ["Violence is not the answer to your problems!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos
 --      ["Vladimir"] = "", -- 
@@ -2602,9 +2573,6 @@
 --      ["Walls left: %d"] = "", -- WxW
 --      ["Wall to wall"] = "", -- WxW
 --      ["Waluigi"] = "", -- 
---      ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Wannabe Ropers"] = "", -- Basic_Training_-_Rope
---      ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Wario"] = "", -- 
 --      ["Warming Up"] = "", -- Basic_Training_-_Grenade
 --      ["Warning: Fire cake detected"] = "", -- ClimbHome
@@ -2633,7 +2601,6 @@
 --      ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion
 --      ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion
 --      ["Weapon specials: Some weapons have special modes (see weapon description)."] = "", -- Continental_supplies
---      ["Weapons Reset"] = "",
 --      ["Weapons reset: The weapons are reset after each turn."] = "", -- WxW
 --      ["We are indeed."] = "", -- A_Classic_Fairytale:backstab
 --      ["We can't defeat them!"] = "", -- A_Classic_Fairytale:shadow
@@ -2650,9 +2617,9 @@
 --      ["We have to hurry! Are you armed?"] = "", -- A_Space_Adventure:moon01
 --      ["We have to protect the village!"] = "", -- A_Classic_Fairytale:united
 --      ["We have to unite and defeat those cylergs!"] = "", -- A_Classic_Fairytale:enemy
---      ["Welcome Hog Solo, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome home! Please take a seat"] = "", -- ClimbHome
 --      ["Welcome, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey
+--      ["Welcome, %s, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome to the Death Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
@@ -2819,16 +2786,16 @@
 --      ["You can’t open a portal on the blue surface."] = "", -- portal
 --      ["You can use the other 2 hogs to assist you."] = "", -- A_Space_Adventure:fruit02
 --      ["You can use the rope to reach new places."] = "", -- Basic_Training_-_Rope
---      ["You choose well, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You choose well, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You completed the mission in %.3f seconds."] = "", -- A_Space_Adventure:ice02
 --      ["You completed the mission in %d rounds."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03
---      ["You couldn't have come to a worse time, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You couldn't have come to a worse time, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You couldn't possibly believe that after refusing my offer I'd just let you go!"] = "", -- A_Classic_Fairytale:journey
 --      ["You'd almost swear the water was rising!"] = "",
 --      ["You'd better watch your steps..."] = "", -- A_Classic_Fairytale:journey
 --      ["You defended yourself against Captain Lime."] = "", -- A_Space_Adventure:fruit02
---      ["You defended yourself against the Fruit Assassins."] = "", -- A_Space_Adventure:fruit02
---      ["You did great, Hog Solo! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
+--      ["You defended yourself against %s."] = "", -- A_Space_Adventure:fruit02
+--      ["You did great, %s! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
 --      ["You did not make it in time, try again!"] = "", -- Basic_Training_-_Rope
 --      ["You don't deserve my sacrifice!"] = "", -- A_Classic_Fairytale:queen
 --      ["You drove Professor Hogevil away."] = "", -- A_Space_Adventure:moon01
@@ -2844,12 +2811,12 @@
 --      ["You got me!"] = "", -- A_Space_Adventure:moon02
 --      ["You had %.1fs remaining on the clock (+%d points)."] = "", -- TargetPractice
 --      ["You had %.2fs remaining on the clock (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle
---      ["You had %d additional flying saucers left."] = "", -- A_Space_Adventure:ice02
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: you might want to use some mines..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: You might want to use some mines ..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01
 --      ["You have activated Switch Hedgehog!"] = "", -- Basic_Training_-_Movement
 --      ["You have beaten the challenge!"] = "", -- ClimbHome
+--      ["You have beaten the team record, congratulations!"] = "", -- Utils
 --      ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab
 --      ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united
 --      ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01
@@ -2868,7 +2835,6 @@
 --      ["You have eliminated all visible enemy hedgehogs!"] = "", -- A_Space_Adventure:fruit01
 --      ["You have eliminated Professor Hogevil."] = "", -- A_Space_Adventure:moon01
 --      ["You have eliminated the evil minions."] = "", -- A_Space_Adventure:moon01
---      ["You have eliminated the whole evil team. You're pretty tough!"] = "", -- A_Space_Adventure:moon01
 --      ["You have escaped successfully."] = "", -- A_Space_Adventure:desert02
 --      ["You have failed to complete your task, young one!"] = "", -- A_Classic_Fairytale:journey
 --      ["You have failed to save the tribe!"] = "", -- A_Classic_Fairytale:backstab
@@ -2922,6 +2888,7 @@
 --      ["You have to travel again"] = "", -- A_Space_Adventure:cosmos
 --      ["You have to try again!"] = "", -- A_Space_Adventure:cosmos
 --      ["You have triggered the secret Do-Not-Rope-to-the-Moon Defense System."] = "", -- A_Space_Adventure:cosmos
+--      ["You have unlocked the target radar!"] = "", -- TargetPractice
 --      ["You have used %d flying saucers."] = "", -- A_Space_Adventure:ice02
 --      ["You have used %d RC planes."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["You have used only 1 RC plane. Outstanding!"] = "", -- User_Mission_-_RCPlane_Challenge
@@ -2940,10 +2907,9 @@
 --      ["You'll have only 2 watermelon bombs during the game."] = "", -- A_Space_Adventure:fruit03
 --      ["You'll have only one RC plane at the start of the mission."] = "", -- A_Space_Adventure:desert03
 --      ["You'll have to eliminate Captain Lime at the end."] = "", -- A_Space_Adventure:fruit02
---      ["You'll have to eliminate the Fruit Assassins at the end."] = "", -- A_Space_Adventure:fruit02
+--      ["You'll have to eliminate %s at the end."] = "", -- A_Space_Adventure:fruit02
 --      ["You'll lose if you die or if your time is up."] = "", -- A_Space_Adventure:moon02
 --      ["You'll see what I mean!"] = "", -- A_Classic_Fairytale:enemy
---      ["You lose!"] = "", -- Basic_Training_-_Sniper_Rifle, Big_Armory, Basic_Training_-_Bazooka, TargetPractice, ClimbHome
 --      ["You lost your target, try again!"] = "", -- TargetPractice
 --      ["You may find it handy."] = "", -- A_Space_Adventure:cosmos
 --      ["You may only attack from a rope!"] = "", -- WxW
@@ -2965,8 +2931,7 @@
 --      ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice
 --      ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice
 --      ["Your ammo is limited this time."] = "", -- Basic_Training_-_Bazooka
---      ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy
---      ["Your deaths will be avenged, Natives!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Your deaths will be avenged, %s!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Your death will not be in vain, Dense Cloud!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You're a coward!"] = "", -- A_Classic_Fairytale:queen
 --      ["You're...alive!? But we saw you die!"] = "", -- A_Classic_Fairytale:backstab
@@ -2994,21 +2959,21 @@
 --      ["Your next task is to collect some crates by using the rope!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Your personal best time so far: %.3f seconds"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["Your rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["You saved %d of 8 Hapless Hogs."] = "", -- User_Mission_-_That_Sinking_Feeling
+--      ["Your rope is gone! Try again!"] = "", -- Basic_Training_-_Rope
+--      ["You saved %d of 8 hegehogs."] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen
 --      ["You see the wind strength at the bottom right corner."] = "", -- Basic_Training_-_Bazooka
+--      ["You see the wind strength at the top."] = "", -- Basic_Training_-_Bazooka
 --      ["You should have known that we don't rely on meatbags!"] = "", -- A_Classic_Fairytale:queen
 --      ["You should know this more than anyone, Leaks!"] = "", -- A_Classic_Fairytale:queen
 --      ["You speak great truth, Hannibal. Here, take a sip!"] = "", -- A_Classic_Fairytale:epil
 --      ["You've been assaulting us, we have been just defending ourselves!"] = "", -- A_Classic_Fairytale:enemy
---      ["You've failed. Try again."] = "",
 --      ["You've reached the goal!| |Time: "] = "",
 --      ["You will be avenged!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You will fail if you run out of ammo and there are still targets available."] = "", -- A_Space_Adventure:desert03
 --      ["You will gain some extra ammo from the crates the next time you play the \"Getting to the device\" mission."] = "", -- A_Space_Adventure:fruit03
 --      ["You will play every 3 turns."] = "", -- A_Space_Adventure:fruit01
 --      ["- You will recieve 2-4 weapons on each kill! (Even on own hogs)"] = "", -- Continental_supplies
---      ["You win!"] = "", -- Big_Armory
 --      ["You won't believe what happened to me!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Yuck! I bet they'll keep worshipping her even after I save the village!"] = "", -- A_Classic_Fairytale:family
 --      ["Yumme Gunpowder"] = "", -- 
@@ -3016,6 +2981,7 @@
 --      ["Zombie"] = "", -- 
 --      ["Zombi"] = "", -- portal
 --      ["'Zooka Team"] = "",
---      ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
+--      ["Zoom: [Pinch] with 2 fingers"] = "", -- Basic_Training_-_Movement
+--      ["Zoom: [Rotate mouse wheel]"] = "", -- Basic_Training_-_Movement
 --      ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen
 }
--- a/share/hedgewars/Data/Locale/lt.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/lt.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -26,7 +26,6 @@
 --      ["Above-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Accuracy Bonus! +15 points"] = "", -- Space_Invasion
 --      ["Accuracy bonus: +%d points"] = "", -- Basic_Training_-_Sniper_Rifle
---      ["Ace"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge
 --      ["Achievement gotten: %s"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_That_Sinking_Feeling, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, Basic_Training_-_Rope, Tumbler
 --      ["A Classic Fairytale"] = "", -- A_Classic_Fairytale:first_blood
 --      ["A crate critical to this mission has been destroyed."] = "", -- SimpleMission
@@ -45,7 +44,6 @@
 --      ["After you left the moon, my other loyal minions came and resurrected me so I could complete my master plan."] = "", -- A_Space_Adventure:death01
 --      ["Again with the 'cannibals' thing!"] = "", -- A_Classic_Fairytale:enemy
 --      ["A Hedgewars minigame"] = "", -- Capture_the_Flag
-   ["a Hedgewars mini-game"] = "Eþiu karu mini þaidimas", -- Space_Invasion, The_Specialists
 --      ["A Hedgewars mini-game"] = "", -- Racer, Space_Invasion, TechRacer, Tumbler
 --      ["A Hedgewars tag game"] = "", -- Mutant
 --      ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome
@@ -141,13 +139,14 @@
 --      ["As you've seen, the dropped grenade roughly fell into your flying direction."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Athlete"] = "", -- Battalion
 --      ["Attack: Activate"] = "", -- Racer
---      ["Attack Captain Lime before he attacks back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack Captain Lime before he attacks back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack From Rope: %s"] = "", -- WxW
 --      ["Attack From Rope: You may only attack from a rope."] = "", -- WxW
 --      ["Attack rule: %s"] = "", -- WxW
 --      ["Attack: Select this continent"] = "", -- Continental_supplies
 --      ["Attack: [Space]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
---      ["Attack the assassins before they attack back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack: Tap the [Bomb]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
+--      ["Attack the assassins before they attack back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack: Throw ball"] = "", -- Knockball
 --      ["At the end of the game your health was %d."] = "", -- A_Space_Adventure:ice01
 --      ["At the start of the game each enemy hog has only the weapon that he is named after."] = "", -- A_Space_Adventure:death02
@@ -155,16 +154,18 @@
 --      ["Available weapon specials:"] = "", -- Continental_supplies
 --      ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion
---      ["Avoid the mines!"] = "", -- Basic_Training_-_Rope
 --      ["Axes"] = "", -- Bazooka_Battlefield
 --      ["Aye! Fellow! Let me exit this chamber of doom!"] = "", -- A_Classic_Fairytale:epil
 --      ["Back Breaker"] = "", -- A_Classic_Fairytale:backstab
 --      ["Back in the village, after telling the villagers about the threat..."] = "", -- A_Classic_Fairytale:united
 --      ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil
 --      ["Back Jump: [Backspace] ×2"] = "", -- Basic_Training_-_Movement
+--      ["Back Jump: Double-tap the [Curvy Arrow]"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (1/2)"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (2/2)"] = "", -- Basic_Training_-_Movement
 --      ["Backstab"] = "", -- A_Classic_Fairytale:backstab
+--      ["Backwards jump: Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Backwards jump: Tap the [Curvy Arrow] twice"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Bacon"] = "", -- 
 --      ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Badmad"] = "", -- portal
@@ -197,7 +198,6 @@
 --      ["Bazooka Battlefield"] = "", -- Bazooka_Battlefield
 --      ["Bazooka Master"] = "", -- Basic_Training_-_Bazooka
 --      ["Bazookas are influenced by wind."] = "", -- Basic_Training_-_Bazooka
---      ["Bazooka Team"] = "", -- Basic_Training_-_Bazooka
    ["Bazooka Training"] = "Bazukos Treniruotë",
 --      ["Bearded Beast"] = "", -- 
 --      ["Be careful, the future of Hogera is in your hands!"] = "", -- A_Space_Adventure:cosmos
@@ -231,7 +231,6 @@
 --      ["Bloodpie"] = "", -- A_Classic_Fairytale:backstab
 --      ["Bloodrocutor"] = "", -- A_Classic_Fairytale:shadow
 --      ["Bloodsucker"] = "", -- A_Classic_Fairytale:shadow
-   ["Bloody Rookies"] = "Prakeikti Eiliniai", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 --      ["Blue"] = "", -- 
 --      ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Bob"] = "", -- A_Space_Adventure:cosmos
@@ -314,7 +313,9 @@
 --      ["Challenge objectives"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit03, A_Space_Adventure:moon02
 --      ["Challenge over!"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa, ClimbHome
+--      ["Change bounciness: Tap [B]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Content: [Left], [Right]"] = "", -- HedgeEditor
+--      ["Change detonation timer: Tap the [Clock]"] = "", -- Basic_Training_-_Grenade, A_Classic_Fairytale:shadow
 --      ["Change direction: [Left]/[Right]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Change Health: [Left], [Right]"] = "", -- HedgeEditor
@@ -334,6 +335,8 @@
 --      ["Chicken"] = "", -- 
 --      ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01
 --      ["Chikorita"] = "", -- 
+--      ["Choose location: Left click"] = "", -- A_Classic_Fairytale:shadow
+--      ["Choose location: Tap the [Target] button, then tap on the spot you want to choose"] = "", -- A_Classic_Fairytale:shadow
 --      ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Choose your continent wisely, as your decision will be permanent."] = "", -- Continental_supplies
 --      ["Choose your side! If you want to join the strange man, walk up to him.|Otherwise, walk away from him. If you decide to att...nevermind..."] = "", -- A_Classic_Fairytale:shadow
@@ -342,7 +345,6 @@
 --      ["Cleaver"] = "", -- Construction_Mode
 --      ["Cleaver Placement Mode"] = "", -- Construction_Mode
 --      ["CLEAVER PLACEMENT MODE"] = "", -- HedgeEditor
---      ["Climber"] = "", -- ClimbHome
 --      ["Climb Home"] = "", -- ClimbHome
 --      ["Closing in"] = "", -- A_Classic_Fairytale:queen
 --      ["Clown"] = "", -- HedgeEditor
@@ -352,11 +354,13 @@
 --      ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb
 --      ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey
 --      ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey
+--      ["- Collect all the blue crates"] = "", -- HedgeEditor
 --      ["Collect all the crates, but remember, our time in this life is limited!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect or destroy all the health crates."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Collect or destroy the final crate to finish the training."] = "", -- Basic_Training_-_Flying_Saucer
+--      ["- Collect the blue crate"] = "", -- HedgeEditor
 --      ["Collect the crate and attack!"] = "", -- WxW
---      ["Collect the crate on the right.|Hint: Select the rope, [Up] or [Down] to aim, [Space] to fire, directional keys to move.|Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Collect the crate on the right."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the crates within the time limit!|If you fail, you'll have to try again."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the first crate to begin!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Collect the freezer and get the device part from Thanta."] = "", -- A_Space_Adventure:ice01
@@ -424,7 +428,6 @@
 --      ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates per turn: %d"] = "", -- WxW
---      ["crate(s)"] = "", -- SpeedShoppa
 --      ["Crazy Gravity: Gravity randomly changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity
 --      ["Crazy Runner"] = "", -- A_Space_Adventure:moon02
 --      ["Cricket Time"] = "", -- Continental_supplies
@@ -457,11 +460,10 @@
 --      ["Deals 15 damage to all enemies in the circle."] = "", -- Continental_supplies
 --      ["Deer"] = "", -- 
 --      ["Defeat all enemies!"] = "", -- portal
+--      ["Defeat!"] = "", -- HedgeEditor
 --      ["Defeat Professor Hogevil!"] = "", -- A_Space_Adventure:death01
---      ["Defeat the cannibals"] = "", -- A_Classic_Fairytale:backstab
---      ["Defeat the cannibals!|"] = "", -- A_Classic_Fairytale:united
+--      ["Defeat the cannibals!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cannibals!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Defeat the cannibals!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cyborgs!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen
 --      ["Delete Waypoint"] = "", -- HedgeEditor
@@ -482,11 +484,11 @@
 --      ["Destroyer of planes"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Destroy him, Leaks A Lot! He is responsible for the deaths of many of us!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion
+--      ["- Destroy the enemy"] = "", -- HedgeEditor
+--      ["- Destroy the red target"] = "", -- HedgeEditor
+--      ["- Destroy the red targets"] = "", -- HedgeEditor
 --      ["Destroy the targets!"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
---      ["Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
---      ["Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"] = "", -- A_Classic_Fairytale:first_blood
 --      ["+%d flamer fuel!"] = "", -- Tumbler
---      ["%d Hapless Hogs left"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["+%d health"] = "", -- Mutant
 --      ["%d-Hit Combo! +%d points!"] = "", -- Space_Invasion
 --      ["Did anyone follow you?"] = "", -- A_Classic_Fairytale:united
@@ -507,7 +509,6 @@
 --      ["Disguise as a Rockhopper Penguin"] = "", -- Continental_supplies
 --      ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies
 --      ["Displacer"] = "", -- 
---      ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Diver"] = "", -- User_Mission_-_Diver
 --      ["%d ms"] = "", -- HedgeEditor
 --      ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen
@@ -594,10 +595,8 @@
 --      ["Elderbot"] = "", -- A_Classic_Fairytale:family
 --      ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape
    ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Sunaikink Visus taikinius kol neiðseko laikas.|Ðitai misijai gausi nesibaigianèiu kulku.", --Bazooka, Shotgun, SniperRifle
---      ["Eliminate the Blue Team before the time runs out."] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Eliminate the enemy before the time runs out."] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 --      ["Eliminate the enemy hogs to win."] = "",
-   ["Eliminate the enemy specialists."] = "Sunaikink prieðus specialistus.",
 --      ["Eliminate the enemy."] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh
 --      ["Eliminate Unit 3378."] = "", -- User_Mission_-_Teamwork
 --      ["Eliminate WatchBot 4000."] = "", -- User_Mission_-_Teamwork_2
@@ -622,13 +621,14 @@
 --      ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab
 --      ["Except me, of course! I just saved a whole planet!"] = "", -- A_Space_Adventure:final
 --      ["Experienced beginner"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Explore the tunnel with the other hedgehogs and search for the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Explore the tunnel with the other hedgehogs and search for the device."] = "", -- A_Space_Adventure:fruit02
 --      ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02
 --      ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey
 --      ["Fair Wind"] = "", -- 
 --      ["Fall Damage"] = "", -- Basic_Training_-_Movement
 --      ["Fallen Angel"] = "", -- Tentacle_Terror
 --      ["Family Reunion"] = "", -- A_Classic_Fairytale:family
+--      ["Fastest escape: %d turns"] = "", -- A_Space_Adventure:desert02
 --      ["Fastest lap: %.3fs by %s"] = "", -- TrophyRace
    ["Fastest lap: "] = "Greièiausias Ratas: ",
    ["Feeble Resistance"] = "Silpnaus Atsparumo Tvirtovë",
@@ -648,11 +648,12 @@
 --      ["Final result"] = "", -- Mutant
 --      ["Final Targets"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
 --      ["Final team scores:"] = "", -- Space_Invasion
+--      ["Find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Find a way to detonate all the explosives and stay alive!"] = "", -- A_Space_Adventure:final
 --      ["Find your tribe!|Cross the lake!"] = "", -- A_Classic_Fairytale:dragon
 --      ["Finish this challenge as fast as possible to earn bonus points."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Finish waypoint placement"] = "", -- Racer
---      ["Finish your training|Hint: Animations can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Finish your training."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Finite Ropes"] = "", -- Basic_Training_-_Rope
 --      ["Fire a rocket with napalm."] = "", -- Continental_supplies
 --      ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler
@@ -680,6 +681,7 @@
 --      ["Flying Saucer Training"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Fly into space to fight off the invaders with barrels!"] = "", -- Space_Invasion
 --      ["Fly to the meteorite and detonate the explosives"] = "", -- A_Space_Adventure:cosmos
+--      ["Follow the path and destroy the next target."] = "", -- Basic_Training_-_Rope
 --      ["Forgetfulness: You will lose all your weapons each turn."] = "", -- Continental_supplies
 --      ["For the next crate, you have to do back jumps."] = "", -- Basic_Training_-_Movement
 --      ["Four Eyes"] = "", -- 
@@ -699,9 +701,7 @@
 --      ["“g=150”, where 150 is 150% of normal gravity."] = "", -- Gravity
 --      ["“g=50, g2=150, period=4000” for gravity changing|from 50 to 150 and back with period of 4000 ms."] = "", -- Gravity
 --      ["Galaxy Guardians"] = "", -- Big_Armory
-   ["Game Modifiers: "] = "Þaidimo Modifikatoriai: ",
 --      ["Game over!"] = "", -- Space_Invasion
-   ["GAME OVER!"] = "Þaidimas Baigtas!",
    ["Game Started!"] = "Þaidimas Prasidëjo!",
 --      ["Game? Was this a game to you?!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Gangsters"] = "", -- 
@@ -710,8 +710,6 @@
 --      ["Gasp! A smuggler!"] = "", -- A_Space_Adventure:desert01
 --      ["Gasp!"] = "", -- A_Space_Adventure:desert01
 --      ["Gathering fruits all day long."] = "", -- A_Classic_Fairytale:queen
---      ["Gear information hidden"] = "", -- HedgeEditor
---      ["Gear information shown"] = "", -- HedgeEditor
 --      ["Gear Placement Tool"] = "", -- HedgeEditor
 --      ["General information"] = "", -- Continental_supplies
 --      ["General information:"] = "", -- Continental_supplies
@@ -721,7 +719,7 @@
 --      ["Get Dense Cloud out of the pit!"] = "", -- A_Classic_Fairytale:journey
 --      ["Get him, Spike!"] = "", -- A_Space_Adventure:desert01
    ["Get on over there and take him out!"] = "Nueik Ten Ir Nudauþk Ji!",
---      ["Get on the head of the mole"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Get on the head of the mole."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Get past the flower."] = "", -- A_Classic_Fairytale:journey
 --      ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01
 --      ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood
@@ -759,7 +757,6 @@
    ["GO! GO! GO!"] = "Bëk! Bëk! Bëk!",
    ["Good birdy......"] = "Geras Paukðtelis......",
 --      ["Good bye!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Good Dude"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Good idea, they'll never find us there!"] = "", -- A_Classic_Fairytale:united
 --      ["Good job!"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Good job! Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -770,7 +767,7 @@
 --      ["Good so far!"] = "",
 --      ["Good to go!"] = "",
 --      ["Good! You now control Cappy."] = "", -- Basic_Training_-_Movement
---      ["Go on top of the flower"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Go on top of the flower."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Go, quick!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Gorkij"] = "", -- A_Classic_Fairytale:journey
 --      ["Go surf!"] = "", -- WxW
@@ -793,7 +790,6 @@
 --      ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow
 --      ["Green"] = "", -- 
 --      ["Green Bananas"] = "", -- A_Space_Adventure:fruit01
---      ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Green double rings also give you a new flying saucer."] = "", -- A_Space_Adventure:ice02
 --      ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01
 --      ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01
@@ -803,11 +799,8 @@
 --      ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Greetings from the Navy, %s (%s), for being a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["Greetings, %s!"] = "", -- A_Classic_Fairytale:dragon
---      ["Greg"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
---      ["Grenade Group"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard
 --      ["Grenades explode after 1 to 5 seconds (you decide)."] = "", -- Basic_Training_-_Grenade
 --      ["Grenades with high bounciness bounce a lot and behave chaotic."] = "", -- Basic_Training_-_Grenade
---      ["Grenade Team"] = "", -- Basic_Training_-_Grenade
 --      ["Grenade Training"] = "", -- Basic_Training_-_Grenade
 --      ["Grenadiers"] = "", -- Basic_Training_-_Grenade
 --      ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor
@@ -848,7 +841,6 @@
 --      ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion
 --      ["Health Modification Mode"] = "", -- HedgeEditor
 --      ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor
---      ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
 --      ["Heavenly Defense"] = "", -- Tentacle_Terror
 --      ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united
    ["Heavy"] = "Sunku",
@@ -861,6 +853,7 @@
 --      ["Hedgehog Projectile"] = "", -- Continental_supplies
 --      ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies
 --      ["Hedgehogs can not be deleted."] = "", -- HedgeEditor
+--      ["Hedgehogs left: %d"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Hedgehogs will be revived after their death."] = "", -- Mutant
 --      ["Hedgehogs will start in the first waypoint."] = "", -- Racer
 --      ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab
@@ -876,7 +869,6 @@
 --      ["Help Enabled"] = "", -- HedgeEditor
 --      ["Helpers: Each team starts with %d helper points"] = "", -- Battalion
 --      ["Helpers: Hogs will get 1 out of 2 helpers randomly each turn"] = "", -- Battalion
---      ["Help Hog Solo to find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Help me, Leaks!"] = "", -- A_Classic_Fairytale:journey
 --      ["Help me, please!!!"] = "", -- A_Classic_Fairytale:journey
 --      ["Help me, please!"] = "", -- A_Classic_Fairytale:journey
@@ -891,20 +883,20 @@
 --      ["Here you will find the current mission instructions."] = "", -- Basic_Training_-_Movement
 --      ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Heroic Wind"] = "", -- Continental_supplies
---      ["Hero Team"] = "", -- User_Mission_-_The_Great_Escape
 --      ["He's so brave..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["He was the lab assistant of Dr. Goodhogan, the inventor of the anti-gravity device."] = "", -- A_Space_Adventure:moon02
 --      ["He won't be selling us out anymore!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey, don't forget us! We still need to climb up!"] = "", -- A_Classic_Fairytale:family
 --      ["Hey, guys!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey guys!"] = "", -- A_Classic_Fairytale:united
---      ["Hey, Hog Solo! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey! I was supposed to collect it!"] = "", -- A_Space_Adventure:fruit02
+--      ["Hey, %s! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey, %s! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey
 --      ["Hidden"] = "", -- portal
 --      ["High Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["High Jump: [Backspace]"] = "", -- Basic_Training_-_Movement
+--      ["High Jump: Tap the [Curvy Arrow] shortly"] = "", -- Basic_Training_-_Movement
 --      ["--- Highland ---"] = "", -- Battalion
 --      ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander
 --      ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion
@@ -915,20 +907,24 @@
 --      ["Hill Guard"] = "", -- Bazooka_Battlefield
 --      ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01
 --      ["--- Hint ---"] = "", -- Battalion
---      ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
 --      ["Hint: Drilling holes should solve everything."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: Hold down [M] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: If this mission panel disappears, you can|see it again by hitting the Pause or Quit key."] = "", -- Basic_Training_-_Movement
 --      ["Hint: It might be a good idea to place a girder before starting to drill. Just saying."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: It might be easier if you vary the angle only slightly."] = "", -- Basic_Training_-_Bazooka
+--      ["Hint: Just select the parachute, it opens automatically when you fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion
 --      ["Hint: Launch the bazooka horizontally at full power."] = "", -- Basic_Training_-_Bazooka
---      ["Hint: Press [Esc] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Pause the game to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Select the blow torch, aim and press [Fire]. Press [Fire] again to stop."] = "", -- A_Classic_Fairytale:journey
 --      ["Hint: Select the low gravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey
+--      ["Hint: Select the rope, [Up] or [Down] to aim, [Attack] to fire, directional keys to move."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Select the Shoryuken and hit [Attack].|P.S.: You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: %s needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family
 --      ["Hint: The rope only bends around objects.|When it doesn't hit anything, it's always straight."] = "", -- Basic_Training_-_Rope
 --      ["Hint: To jump higher, wait a bit before you hit “High Jump” a second time."] = "", -- Basic_Training_-_Movement
+--      ["Hint: To place a girder, select it,|then use [Left] and [Right] to select angle and length,|then choose a location for the girder."] = "", -- A_Classic_Fairytale:shadow
 --      ["Hint: Use the quit key to see the team’s continent."] = "", -- Continental_supplies
 --      ["Hint: When you shorten the rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope
 --      ["Hint: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey
@@ -962,24 +958,11 @@
 --      ["Hogminator"] = "", -- A_Classic_Fairytale:family
 --      ["Hog nueve"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog octo"] = "", -- A_Space_Adventure:fruit03
---      ["Hogonauts"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Hog onze"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog Saturn"] = "", -- A_Space_Adventure:fruit03
 --      ["Hogs in sight!"] = "", -- Continental_supplies
 --      ["Hog Solo and GB"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hog Solo"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01, A_Space_Adventure:moon02
---      ["Hog Solo couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo escaped successfully!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo has to reach the last crates"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo has to refuel his saucer."] = "", -- A_Space_Adventure:moon01
---      ["Hog Solo lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
---      ["Hog Solo wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["- Hogs will be revived"] = "", -- Capture_the_Flag
 --      ["- Hogs will drop the flag when killed"] = "", -- Capture_the_Flag
 --      ["Hog two"] = "", -- A_Space_Adventure:fruit03
@@ -989,9 +972,7 @@
 --      ["Homing Bee"] = "", -- Construction_Mode
 --      ["Honda"] = "", -- 
 --      ["Honest Lee"] = "", -- A_Classic_Fairytale:enemy
---      ["Hook"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
 --      ["Hooks"] = "", -- 
-   ["Hooray!"] = "Hurah!",
 --      ["Hooray! I actually did it! Hogera is safe!"] = "", -- A_Space_Adventure:final
 --      ["Hooray! I've found it, now I have to get back to Captain Lime!"] = "", -- A_Space_Adventure:fruit02
 --      ["Hooray! You are a champion!"] = "", -- A_Space_Adventure:ice02
@@ -1007,7 +988,7 @@
 --      ["However, if you fail to do so, she dies a most violent death, just like your friend! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, if you fail to do so, she dies a most violent death! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, my mates don't agree with me on letting you go..."] = "", -- A_Classic_Fairytale:dragon
---      ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
+--      ["However, the army of %s is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
 --      ["How to Rope"] = "", -- Basic_Training_-_Rope
 --      ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen
 --      ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen
@@ -1027,7 +1008,6 @@
 --      ["I can't believe what I'm hearing!"] = "", -- A_Classic_Fairytale:backstab
 --      ["I can't let you go further because …"] = "", -- A_Classic_Fairytale:queen
 --      ["I can't wait any more, I have to save myself!"] = "", -- A_Classic_Fairytale:shadow
---      ["Ice"] = "", -- Basic_Training_-_Movement
 --      ["Ice Jake"] = "", -- A_Space_Adventure:ice01
 --      ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family
 --      ["Icy Girder: [3]"] = "", -- HedgeEditor
@@ -1085,7 +1065,6 @@
 --      ["I just found out that they have captured your princess!"] = "", -- A_Classic_Fairytale:family
 --      ["I just want the strange device you found!"] = "", -- A_Space_Adventure:ice01
 --      ["I just wonder where Ramon and Spiky disappeared..."] = "", -- A_Classic_Fairytale:journey
---      ["Ikeda"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["I know and I'm terribly sorry!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know, my hero!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know that your resources are low due to the battle but I'll send two of my best hogs to assist you."] = "", -- A_Space_Adventure:fruit02
@@ -1113,6 +1092,7 @@
 --      ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen
 --      ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united
 --      ["IMPORTANT: To see the mission panel again, hold the mission panel key."] = "", -- Basic_Training_-_Movement
+--      ["IMPORTANT: To see the mission panel again, pause the game."] = "", -- Basic_Training_-_Movement
 --      ["Impressive...you are still dry as the corpse of a hawk after a week in the desert..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["%i ms"] = "", -- Gravity
 --      ["I'm so glad this is finally over!"] = "", -- A_Space_Adventure:final
@@ -1271,7 +1251,6 @@
 --      ["Kill the traitor, %s, or spare his life!"] = "", -- A_Classic_Fairytale:backstab
 --      ["--- King ---"] = "", -- Battalion
 --      ["King"] = "", -- Battalion
---      ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing
 --      ["--- King Mode ---"] = "", -- Battalion
 --      ["Knight"] = "", -- Battalion
 --      ["Knives"] = "", -- 
@@ -1290,7 +1269,7 @@
 --      ["Launch some bazookas to destroy the targets!"] = "", -- Basic_Training_-_Bazooka
 --      ["Leader"] = "", -- A_Classic_Fairytale:enemy
 --      ["Leaderbot"] = "", -- A_Classic_Fairytale:queen
---      ["Lead the Green Bananas to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
+--      ["Lead your allies to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
 --      ["Leaks A Lot"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Leaks A Lot, depressed for killing his loved one, failed to save the village..."] = "", -- A_Classic_Fairytale:journey
 --      ["Leaks A Lot gave his life for his tribe! He should have survived!"] = "", -- A_Classic_Fairytale:first_blood
@@ -1305,7 +1284,6 @@
 --      ["Left/right: Choose crate contents"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode
---      ["Left Tong"] = "", -- Bazooka_Battlefield
 --      ["Legs"] = "", -- 
 --      ["Less tools, more fun"] = "", -- Battalion
 --      ["Lestat"] = "", -- portal
@@ -1334,18 +1312,19 @@
 --      ["Lively Lifeguard"] = "",
 --      ["Lonely Cries"] = "", -- Continental_supplies
 --      ["Lonely Cries: [Rise the water if no hog is in the circle and deal 6 damage to all enemy hogs.]"] = "", -- Continental_supplies
---      ["Lonely Hog"] = "", -- ClimbHome
 --      ["Long Jump: [Enter]"] = "", -- Basic_Training_-_Movement
+--      ["Long Jump: Tap the [Curvy Arrow] button for long"] = "", -- Basic_Training_-_Movement, A_Classic_Fairytale:first_blood
 --      ["Long Live The Queen"] = "", -- A_Classic_Fairytale:queen
 --      ["Look around: [Mouse movement]"] = "", -- Basic_Training_-_Movement
+--      ["Look around: [Tap or swipe on the screen]"] = "", -- Basic_Training_-_Movement
 --      ["Look, boss! There is the target!"] = "", -- A_Space_Adventure:moon01
 --      ["Look, I had no choice!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! There's more of them!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! We're surrounded by cannibals!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Looks like the whole world is falling apart!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Look to the left and do a backwards jump towards the mushroom."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Loon"] = "", -- The_Specialists
 --      ["Loopy"] = "", -- 
---      ["Lord Evil"] = "", -- Tentacle_Terror
 --      ["Losing Condition: Destroy"] = "", -- HedgeEditor
 --      ["Low Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander
@@ -1365,7 +1344,6 @@
 --      ["Mario"] = "", -- 
 --      ["Mark gears for win/lose conditions"] = "", -- HedgeEditor
 --      ["Mark/unmark gear: [Left Click]"] = "", -- HedgeEditor
---      ["Mark"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
 --      ["- Massive weapon bonus on first turn"] = "", -- Continental_supplies
 --      ["Max Citrus"] = "", -- A_Space_Adventure:fruit01
 --      ["Maybe you should try an easier map next time."] = "", -- Racer
@@ -1380,7 +1358,6 @@
 --      ["Mega kill!"] = "", -- Mutant
 --      ["Meiwes"] = "", -- A_Classic_Fairytale:backstab
 --      ["mikade"] = "", -- 
---      ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer
 --      ["Mindy"] = "", -- A_Classic_Fairytale:united
 --      ["Mine Deployer"] = "",
 --      ["Mine Placement Mode"] = "", -- Construction_Mode
@@ -1399,12 +1376,12 @@
 --      ["Minion"] = "", -- A_Space_Adventure:moon01
 --      ["Minions"] = "", -- A_Space_Adventure:moon01
 --      ["Mission failed!"] = "", -- Big_Armory
-   ["MISSION FAILED"] = "Misija Nepavyko", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Mission failure in %d s"] = "", -- Big_Armory
+--      ["Mission"] = "", -- HedgeEditor
 --      ["Mission lost!"] = "", -- Basic_Training_-_Grenade
 --      ["Mission Panel"] = "", -- Basic_Training_-_Movement
 --      ["Mission panel: [M]"] = "", -- Basic_Training_-_Movement
-   ["MISSION SUCCESSFUL"] = "Misija Buvo Ivykdita", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+--      ["Mission succeeded!"] = "", -- portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, SimpleMission, HedgeEditor
 --      ["Mission won!"] = "", -- Basic_Training_-_Grenade
 --      ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02
 --      ["Mixed %d"] = "", -- WxW
@@ -1420,7 +1397,6 @@
 --      ["Monster kill!"] = "", -- Mutant
 --      ["Monsters"] = "", -- 
 --      ["Mooney"] = "", -- 
---      ["More Natives"] = "", -- A_Classic_Fairytale:epil
 --      ["Morris"] = "", -- 
 --      ["Most mines are not active."] = "", -- A_Space_Adventure:desert02
 --      ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01
@@ -1440,13 +1416,11 @@
 --      ["Nade Boy"] = "", -- Basic_Training_-_Grenade
 --      ["Nah, probably everyone was just stupid."] = "", -- A_Space_Adventure:final
 --      ["Name"] = "", -- A_Classic_Fairytale:queen
-   ["Nameless Heroes"] = "Bevardþiai Herojiai",
 --      ["Nancy Screw"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:queen
 --      ["Napalm"] = "", -- Construction_Mode
 --      ["Napalm Rocket"] = "", -- Continental_supplies
 --      ["Napalm rocket: [Fire a bomb with napalm!]"] = "", -- Continental_supplies
 --      ["Naranja Jed"] = "", -- A_Space_Adventure:fruit01
---      ["Natives"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Naughty Ninja"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Near a PAotH base on the moon ..."] = "", -- A_Space_Adventure:moon01
 --      ["Near Secret Base 17 of PAotH in the rural Hogland ..."] = "", -- A_Space_Adventure:cosmos
@@ -1541,11 +1515,8 @@
 --      ["Oh, my!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oh, my! I forgot something!"] = "", -- A_Classic_Fairytale:queen
 --      ["Oh, my! This is even more entertaining than I've expected!"] = "", -- A_Classic_Fairytale:backstab
-   ["Oh no! Just try again!"] = "O NE! Tiesiog Bandyk Vël", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Oh no, not %s!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
---      ["Oh no, the Green Bananas have betrayed Hog Solo and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
-   ["Oh no! Time's up! Just try again."] = "O NE! Baigësi Laikas! Tiesiog Bandyk Vël.", --Bazooka, Shotgun, SniperRifle
---      ["Oh no! You failed! Just try again."] = "", -- Basic_Training_-_Cluster_Bomb
+--      ["Oh no, the companions have betrayed %s and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
 --      ["Oh no! You have died. Try again!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Oh! Please spare me. You can take all my treasures!"] = "", -- A_Space_Adventure:ice01
 --      ["Oh, silly me! I forgot that I'm the shaman."] = "", -- A_Classic_Fairytale:backstab
@@ -1567,9 +1538,9 @@
 --      ["One shall not judge one by one's appearance!"] = "", -- A_Classic_Fairytale:epil
 --      ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oneye"] = "", -- portal
---      ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant
 --      ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant
+--      ["Only %s can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard
 --      ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01
@@ -1581,6 +1552,7 @@
 --      ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01
 --      ["Oops! You have selected the wrong hedgehog! Just try again."] = "", -- Basic_Training_-_Movement
 --      ["Open ammo menu: [Right click]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
+--      ["Open ammo menu: Tap the [Suitcase]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
 --      ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood
    ["Opposing Team: "] = "Pasiprieðinanti Komanda: ",
 --      ["Orange"] = "", -- 
@@ -1600,15 +1572,14 @@
 --      ["PAotH has sent explosives but unfortunately the trigger mechanism seems to be faulty!"] = "", -- A_Space_Adventure:cosmos
 --      ["Parachute"] = "", -- Continental_supplies
 --      ["Patches"] = "", -- 
---      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02
 --      ["Pause: [P]"] = "", -- Basic_Training_-_Movement
+--      ["Pause: Tap the [Pause] button"] = "", -- Basic_Training_-_Movement
 --      ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW
 --      ["Penguin Roar"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hog’s health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Perfect! Now try to get the next crate without hurting yourself!"] = "", -- A_Classic_Fairytale:first_blood
-   ["Per-Hog Ammo"] = "Kulkos Per-Eþy",
 --      ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh
 --      ["Personal best: %.3f seconds"] = "", -- A_Space_Adventure:ice02
 --      ["Per team weapons"] = "", -- Continental_supplies
@@ -1617,7 +1588,6 @@
 --      ["Physicist"] = "", -- HedgeEditor
 --      ["Piano Strike"] = "", -- Construction_Mode
 --      ["Pikachu"] = "", -- 
---      ["Pincer Knights"] = "", -- Bazooka_Battlefield
 --      ["Pings left: %d"] = "", -- Space_Invasion
 --      ["Pink"] = "", -- 
 --      ["Pirates"] = "", -- 
@@ -1670,8 +1640,6 @@
 --      ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion
 --      ["--- Points ---"] = "", -- Battalion
 --      ["--- Points Mode ---"] = "", -- Battalion
-   ["points"] = "taðkai", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
---      ["point(s)"] = "", -- TargetPractice, Mutant
    ["Poison"] = "Nuodai",
 --      ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02
 --      ["Poisonous, deals no damage."] = "", -- Continental_supplies
@@ -1691,37 +1659,37 @@
 --      ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to fight"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos
---      ["Prepare yourself"] = "",
+--      ["Prepare yourself, %s!"] = "", -- The_Specialists
 --      ["Press [Attack] (space bar by default) to start,|repeadedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] (space bar by default) to start,|repeatedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] to begin."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Attack] to confirm."] = "", -- Continental_supplies
 --      ["Press [Attack] to select this continent!"] = "", -- Continental_supplies
 --      ["Press [Left] and [Right] to change the difficulty."] = "", -- A_Classic_Fairytale:first_blood
---      ["Press [Left] or [Right] to move around, [Enter] to jump"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Press [Left] or [Right] to move around, [Long Jump] to jump forwards."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW
 --      ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW
+--      ["Press [M] to see the mission texts"] = "", -- Basic_Training_-_Movement
    ["Press [Precise] to skip intro"] = "Spausk [TaikluNusitaikima kad baigtum iëjima",
 --      ["Press [Up] and [Down] to move between menu items.|Press [Attack], [Left], or [Right] to toggle."] = "", -- WxW
 --      ["Prestigious Pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Princess"] = "", -- A_Classic_Fairytale:family, A_Classic_Fairytale:journey
 --      ["Princess Peach"] = "", -- 
---      ["Private Nolak"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["Problems, dude? Chillax!"] = "", -- A_Classic_Fairytale:epil
 --      ["Professional pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professional stunt pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professor"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
 --      ["Professor Hogevil, then known as James Hogus, worked for PAotH back in my time."] = "", -- A_Space_Adventure:moon02
+--      ["Professor's Team"] = "", -- A_Space_Adventure:death01
 --      ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
---      ["Pro Killers"] = "", -- Big_Armory
 --      ["Protect the King: When the king dies, so does the team"] = "", -- Battalion
 --      ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Protect yourselves!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Purple"] = "", -- 
 --      ["Pyro"] = "", -- HedgeEditor, The_Specialists
 --      ["Pyromancer"] = "", -- Battalion
 --      ["Quit: [Esc]"] = "", -- Basic_Training_-_Movement
 --      ["Race complexity limit reached"] = "", -- Racer, TechRacer
+--      ["Race failed!"] = "", -- A_Space_Adventure:moon02
 --      ["Racer"] = "", -- Racer
 --      ["Racer tool"] = "", -- Racer
 --      ["Race"] = "", -- TrophyRace
@@ -1757,23 +1725,19 @@
 --      ["Replenishment: Weapons are restocked on turn start of a new hog"] = "", -- Highlander
 --      ["Repositioning Mode"] = "", -- HedgeEditor
 --      ["REPOSITIONING MODE"] = "", -- HedgeEditor
---      ["rescues"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Rescue the imprisoned PAotH team and get the fuel!"] = "", -- A_Space_Adventure:moon01
 --      ["Respawner"] = "", -- Construction_Mode
 --      ["Respawner: Resurrects dead hogs."] = "", -- Construction_Mode
 --      ["Resurrector"] = "", -- Construction_Mode
 --      ["Retract/Extend rope: [Up]/[Down]"] = "", -- Basic_Training_-_Rope
 --      ["- Return the enemy flag to your base to score"] = "", -- Capture_the_Flag
-   [" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = " - Graþink prieðu vëliava i savo baze ir gausi taðku | - Pirma komanda su 3 vëliavom laimi | - Taðkus gausi tik tada kaip tavo vëliava bazëje | - Eþiai pames vëliava jeigu mirs, arba paskes | - Pamestos vëliavos gali buti graþintos arba pavogtos | - Eþiai atsikelia kaip nuþudyti",
 --      ["Return to Leaks A Lot!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Return to the mission menu by pressing the \"Go back\" button."] = "", -- A_Space_Adventure:cosmos
 --      ["Return to the Surface"] = "", -- A_Space_Adventure:fruit02
 --      ["Return to the training menu by pressing the “Go back” button."] = "", -- Basic_Training_-_Movement
---      ["Rhombus"] = "", -- Basic_Training_-_Movement
 --      ["Rider"] = "", -- portal
 --      ["Rifleman"] = "", -- Battalion
 --      ["Righteous Beard"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:queen, A_Classic_Fairytale:united
---      ["Right Tong"] = "", -- Bazooka_Battlefield
 --      ["Ripe"] = "", -- 
 --      ["Rise the water if nobody else is in the circle and deal 6 damage to all enemy hogs."] = "", -- Continental_supplies
 --      ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01
@@ -1782,8 +1746,8 @@
 --      ["Roof"] = "", -- WxW
 --      ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Rope Master"] = "", -- Basic_Training_-_Rope
---      ["Roper"] = "", -- SpeedShoppa
 --      ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
+--      ["Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Rope Team"] = "", -- Basic_Training_-_Rope
 --      ["Rope Training"] = "", -- Basic_Training_-_Rope
 --      ["Rope Weapons"] = "", -- Basic_Training_-_Rope
@@ -1797,7 +1761,6 @@
 --      ["Round limit:"] = "", -- TechRacer
 --      ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer
 --      ["Round's slowest lap: %.3fs by %s"] = "", -- TrophyRace
---      ["Rounds until Sudden Death: %d"] = "", -- Battalion
 --      ["RS1"] = "", -- A_Space_Adventure:fruit03
 --      ["RS2"] = "", -- A_Space_Adventure:fruit03
 --      ["Rubber"] = "", -- Construction_Mode, HedgeEditor
@@ -1823,10 +1786,17 @@
 --      ["Salvation was one step closer now..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Sam"] = "", -- A_Space_Adventure:cosmos
 --      ["Sandals?! I thought you left your ring!"] = "", -- A_Classic_Fairytale:queen
+--      ["%s and GB"] = "", -- A_Space_Adventure:fruit02
 --      ["%s and %s enter the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sandstorm"] = "", -- A_Space_Adventure:desert01
 --      ["Sandy"] = "", -- A_Space_Adventure:desert01
-   ["Save as many hapless hogs as possible!"] = "Iðgelbëk kuo daugiau nelaimingu eþiu!",
+--      ["%s arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
+--      ["Save as many hogs as possible!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey
 --      ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow
 --      ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor
@@ -1838,9 +1808,9 @@
 --      ["Scallywag"] = "", -- 
 --      ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab
 --      ["Scenario"] = "", -- Big_Armory, portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape
---      ["Scenario failed!"] = "", -- SimpleMission
 --      ["Scientist"] = "", -- Battalion
 --      ["%s climbed home in %d seconds!"] = "", -- ClimbHome
+--      ["%s (contd.)"] = "", -- A_Classic_Fairytale:epil
 --      ["Score: %d"] = "", -- Space_Invasion
 --      ["Score goal: %d"] = "", -- Control
 --      ["Score graph"] = "", -- Mutant, Space_Invasion
@@ -1850,6 +1820,7 @@
 --      ["Scores"] = "", -- Mutant
 --      ["Scores:"] = "", -- Mutant
 --      ["Scoring: "] = "", -- Mutant
+--      ["%s couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
 --      ["Script parameter examples:"] = "", -- Gravity
 --      ["%s (+%d)"] = "", -- Battalion
 --      ["%s: %d"] = "", -- Capture_the_Flag, Control
@@ -1862,10 +1833,9 @@
 --      ["%s died … and lives again!"] = "", -- Construction_Mode
 --      ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome
 --      ["%s, %d sec"] = "", -- Continental_supplies
---      ["Search for the device with the help of the other hedgehogs "] = "", -- A_Space_Adventure:fruit02
+--      ["Search for the device with the help of the other hedgehogs."] = "", -- A_Space_Adventure:fruit02
 --      ["Searching in the dust"] = "", -- A_Space_Adventure:desert01
 --      ["Searching the stars!"] = "", -- A_Space_Adventure:cosmos
---      ["seconds"] = "", -- ClimbHome
 --      ["Seduction"] = "", -- Continental_supplies
 --      ["Seems like every time you take a \"walk\", the enemy finds us!"] = "", -- A_Classic_Fairytale:backstab
 --      ["See that crate farther on the right?"] = "", -- A_Classic_Fairytale:first_blood
@@ -1892,6 +1862,7 @@
 --      ["Select your continent with [Up]/[Down] or by selecting a representative weapon."] = "", -- Continental_supplies
 --      ["%s enters the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sergey"] = "", -- 
+--      ["%s escaped successfully!"] = "", -- A_Space_Adventure:fruit01
 --      ["Set bounciness: [Left Shift] + [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set detonation timer: [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set Health: [Left Click]"] = "", -- HedgeEditor
@@ -1915,10 +1886,12 @@
 --      ["%s has been killed before taking enough damage first."] = "", -- SimpleMission
 --      ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has been rescued from death"] = "", -- Construction_Mode
+--      ["%s has dropped the flag!"] = "", -- CTF_Blizzard
 --      ["%s has fallen victim to gravity."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has mutated! +2 points"] = "", -- Mutant
 --      ["%s has passed the best height of %s!"] = "", -- ClimbHome
 --      ["%s has scored!"] = "", -- Capture_the_Flag
+--      ["%s has to refuel the saucer."] = "", -- A_Space_Adventure:moon01
 --      ["%s hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil
 --      ["sheepluva"] = "", -- 
@@ -1935,8 +1908,6 @@
 --      ["Shinobi"] = "", -- 
 --      ["%s hit the ground."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Shoppa Love"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
---      ["Shoppa Union"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes, Challenge_-_Speed_Shoppa_-_ShoppaKing
---      ["Shoppers"] = "", -- SpeedShoppa
 --      ["Shotgun"] = "", -- Continental_supplies
 --      ["Sigh."] = "", -- A_Classic_Fairytale:epil
    ["Silly"] = "Durnelis",
@@ -1949,11 +1920,11 @@
 --      ["%s is now as poor as a church mouse"] = "", -- Construction_Mode
 --      ["%s is now a zombie hedgehog"] = "", -- Construction_Mode
 --      ["%s is suddenly low on ammo"] = "", -- Construction_Mode
---      ["Skip your turn to try again."] = "", -- Basic_Training_-_Rope
 --      ["Skulls"] = "", -- Bazooka_Battlefield
 --      ["Slimer"] = "", -- 
 --      ["Slippery"] = "", -- A_Classic_Fairytale:journey
 --      ["%s lost all the weapons"] = "", -- Construction_Mode
+--      ["%s lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
 --      ["Slot %d: %s"] = "", -- Frenzy
 --      ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy
 --      ["Slowpoke"] = "", -- 
@@ -1967,6 +1938,7 @@
 --      ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smugglers"] = "", -- A_Space_Adventure:desert01
+--      ["%s must collect the final crates."] = "", -- A_Space_Adventure:fruit02
 --      ["%s must skip this turn for rule violation."] = "", -- WxW
 --      ["Sneaks"] = "", -- Bazooka_Battlefield
 --      ["%s never got the ninja diploma."] = "", -- ClimbHome
@@ -1975,10 +1947,8 @@
 --      ["Sniper"] = "", -- HedgeEditor, The_Specialists
 --      ["Sniper Rifle"] = "", -- Continental_supplies
    ["Sniper Training"] = "Snaiperio Treniruotë",
-   ["Sniperz"] = "Snaiperiai",
 --      ["So, as promised I have brought you where I think that the device you are looking for is hidden."] = "", -- A_Space_Adventure:fruit02
 --      ["So far, you had infinite ropes, but in the|real world, ropes are usually limited."] = "", -- Basic_Training_-_Rope
---      ["So Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["So, I believe that it's a good place to start."] = "", -- A_Space_Adventure:desert01
 --      ["So, I kindly ask for your help."] = "", -- A_Space_Adventure:fruit01
@@ -1988,11 +1958,12 @@
 --      ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03
 --      ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen
 --      ["Some weapons can be dropped from the rope."] = "", -- Basic_Training_-_Rope
---      ["Somewhere else on the planet of fruits, Captain Lime helps Hog Solo"] = "", -- A_Space_Adventure:fruit02
---      ["Somewhere else on the planet of fruits Hog Solo gets closer to the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, Captain Lime helps %s"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, %s gets closer to the device"] = "", -- A_Space_Adventure:fruit02
 --      ["Somewhere on the Planet of Fruits a terrible war is about to begin ..."] = "", -- A_Space_Adventure:fruit01
 --      ["Somewhere on the uninhabitable Death Planet ..."] = "", -- A_Space_Adventure:death01
 --      ["So, now I got the last part and I have your friends captured."] = "", -- A_Space_Adventure:death01
+--      ["So, %s, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So the princess was never heard of again ..."] = "", -- A_Classic_Fairytale:family
 --      ["So, uhmm, how did you manage to teleport them so far?"] = "", -- A_Classic_Fairytale:epil
 --      ["Sour"] = "", -- 
@@ -2093,8 +2064,6 @@
 --      ["Structure Placement Mode"] = "", -- Construction_Mode
 --      ["Structure Placer"] = "", -- Construction_Mode
 --      ["Stupid, stupid Hogerians!"] = "", -- A_Space_Adventure:final
---      ["Subject 1"] = "", -- portal
---      ["Subjects"] = "", -- portal
 --      ["Subtract %d"] = "", -- HedgeEditor
 --      ["--- Sudden Death ---"] = "", -- Battalion
 --      ["Summer Squash"] = "", -- A_Space_Adventure:fruit01
@@ -2111,7 +2080,7 @@
 --      ["Surfer! +15 points!"] = "", -- Space_Invasion
 --      ["Surfer!"] = "", -- WxW
 --      ["Surprise supplies: Get 1-3 random weapons each turn."] = "", -- Continental_supplies
---      ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:shadow
+--      ["Survive!"] = "", -- A_Classic_Fairytale:shadow
 --      ["%s violated the “All But Last” rule and will be penalized."] = "", -- WxW
 --      ["%s violated the “Kill The Leader” rule and will be penalized."] = "", -- WxW
 --      ["Swap place with a random enemy in the circle."] = "", -- Continental_supplies
@@ -2130,6 +2099,7 @@
 --      ["%s! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
 --      ["Swing, Leaks A Lot, on the wings of the wind!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Swing: [Left]/[Right]"] = "", -- Basic_Training_-_Rope
+--      ["%s wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome
 --      ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer
 --      ["switch"] = "", -- Continental_supplies
@@ -2143,6 +2113,7 @@
 --      ["Switch Hog"] = "", -- Construction_Mode
 --      ["Switch: Select weapon special"] = "", -- Continental_supplies
 --      ["Switch: Toggle crate radar"] = "", -- WxW
+--      ["%s won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Swords"] = "", -- Bazooka_Battlefield
 --      ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon
 --      ["%s, you may choose the rules."] = "", -- WxW
@@ -2151,6 +2122,8 @@
 --      ["Tails"] = "", -- 
 --      ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Tall Potato"] = "", -- A_Space_Adventure:fruit01
+--      ["Tap [Pause] to see the mission texts"] = "", -- Basic_Training_-_Movement
+--      ["Tap the “rotating arrow” button on the left|until you have selected Cappy, the hedgehog with the cap!"] = "", -- Basic_Training_-_Movement
 --      ["Target"] = "", -- HedgeEditor
 --      ["Target Placement Mode"] = "", -- Construction_Mode
 --      ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor
@@ -2166,15 +2139,18 @@
 --      ["Tatters"] = "", -- 
    ["Team %d: "] = "Komanda %d: ",
 --      ["Team %d"] = "", -- SimpleMission
+--      ["Team highscore: %d"] = "", -- Utils
 --      ["Team Identity Mode"] = "", -- HedgeEditor
 --      ["TEAM IDENTITY MODE"] = "", -- HedgeEditor
---      ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
+--      ["Team lowscore: %d"] = "", -- Utils
 --      ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion
+--      ["Team's best time: %.3fs"] = "", -- Utils
 --      ["Team Scores:"] = "", -- Control
 --      ["Team scores:"] = "", -- Space_Invasion
+--      ["Team's longest time: %.3fs"] = "", -- Utils
+--      ["Team's top accuracy: %d%"] = "", -- Utils
 --      ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2
 --      ["Teamwork"] = "", -- User_Mission_-_Teamwork
---      ["Team Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
 --      ["TechRacer"] = "", -- TechRacer
 --      ["Teleporation Node"] = "", -- Construction_Mode
 --      ["Teleportation Mode"] = "", -- Construction_Mode
@@ -2266,11 +2242,12 @@
 --      ["The forgotten continent"] = "", -- Continental_supplies
 --      ["The giant umbrella from the last crate should help break the fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Great Escape"] = "", -- User_Mission_-_The_Great_Escape
---      ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01
+--      ["- The green target must survive"] = "", -- HedgeEditor
+--      ["- The green targets must survive"] = "", -- HedgeEditor
 --      ["The guardian"] = "", -- A_Classic_Fairytale:shadow
 --      ["The hardships of the war turned %s (%s) into a killing machine: %d invaders destroyed in one round!"] = "", -- Space_Invasion
+--      ["The health of your current hedgehog|is shown at the top right corner."] = "", -- Basic_Training_-_Movement
 --      ["The hedgehog with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant
---      ["The Hogies"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["The Hospital"] = "", -- 
 --      ["The Individualist"] = "", -- A_Classic_Fairytale:shadow
 --      ["Their buildings were very primitive back then, even for an uncivilised island."] = "", -- A_Classic_Fairytale:united
@@ -2288,7 +2265,6 @@
 --      ["The Mutant has super-weapons and a lot of health."] = "", -- Mutant
 --      ["The Mutant loses health quickly, but gains health by killing."] = "", -- Mutant
 --      ["The Mutant loses health quickly if he doesn't keep scoring kills."] = "", -- Mutant
-   ["The Nameless One"] = "Bevardis",
 --      ["The Navy greets %s for managing to get in a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["The next 4 times you play the \"The last encounter\" mission you'll get 20 more hit points and a laser sight."] = "", -- A_Space_Adventure:death02
 --      ["The next crate is an utility crate."] = "", -- Basic_Training_-_Movement
@@ -2302,6 +2278,7 @@
 --      ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil
 --      ["The oppression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
 --      ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
+--      ["The other hog has died, he should have survived!"] = "", -- A_Space_Adventure:moon02
 --      ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Police"] = "", -- 
 --      ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -2326,7 +2303,7 @@
 --      ["The Showdown"] = "", -- A_Classic_Fairytale:shadow
 --      ["The Slaughter"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:first_blood
 --      ["The Society of Perfectionists greets %s (%s): No misses and %d hits in its best round."] = "", -- Space_Invasion
-   ["THE SPECIALISTS"] = "Specialistai",
+--      ["The Specialists: Each hedgehog starts with its own weapon set"] = "", -- The_Specialists
 --      ["The spinning arrows above your hedgehog show|which hedgehog is selected right now."] = "", -- Basic_Training_-_Movement
 --      ["The spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
@@ -2374,7 +2351,6 @@
 --      ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["This also increases the effectiveness of Medicine."] = "", -- Continental_supplies
 --      ["This game wasn’t really exciting."] = "", -- Space_Invasion
---      ["This Hog Solo is so naive! When he returns I'll shoot him and keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This is a new personal best, congratulations!"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert02, A_Space_Adventure:fruit03
 --      ["This is a new personal best time, congratulations!"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["This is Cappy."] = "", -- Basic_Training_-_Movement
@@ -2392,6 +2368,7 @@
    ["This rain is really something..."] = "Ðis lietus tikrai kaþkas...",
 --      ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome
 --      ["This seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01
+--      ["This %s is so naive! I'm going to shoot this fool so I can keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This was an awesome performance! But this challenge can be finished with even just one RC plane. Can you figure out how?"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["This will be fun!"] = "", -- A_Classic_Fairytale:enemy
 --      ["This will be useful when I need a new platform or if I want to rise."] = "", -- portal
@@ -2432,11 +2409,11 @@
 --      ["To begin with the training, hit the attack key!"] = "", -- Basic_Training_-_Movement
 --      ["To begin with the training, select the bazooka from the ammo menu!"] = "", -- Basic_Training_-_Bazooka
 --      ["To begin with the training, select the grenade from the ammo menu!"] = "", -- Basic_Training_-_Grenade
+--      ["To begin with the training, tap the attack button!"] = "", -- Basic_Training_-_Movement
 --      ["To finish hedgehog selection, just do anything|with him, like walking."] = "", -- Basic_Training_-_Movement
 --      ["To get over the next obstacles, keep some distance from the wall before you back jump."] = "", -- Basic_Training_-_Movement
 --      ["To get over the water, you have to do multiple|rope shots and swings."] = "", -- Basic_Training_-_Rope
 --      ["Toggle Editing Weapons and Tools: [Precise]+[2]"] = "", -- HedgeEditor
---      ["Toggle Gear Information: [Precise]+[3]"] = "", -- HedgeEditor
 --      ["Toggle Help: [Precise]+[1]"] = "", -- HedgeEditor
 --      ["Toggle Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Toggle Shield: [Long jump]"] = "", -- Space_Invasion
@@ -2446,14 +2423,14 @@
 --      ["Too bad! Then you should really leave!"] = "", -- A_Space_Adventure:fruit01
 --      ["Too slow! Try again ..."] = "", -- A_Space_Adventure:moon02
 --      ["Top-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"] = "", -- A_Classic_Fairytale:shadow
 --      ["To reach higher ground, walk to a ledge, look to the left, then do a back jump."] = "", -- Basic_Training_-_Movement
 --      ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey
 --      ["To the caves..."] = "", -- A_Classic_Fairytale:united
 --      ["Touch all waypoints as fast as you can!"] = "", -- Racer
---      ["To win the game, Hog Solo has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
+--      ["- Touch the sparkles near your base to teleport"] = "", -- CTF_Blizzard
+--      ["To win the game, %s has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
 --      ["To win the game you had to collect the 2 crates with no specific order."] = "", -- A_Space_Adventure:desert01
---      ["To win the game you have to eliminate all your enemies."] = "", -- A_Space_Adventure:death01
+--      ["To win the game you have to eliminate Professor Hogevil."] = "", -- A_Space_Adventure:death01
 --      ["To win the game you have to find the right crate."] = "", -- A_Space_Adventure:desert01
 --      ["To win the game you have to go next to Thanta."] = "", -- A_Space_Adventure:ice01
 --      ["To win the game you have to go to the surface."] = "", -- A_Space_Adventure:desert02
@@ -2461,13 +2438,10 @@
 --      ["To win the game you have to stand next to Thanta."] = "", -- A_Space_Adventure:ice01
    ["Toxic Team"] = "Toksinë Komanda", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Track completed!"] = "", -- Racer, TechRacer
---      ["Trainee"] = "", -- TargetPractice
 --      ["Training"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Training complete!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Training Team"] = "", -- TargetPractice
 --      ["Traitors"] = "", -- A_Classic_Fairytale:epil
 --      ["Traitors don't get to shout around here!"] = "", -- A_Classic_Fairytale:epil
---      ["Trapped"] = "", -- Basic_Training_-_Movement
 --      ["Trapper"] = "", -- HedgeEditor
 --      ["Travel carefully as your fuel is limited"] = "", -- A_Space_Adventure:cosmos
 --      ["Travel to all the neighbor planets and collect all the pieces"] = "", -- A_Space_Adventure:cosmos
@@ -2484,7 +2458,6 @@
 --      ["Try to land softly, as you can still take fall damage!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Try to protect the chief! You won't lose if he dies, but it is advised that he survives."] = "", -- A_Classic_Fairytale:united
 --      ["Try to reach and destroy the next target quickly."] = "", -- Basic_Training_-_Rope
-   ["T_T"] = "T_T",
 --      ["Tumbler"] = "", -- Tumbler
 --      ["Turn around: [Left Shift] + [Left]/[Right]"] = "", -- Basic_Training_-_Movement
 --      ["Turning Around"] = "", -- Basic_Training_-_Movement
@@ -2503,7 +2476,6 @@
 --      ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy
 --      ["Ukemi"] = "", -- 
 --      ["Ultra kill!"] = "", -- Mutant
---      ["Ultrasoldier"] = "", -- Big_Armory
 --      ["unC0Rr"] = "", -- 
 --      ["Under Construction"] = "", -- A_Classic_Fairytale:shadow
 --      ["Under normal circumstances we could easily defeat them but we have kindly sent most of our men to the Kingdom of Sand to help with the annual dusting of the king's palace."] = "", -- A_Space_Adventure:fruit01
@@ -2528,7 +2500,6 @@
 --      ["United We Stand"] = "", -- A_Classic_Fairytale:united
 --      ["Unlike bazookas, grenades are not influenced by wind."] = "", -- Basic_Training_-_Grenade
 --      ["Unlimited Attacks: Attacks don't end your turn"] = "", -- User_Mission_-_Diver, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree
-   ["Unlimited Attacks"] = "Nesibaigianèios Atakos",
 --      ["Unlucky Sods"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Unstoppable!"] = "",
 --      ["Unsuspecting Louts"] = "", -- User_Mission_-_Rope_Knock_Challenge
@@ -2543,13 +2514,14 @@
 --      ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood
    ["User Challenge"] = "Vartotojo Iðukis",
 --      ["!"] = "", -- User_Mission_-_Dangerous_Ducklings
+--      ["User Mission"] = "", -- HedgeEditor
 --      ["Use the attack key twice to change the flying saucer while being in air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the attack key twice to change the flying saucer while floating in mid-air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the bazooka and the flying saucer to get the freezer."] = "", -- A_Space_Adventure:ice01
 --      ["Use the flying saucer from the crate to fly to the moon."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly the other planets."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly to the other planets."] = "", -- A_Space_Adventure:cosmos
---      ["Use the parachute ([Space] while in air) to get the next crate"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Use the parachute to get the next crate."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Use the portal gun to get to the next crate, then use the new gun to get to the final destination!|"] = "", -- A_Classic_Fairytale:dragon
 --      ["Use the RC plane and destroy the all the targets."] = "", -- A_Space_Adventure:desert03
 --      ["Use the rope in order to catch the blue hedgehog"] = "", -- A_Space_Adventure:moon02
@@ -2583,7 +2555,6 @@
 --      ["Victory Condition: Collect"] = "", -- HedgeEditor
 --      ["Victory Condition: Destroy"] = "", -- HedgeEditor
 --      ["Victory for %s!"] = "", -- Capture_the_Flag
-   ["Victory for the "] = "Pergalë ", -- CTF_Blizzard, Capture_the_Flag
 --      ["Violence is not the answer to your problems!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos
 --      ["Vladimir"] = "", -- 
@@ -2602,9 +2573,6 @@
 --      ["Walls left: %d"] = "", -- WxW
 --      ["Wall to wall"] = "", -- WxW
 --      ["Waluigi"] = "", -- 
---      ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Wannabe Ropers"] = "", -- Basic_Training_-_Rope
---      ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Wario"] = "", -- 
 --      ["Warming Up"] = "", -- Basic_Training_-_Grenade
 --      ["Warning: Fire cake detected"] = "", -- ClimbHome
@@ -2633,7 +2601,6 @@
 --      ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion
 --      ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion
 --      ["Weapon specials: Some weapons have special modes (see weapon description)."] = "", -- Continental_supplies
-   ["Weapons Reset"] = "Ginklai Atgaivinti",
 --      ["Weapons reset: The weapons are reset after each turn."] = "", -- WxW
 --      ["We are indeed."] = "", -- A_Classic_Fairytale:backstab
 --      ["We can't defeat them!"] = "", -- A_Classic_Fairytale:shadow
@@ -2650,9 +2617,9 @@
 --      ["We have to hurry! Are you armed?"] = "", -- A_Space_Adventure:moon01
 --      ["We have to protect the village!"] = "", -- A_Classic_Fairytale:united
 --      ["We have to unite and defeat those cylergs!"] = "", -- A_Classic_Fairytale:enemy
---      ["Welcome Hog Solo, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome home! Please take a seat"] = "", -- ClimbHome
 --      ["Welcome, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey
+--      ["Welcome, %s, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome to the Death Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
@@ -2819,16 +2786,16 @@
 --      ["You can’t open a portal on the blue surface."] = "", -- portal
 --      ["You can use the other 2 hogs to assist you."] = "", -- A_Space_Adventure:fruit02
 --      ["You can use the rope to reach new places."] = "", -- Basic_Training_-_Rope
---      ["You choose well, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You choose well, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You completed the mission in %.3f seconds."] = "", -- A_Space_Adventure:ice02
 --      ["You completed the mission in %d rounds."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03
---      ["You couldn't have come to a worse time, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You couldn't have come to a worse time, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You couldn't possibly believe that after refusing my offer I'd just let you go!"] = "", -- A_Classic_Fairytale:journey
    ["You'd almost swear the water was rising!"] = "Galima pamanyti kad vanduo tikrai kyla!",
 --      ["You'd better watch your steps..."] = "", -- A_Classic_Fairytale:journey
 --      ["You defended yourself against Captain Lime."] = "", -- A_Space_Adventure:fruit02
---      ["You defended yourself against the Fruit Assassins."] = "", -- A_Space_Adventure:fruit02
---      ["You did great, Hog Solo! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
+--      ["You defended yourself against %s."] = "", -- A_Space_Adventure:fruit02
+--      ["You did great, %s! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
 --      ["You did not make it in time, try again!"] = "", -- Basic_Training_-_Rope
 --      ["You don't deserve my sacrifice!"] = "", -- A_Classic_Fairytale:queen
 --      ["You drove Professor Hogevil away."] = "", -- A_Space_Adventure:moon01
@@ -2844,12 +2811,12 @@
 --      ["You got me!"] = "", -- A_Space_Adventure:moon02
 --      ["You had %.1fs remaining on the clock (+%d points)."] = "", -- TargetPractice
 --      ["You had %.2fs remaining on the clock (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle
---      ["You had %d additional flying saucers left."] = "", -- A_Space_Adventure:ice02
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: you might want to use some mines..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: You might want to use some mines ..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01
 --      ["You have activated Switch Hedgehog!"] = "", -- Basic_Training_-_Movement
 --      ["You have beaten the challenge!"] = "", -- ClimbHome
+--      ["You have beaten the team record, congratulations!"] = "", -- Utils
 --      ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab
 --      ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united
 --      ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01
@@ -2868,7 +2835,6 @@
 --      ["You have eliminated all visible enemy hedgehogs!"] = "", -- A_Space_Adventure:fruit01
 --      ["You have eliminated Professor Hogevil."] = "", -- A_Space_Adventure:moon01
 --      ["You have eliminated the evil minions."] = "", -- A_Space_Adventure:moon01
---      ["You have eliminated the whole evil team. You're pretty tough!"] = "", -- A_Space_Adventure:moon01
 --      ["You have escaped successfully."] = "", -- A_Space_Adventure:desert02
 --      ["You have failed to complete your task, young one!"] = "", -- A_Classic_Fairytale:journey
 --      ["You have failed to save the tribe!"] = "", -- A_Classic_Fairytale:backstab
@@ -2922,6 +2888,7 @@
 --      ["You have to travel again"] = "", -- A_Space_Adventure:cosmos
 --      ["You have to try again!"] = "", -- A_Space_Adventure:cosmos
 --      ["You have triggered the secret Do-Not-Rope-to-the-Moon Defense System."] = "", -- A_Space_Adventure:cosmos
+--      ["You have unlocked the target radar!"] = "", -- TargetPractice
 --      ["You have used %d flying saucers."] = "", -- A_Space_Adventure:ice02
 --      ["You have used %d RC planes."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["You have used only 1 RC plane. Outstanding!"] = "", -- User_Mission_-_RCPlane_Challenge
@@ -2940,10 +2907,9 @@
 --      ["You'll have only 2 watermelon bombs during the game."] = "", -- A_Space_Adventure:fruit03
 --      ["You'll have only one RC plane at the start of the mission."] = "", -- A_Space_Adventure:desert03
 --      ["You'll have to eliminate Captain Lime at the end."] = "", -- A_Space_Adventure:fruit02
---      ["You'll have to eliminate the Fruit Assassins at the end."] = "", -- A_Space_Adventure:fruit02
+--      ["You'll have to eliminate %s at the end."] = "", -- A_Space_Adventure:fruit02
 --      ["You'll lose if you die or if your time is up."] = "", -- A_Space_Adventure:moon02
 --      ["You'll see what I mean!"] = "", -- A_Classic_Fairytale:enemy
---      ["You lose!"] = "", -- Basic_Training_-_Sniper_Rifle, Big_Armory, Basic_Training_-_Bazooka, TargetPractice, ClimbHome
 --      ["You lost your target, try again!"] = "", -- TargetPractice
 --      ["You may find it handy."] = "", -- A_Space_Adventure:cosmos
 --      ["You may only attack from a rope!"] = "", -- WxW
@@ -2965,8 +2931,7 @@
 --      ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice
 --      ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice
 --      ["Your ammo is limited this time."] = "", -- Basic_Training_-_Bazooka
---      ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy
---      ["Your deaths will be avenged, Natives!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Your deaths will be avenged, %s!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Your death will not be in vain, Dense Cloud!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You're a coward!"] = "", -- A_Classic_Fairytale:queen
 --      ["You're...alive!? But we saw you die!"] = "", -- A_Classic_Fairytale:backstab
@@ -2994,21 +2959,21 @@
 --      ["Your next task is to collect some crates by using the rope!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Your personal best time so far: %.3f seconds"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["Your rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["You saved %d of 8 Hapless Hogs."] = "", -- User_Mission_-_That_Sinking_Feeling
+--      ["Your rope is gone! Try again!"] = "", -- Basic_Training_-_Rope
+--      ["You saved %d of 8 hegehogs."] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen
 --      ["You see the wind strength at the bottom right corner."] = "", -- Basic_Training_-_Bazooka
+--      ["You see the wind strength at the top."] = "", -- Basic_Training_-_Bazooka
 --      ["You should have known that we don't rely on meatbags!"] = "", -- A_Classic_Fairytale:queen
 --      ["You should know this more than anyone, Leaks!"] = "", -- A_Classic_Fairytale:queen
 --      ["You speak great truth, Hannibal. Here, take a sip!"] = "", -- A_Classic_Fairytale:epil
 --      ["You've been assaulting us, we have been just defending ourselves!"] = "", -- A_Classic_Fairytale:enemy
-   ["You've failed. Try again."] = "Tau nepavyko. Bandyk vël.",
    ["You've reached the goal!| |Time: "] = "Tu pasiekiai taikini!| |Laikas: ",
 --      ["You will be avenged!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You will fail if you run out of ammo and there are still targets available."] = "", -- A_Space_Adventure:desert03
 --      ["You will gain some extra ammo from the crates the next time you play the \"Getting to the device\" mission."] = "", -- A_Space_Adventure:fruit03
 --      ["You will play every 3 turns."] = "", -- A_Space_Adventure:fruit01
 --      ["- You will recieve 2-4 weapons on each kill! (Even on own hogs)"] = "", -- Continental_supplies
---      ["You win!"] = "", -- Big_Armory
 --      ["You won't believe what happened to me!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Yuck! I bet they'll keep worshipping her even after I save the village!"] = "", -- A_Classic_Fairytale:family
 --      ["Yumme Gunpowder"] = "", -- 
@@ -3016,6 +2981,7 @@
 --      ["Zombie"] = "", -- 
 --      ["Zombi"] = "", -- portal
    ["'Zooka Team"] = "'Zukos Komanda",
---      ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
+--      ["Zoom: [Pinch] with 2 fingers"] = "", -- Basic_Training_-_Movement
+--      ["Zoom: [Rotate mouse wheel]"] = "", -- Basic_Training_-_Movement
 --      ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen
 }
--- a/share/hedgewars/Data/Locale/missions_de.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/missions_de.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -17,7 +17,7 @@
 Basic_Training_-_Flying_Saucer.desc="Mit einer fliegenden Untertasse erreicht man so ziemlich jeden Punkt, wenn man denn fliegen kann. Lern, wie man fliegt, wie man von einer fliegenden Untertasse aus angreift und probier ein paar coole Stunts aus."
 
 User_Mission_-_Dangerous_Ducklings.name=Gefährliche Entchen
-User_Mission_-_Dangerous_Ducklings.desc="Nun gut, Rekrut! Es ist Zeit, dass du das in der Grundausbildung Gelernte in die Tag umsetzt!"
+User_Mission_-_Dangerous_Ducklings.desc="Nun gut, Rekrut! Es ist Zeit, dass du das in der Grundausbildung Gelernte in die Tat umsetzt!"
 
 User_Mission_-_Diver.name=Taucher
 User_Mission_-_Diver.desc="Diese amphibische Angriffsstrategie ist schwieriger, als sie aussieht."
@@ -59,7 +59,7 @@
 Big_Armory.desc="Du bist alleine, hast ein volles Arsenal und musst 8 Igel besiegen, bevor die Zeit abläuft."
 
 Bazooka_Battlefield.name=Bazookaschlachtfeld
-Bazooka_Battlefield.desc="Deine treuen Ritter haben den Feind in einen Hinterhalt gelockt. Zerstöre sie nur mit Bazookas! Aber trödel nicht zu lange, denn das Wasser wird bald steigen."
+Bazooka_Battlefield.desc="Deine treuen Igel haben den Feind in einen Hinterhalt gelockt. Zerstöre sie nur mit Bazookas! Aber trödel nicht zu lange, denn das Wasser wird bald steigen."
 
 Tentacle_Terror.name=Tentakel-Terror
 Tentacle_Terror.desc="Unter einem furchtbaren Monster versteckt sich dein Feind wie ein Feigling und wird dich mit Luftangriffen angreifen, sobald du aus der Deckung gehst. Zeig ihm, wer in der Hölle das Sagen hat! Aber du brauchst schon teuflisch gute Seilfähigkeiten, um überhaupt eine Chance zu haben."
--- a/share/hedgewars/Data/Locale/missions_en.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/missions_en.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -53,7 +53,7 @@
 Big_Armory.desc="You are alone, have a full armory and must defeat 8 hedgehogs before the time runs out."
 
 Bazooka_Battlefield.name=Bazooka Battlefield
-Bazooka_Battlefield.desc="Your loyal knights have ambushed the enemy. Destroy them only with bazookas! But don't take too long, the water will rise soon."
+Bazooka_Battlefield.desc="Your loyal hedgehogs have ambushed the enemy. Destroy them only with bazookas! But don't take too long, the water will rise soon."
 
 Tentacle_Terror.name=Tentacle Terror
 Tentacle_Terror.desc="Below a terrible monster, your enemy is hiding like a coward and will attack you with air strikes as soon you lose cover. Show him who's the real boss in Hell! But you need some devilish good roping skills to even stand a chance."
--- a/share/hedgewars/Data/Locale/missions_gd.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/missions_gd.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -53,7 +53,7 @@
 Big_Armory.desc="Tha thu ’nad aonar, tha an arm-lann agad làn agus feumaidh tu ruaig a chur air 8 gràineagan mus fhalbh an ùine ort."
 
 Bazooka_Battlefield.name=Blàr a’ bhazooka
-Bazooka_Battlefield.desc="Rinn na ridirean dìleas agad fàth-feitheamh air an nàmhaid. Mill iad le bazookathan a-mhàin! Ach nach doir cus ùine on a dh’èireas an t-uisge a dh’aithghearr."
+Bazooka_Battlefield.desc="Rinn na gràineagan dìleas agad fàth-feitheamh air an nàmhaid. Mill iad le bazookathan a-mhàin! Ach nach doir cus ùine on a dh’èireas an t-uisge a dh’aithghearr."
 
 Tentacle_Terror.name=Maoimeadh nan greimichean
 Tentacle_Terror.desc="Tha do nàmhaid ghealtach ’na fhalach fo uilebheist uabhasach agus bheir e ort le ionnsaighean-adhair cho luath ’s a dh’fhàgas tu am fasgadh. Seall dha cò fìor-cheannard na h-ifrinne! Feumaidh tu a bhith uabhasach eòlach air an ròpa ach am bi teans agad."
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Locale/missions_zh_TW.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,98 @@
+Basic_Training_-_Movement.name=基本移動訓練
+Basic_Training_-_Movement.desc="新手從這裡開始!學習如何在不同地形移動以及如何切換刺蝟。"
+
+Basic_Training_-_Bazooka.name=基本火箭筒訓練
+Basic_Training_-_Bazooka.desc="學習如何使用火箭筒,了解風並摧毀所有目標。"
+
+Basic_Training_-_Grenade.name=基本手榴彈訓練
+Basic_Training_-_Grenade.desc="了解所有你需要知道有關手榴彈的資訊並摧毀所有目標。記住:拔掉插銷然後扔出去!"
+
+Basic_Training_-_Rope.name=基本繩索訓練
+Basic_Training_-_Rope.desc="繩索是你可以獲得最通用的工具之一,但使用它需要大量的練習。在這裡,你將學習繩索的基本知識。"
+
+Basic_Training_-_Flying_Saucer.name=基本飛碟訓練
+Basic_Training_-_Flying_Saucer.desc="如果你知道如何操作飛碟,你幾乎可以達到任何位置。學習如何飛行,如何在飛碟上攻擊,甚至學習如何進行一些很酷的特技表演。"
+
+User_Mission_-_Dangerous_Ducklings.name=危險小鴨
+User_Mission_-_Dangerous_Ducklings.desc="好吧,菜鳥!把時間用在實踐我們在基本訓練所學的!"
+
+User_Mission_-_Diver.name=潛水員
+User_Mission_-_Diver.desc="這個兩棲突擊任務比想像中來的困難。"
+
+User_Mission_-_Teamwork.name=團隊合作
+User_Mission_-_Teamwork.desc="一個故障的改造人正在守衛一個重要的軍事秘密。你需要帶領一支由兩隻刺猬組成的特殊作戰團隊,其任務是摧毀敵人以獲取秘密!為了我們後續的行動,讓兩隻刺猬都存活下來,絕對是關鍵。"
+
+User_Mission_-_Teamwork_2.name=團隊合作2
+User_Mission_-_Teamwork_2.desc="我們找到了機械帝國的一個秘密前哨,而且這裡只有一個無害的監視機器人守衛。帶領你的特殊作戰團隊摧毀監視機器人,以便我們佔領這個基地。和上個任務一樣,我們需要兩隻刺猬都存活下來!"
+
+User_Mission_-_Spooky_Tree.name=幽靈樹
+User_Mission_-_Spooky_Tree.desc="這裡有很多箱子。我當然希望鳥不會感到飢餓。"
+
+User_Mission_-_Bamboo_Thicket.name=竹林
+User_Mission_-_Bamboo_Thicket.desc="一個改造人正在竹林裡進行恐攻,精準的攻擊視野中的任何人。提前計劃,快速移動,並快速殲滅敵人!"
+
+User_Mission_-_That_Sinking_Feeling.name=沉沒的感覺
+User_Mission_-_That_Sinking_Feeling.desc="水迅速上升,時間有限。許多人嘗試過但都失敗了。你能救他們嗎?"
+
+User_Mission_-_Newton_and_the_Hammock.name=牛頓與吊床
+User_Mission_-_Newton_and_the_Hammock.desc="記住刺蝟:身體的速度保持不變,除非身體受到外力的作用!"
+
+User_Mission_-_The_Great_Escape.name=大逃亡
+User_Mission_-_The_Great_Escape.desc="逃離你的監獄後復仇!"
+
+User_Mission_-_Rope_Knock_Challenge.name=繩索撞擊
+User_Mission_-_Rope_Knock_Challenge.desc="利用你的繩索將所有的敵人撞倒在地。"
+
+User_Mission_-_Nobody_Laugh.name=沒有人在笑
+User_Mission_-_Nobody_Laugh.desc="哦,這些小丑的想法太有趣了!他們的數量可能超過我們,但我們有足夠的回合時間。一個接著一個地摧毀這些喜劇演員,直到沒有人在笑。"
+
+User_Mission_-_RCPlane_Challenge.name=遙控飛機挑戰
+User_Mission_-_RCPlane_Challenge.desc="使用遙控飛機獲得所有箱子。嘗試使用盡可能少的遙控飛機來提高你的等級。你想知道如何成為一流的精英飛行員嗎?"
+
+Big_Armory.name=大武器庫
+Big_Armory.desc="你獨自一人,有著完整的武器庫,必須在時間用完之前擊敗8隻刺猬"
+
+Bazooka_Battlefield.name=火箭筒戰場
+Bazooka_Battlefield.desc="你的刺蝟已經埋伏好敵人。使用火箭筒殲滅對方!但不能花費太多時間,因為水位很快將上升。"
+
+Tentacle_Terror.name=恐怖觸手
+Tentacle_Terror.desc="在一個可怕的怪物之下,你的敵人像懦夫一樣躲藏起來,一旦你失去掩護就會用空襲攻擊你。告訴他誰才是地獄中真正的老大!但你需要一些如惡魔般的繩索技能才有機會。"
+
+ClimbHome.name=爬上家裡
+ClimbHome.desc="你離家很遠,水也在上升。盡可能往上爬!"
+
+portal.name=傳送門挑戰
+portal.desc="使用傳送門移動,使用傳送門擊敗敵人,小心地使用傳送門!"
+
+Target_Practice_-_Bazooka_easy.name=打靶: 火箭筒 (簡單)
+Target_Practice_-_Bazooka_easy.desc="好了,士兵,盡可能快地炸毀那些目標!"
+
+Target_Practice_-_Bazooka_hard.name=打靶: 火箭筒 (困難)
+Target_Practice_-_Bazooka_hard.desc="你能擊中那些很遠的目標嗎?"
+
+Target_Practice_-_Cluster_Bomb.name=打靶: 集束炸彈
+Target_Practice_-_Cluster_Bomb.desc="有人需要來點熱水淋浴!"
+
+Target_Practice_-_Shotgun.name=打靶: 霰彈槍
+Target_Practice_-_Shotgun.desc="先開槍再說!"
+
+Basic_Training_-_Sniper_Rifle.name=打靶: 狙擊槍
+Basic_Training_-_Sniper_Rifle.desc="這是狙擊手的完美射擊場!盡可能快速準確地摧毀所有目標並成為傳奇!"
+
+Target_Practice_-_Homing_Bee.name=打靶: 蜜蜂槍
+Target_Practice_-_Homing_Bee.desc="蜜蜂槍的使用比想像的棘手。"
+
+Target_Practice_-_Grenade_easy.name=打靶: 手榴彈 (簡單)
+Target_Practice_-_Grenade_easy.desc="一個熱血擲彈兵的熱身訓練。"
+
+Target_Practice_-_Grenade_hard.name=打靶: 手榴彈 (困難)
+Target_Practice_-_Grenade_hard.desc="對新手沒什麼好說的!我們將把靶子放在一些真正棘手的位置。"
+
+Challenge_-_Speed_Shoppa_-_Hedgelove.name=搶時: 購物狂
+Challenge_-_Speed_Shoppa_-_Hedgelove.desc="展現你對繩索的熱愛並且收集小型地圖上的箱子。"
+
+Challenge_-_Speed_Shoppa_-_Ropes.name=搶時: 繩索和箱子
+Challenge_-_Speed_Shoppa_-_Ropes.desc="抓好你的繩索並且收集中型地圖上所有的箱子。"
+
+Challenge_-_Speed_Shoppa_-_ShoppaKing.name=搶時: 顧客至上
+Challenge_-_Speed_Shoppa_-_ShoppaKing.desc="展現出你王者的風範,盡快地收集完大型地圖上的箱子。"
--- a/share/hedgewars/Data/Locale/pl.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/pl.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -26,7 +26,6 @@
     ["Above-average pilot"] = "Nadprzeciętny pilot", -- User_Mission_-_RCPlane_Challenge
     ["Accuracy Bonus! +15 points"] = "Bonus za celność! +15 punktów", -- Space_Invasion
     ["Accuracy bonus: +%d points"] = "Bonus za celność! +%d punktów", -- Basic_Training_-_Sniper_Rifle
-    ["Ace"] = "As", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge
     ["Achievement gotten: %s"] = "Osiągnięcie zdobyte: %s", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_That_Sinking_Feeling, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, Basic_Training_-_Rope, Tumbler
     ["A Classic Fairytale"] = "Klasyczna bajka", -- A_Classic_Fairytale:first_blood
     ["A crate critical to this mission has been destroyed."] = "Skrzynia krytyczna dla tej misji została zniszczona.", -- SimpleMission
@@ -46,7 +45,6 @@
     ["Again with the 'cannibals' thing!"] = "Znowu z tymi \"kanibalami\"!", -- A_Classic_Fairytale:enemy
     ["A Hedgewars minigame"] = "Minigra Hedgewars", -- Capture_the_Flag
     ["A Hedgewars mini-game"] = "Minigra Hedgewars", -- Racer, Space_Invasion, TechRacer, Tumbler
-    ["a Hedgewars mini-game"] = "Minigra Hedgewars", -- Space_Invasion, The_Specialists
     ["A Hedgewars tag game"] = "Berek w Hedgewars", -- Mutant
     ["Ahhh, home, sweet home. Made it in %d seconds."] = "Ahhh, nie ma to jak w domu. Udało mi się w %d sekund.", -- ClimbHome
     ["Aim at the ceiling and hold [Attack] pressed until the rope attaches."] = "Wyceluj w sufit i przytrzymaj [Atak], aż lina się zaczepi.", -- Basic_Training_-_Rope
@@ -141,13 +139,14 @@
     ["As you've seen, the dropped grenade roughly fell into your flying direction."] = "Jak widziałeś, upuszczony granat z grubsza spadł w kierunku twojego lotu.", -- Basic_Training_-_Flying_Saucer
     ["Athlete"] = "Atleta", -- Battalion
     ["Attack: Activate"] = "Atak: Aktywuj", -- Racer
-    ["Attack Captain Lime before he attacks back"] = "Zaatakuj Kapitana Limonkę, zanim on zaatakuje", -- A_Space_Adventure:fruit02
+    ["Attack Captain Lime before he attacks back."] = "Zaatakuj Kapitana Limonkę, zanim odpowie ogniem.", -- A_Space_Adventure:fruit02
     ["Attack From Rope: %s"] = "Atak z liny: %s", -- WxW
     ["Attack From Rope: You may only attack from a rope."] = "Atak z liny: Możesz atakować tylko z liny", -- WxW
     ["Attack rule: %s"] = "Zasada ataku: %s", -- WxW
     ["Attack: Select this continent"] = "Atak: Wybierz ten kontynent", -- Continental_supplies
     ["Attack: [Space]"] = "Atak: [Spacja]", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
-    ["Attack the assassins before they attack back"] = "Zaatakuj zabójców, zanim oni zaatakują", -- A_Space_Adventure:fruit02
+    ["Attack: Tap the [Bomb]"] = "Atak: Wciśnij [Bomba]", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
+    ["Attack the assassins before they attack back."] = "Zaatakuj zabójców, zanim oni to zrobią.", -- A_Space_Adventure:fruit02
     ["Attack: Throw ball"] = "Atak: Rzuć kulę", -- Knockball
     ["At the end of the game your health was %d."] = "Na końcu gry, twoje zdrowie wynasiło %d.", -- A_Space_Adventure:ice01
     ["At the start of the game each enemy hog has only the weapon that he is named after."] = "Na początku gry, każdy wrogi jeż ma tylko tę broń, po której jest nazwany.", -- A_Space_Adventure:death02
@@ -155,16 +154,18 @@
     ["Available weapon specials:"] = "Dostępne speciały broni:", -- Continental_supplies
     ["Average pilot"] = "Przeciętny pilot", -- User_Mission_-_RCPlane_Challenge
     ["Avoid bazookas, red and blue invaders."] = "Unikaj bazook, czerwonych i niebieskich najeźdźców.", -- Space_Invasion
-    ["Avoid the mines!"] = "Unikaj min!", -- Basic_Training_-_Rope
     ["Axes"] = "Osie", -- Bazooka_Battlefield
     ["Aye! Fellow! Let me exit this chamber of doom!"] = "Tak! Kolega! Daj mi wyjść z komnaty zagłady!", -- A_Classic_Fairytale:epil
     ["Back Breaker"] = "Łamacz Pleców", -- A_Classic_Fairytale:backstab
     ["Back in the village, after telling the villagers about the threat..."] = "Tymczasem w wiosce, po powiadomieniu mieszkańców o zagrożeniu...", -- A_Classic_Fairytale:united
     ["Back in the village, the two tribes finally started to live in harmony."] = "Tymczasem w wiosce, dwa plemienia w końcu zaczęły żyć w harmonii.", -- A_Classic_Fairytale:epil
     ["Back Jump: [Backspace] ×2"] = "Skok w tył: [Backspace] x2", -- Basic_Training_-_Movement
+    ["Back Jump: Double-tap the [Curvy Arrow]"] = "Tylny skok: Wciśnij dwukrotnie [Zakręconą strzałkę]", -- Basic_Training_-_Movement
     ["Back Jumping (1/2)"] = "Skok w tył (1/2)", -- Basic_Training_-_Movement
     ["Back Jumping (2/2)"] = "Skok w tył (2/2)", -- Basic_Training_-_Movement
     ["Backstab"] = "Zdrada", -- A_Classic_Fairytale:backstab
+    ["Backwards jump: Press [Backspace] twice"] = "Skok w tył: Wciśnij dwukrotnie [Backspace]", -- A_Classic_Fairytale:first_blood
+    ["Backwards jump: Tap the [Curvy Arrow] twice"] = "Skok w tył: Wciśnij dwukrotnie [Zakręconą Strzałkę]", -- A_Classic_Fairytale:first_blood
     ["Bacon"] = "Bekon",
     ["Bad Guy"] = "Zły Koleś", -- User_Mission_-_The_Great_Escape
     ["Badmad"] = "Zływściekły", -- portal
@@ -197,7 +198,6 @@
     ["Bazooka Battlefield"] = "Bazookowe pole bitwy", -- Bazooka_Battlefield
     ["Bazooka Master"] = "Mistrz bazooki", -- Basic_Training_-_Bazooka
     ["Bazookas are influenced by wind."] = "Wiatr ma wpływ na bazookę.", -- Basic_Training_-_Bazooka
-    ["Bazooka Team"] = "Drużyna Bazooki", -- Basic_Training_-_Bazooka
     ["Bazooka Training"] = "Trening bazooki",
     ["Bearded Beast"] = "Brodata Bestia",
     ["Be careful, the future of Hogera is in your hands!"] = "Bądź ostrożny, przyszłość Jeżery leży w twoich rękach!", -- A_Space_Adventure:cosmos
@@ -231,7 +231,6 @@
     ["Bloodpie"] = "Krwiociasto", -- A_Classic_Fairytale:backstab
     ["Bloodrocutor"] = "Krwiolokator", -- A_Classic_Fairytale:shadow
     ["Bloodsucker"] = "Krwiowysysacz", -- A_Classic_Fairytale:shadow
-    ["Bloody Rookies"] = "Krwawe Żółtodzioby",
     ["Blue"] = "Niebieski",
     ["Blue Team"] = "Niebieska Drużyna", -- User_Mission_-_Dangerous_Ducklings
     ["Bob"] = "Bob", -- A_Space_Adventure:cosmos
@@ -314,7 +313,9 @@
     ["Challenge objectives"] = "Cele wyzwania", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit03, A_Space_Adventure:moon02
     ["Challenge over!"] = "Wyzwanie skończone!", -- User_Mission_-_Rope_Knock_Challenge
     ["Challenge"] = "Wyzwanie", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa, ClimbHome
+    ["Change bounciness: Tap [B]"] = "Zmień sprężystość: Wciśnij [B]", -- Basic_Training_-_Grenade
     ["Change Content: [Left], [Right]"] = "Zmień zawartość: [Lewo], [Prawo]", -- HedgeEditor
+    ["Change detonation timer: Tap the [Clock]"] = "Zmień czas detonatora: Wciśnij [Zegar]", -- Basic_Training_-_Grenade, A_Classic_Fairytale:shadow
     ["Change direction: [Left]/[Right]"] = "Zmień kierunek: [Lewo]/[Prawo]", -- Basic_Training_-_Grenade
     ["Change Health Boost: [Left], [Right]"] = "Zmień wzrost zdrowia: [Lewo], [Prawo]", -- HedgeEditor
     ["Change Health: [Left], [Right]"] = "Zmień zdrowie: [Lewo], [Prawo]", -- HedgeEditor
@@ -334,6 +335,8 @@
     ["Chicken"] = "Kurczak",
     ["Chief Sandologist"] = "Naczelny Piaskolog", -- A_Space_Adventure:desert01
     ["Chikorita"] = "Chikorita",
+    ["Choose location: Left click"] = "Wybierz lokację: Lewy klik", -- A_Classic_Fairytale:shadow
+    ["Choose location: Tap the [Target] button, then tap on the spot you want to choose"] = "Wybierz lokację: Wciśnij przycisk [Cel], a potem na punkt, który chcesz wybrać", -- A_Classic_Fairytale:shadow
     ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "Wybierz Zaznaczanie/Ustawianie/Usuwanie: [Lewo], [Prawo]", -- HedgeEditor
     ["Choose your continent wisely, as your decision will be permanent."] = "Wybierz swój kontynent mądrze, bo twoja decyzja będzie trwała.", -- Continental_supplies
     ["Choose your side! If you want to join the strange man, walk up to him.|Otherwise, walk away from him. If you decide to att...nevermind..."] = "Wybierz swoją stronę! Jeśli chcesz dołączyć do dziwnego mężczyzny, podejdź do niego.|W innym przypadku, odejdź od niego. Jeśli zdecydujesz się zaata... nieważne...", -- A_Classic_Fairytale:shadow
@@ -342,7 +345,6 @@
     ["Cleaver Placement Mode"] = "Tryb Stawiania Tasaków", -- Construction_Mode
     ["CLEAVER PLACEMENT MODE"] = "TRYB STAWIANIA TASAKÓW", -- HedgeEditor
     ["Cleaver"] = "Tasak", -- Construction_Mode
-    ["Climber"] = "Wspinacz", -- ClimbHome
     ["Climb Home"] = "Wspinaczka do domu", -- ClimbHome
     ["Closing in"] = "Nadejście", -- A_Classic_Fairytale:queen
     ["Clown"] = "Klaun", -- HedgeEditor
@@ -352,11 +354,13 @@
     ["Cluster Bomb Training"] = "Trening granatami odłamkowymi", -- Basic_Training_-_Cluster_Bomb
     ["Collateral Damage"] = "Dodatkowe Obrażenia", -- A_Classic_Fairytale:journey
     ["Collateral Damage II"] = "Dodatkowe Obrażenia II", -- A_Classic_Fairytale:journey
+    ["- Collect all the blue crates"] = "- Zbierz wszystkie niebieskie skrzynie", -- HedgeEditor
     ["Collect all the crates, but remember, our time in this life is limited!"] = "Zbierz wszystkie skrzynie, ale pamiętaj - nasz czas w tym życiu jest ograniczony!", -- A_Classic_Fairytale:first_blood
     ["Collect or destroy all the health crates."] = "Zbierz lub zniszcz wszystkie skrzynki ze zdrowiem.", -- User_Mission_-_RCPlane_Challenge
     ["Collect or destroy the final crate to finish the training."] = "Zbierz lub zniszcz ostatnią skrzynkę, by zakończyć trening.", -- Basic_Training_-_Flying_Saucer
+    ["- Collect the blue crate"] = "- Zbierz niebieską skrzynię", -- HedgeEditor
     ["Collect the crate and attack!"] = "Zbierz skrzynię i atakuj!", -- WxW
-    ["Collect the crate on the right.|Hint: Select the rope, [Up] or [Down] to aim, [Space] to fire, directional keys to move.|Ropes can be fired again in the air!"] = "Zbierz skrzynię po prawej.|Porada: Wybierz linę, [Góra] lub [Dół], by celować, [Spacja], by wystrzelić, klawisze kierunku, by się poruszać.|Liny mogą być wystrzelone ponownie w powietrzu!", -- A_Classic_Fairytale:first_blood
+    ["Collect the crate on the right."] = "Zbierz skrzynię po prawej.", -- A_Classic_Fairytale:first_blood
     ["Collect the crates within the time limit!|If you fail, you'll have to try again."] = "Zbierz skrzynie na czas!|Jeśli i się nie uda, będziesz musiał spróbować ponownie.", -- A_Classic_Fairytale:first_blood
     ["Collect the first crate to begin!"] = "Zbierz pierwszą skrzynię, by zacząć!", -- Basic_Training_-_Flying_Saucer
     ["Collect the freezer and get the device part from Thanta."] = "Zbierz zamrażarkę i zabierz część urządzenia Tancie.", -- A_Space_Adventure:ice01
@@ -424,7 +428,6 @@
     ["Crates left: %d"] = "Pozostałe skrzynie: %d", -- User_Mission_-_RCPlane_Challenge
     ["Crates Left:"] = "Pozostałe skrzynie:", -- User_Mission_-_RCPlane_Challenge
     ["Crates per turn: %d"] = "Skrzynie na turę: %d", -- WxW
-    ["crate(s)"] = "skrzyń", -- SpeedShoppa
     ["Crazy Gravity: Gravity randomly changes within a range from %i%% to %i%% with a period of %s"] = "Szalona grawitacja: Grawitacja losowo zmienia się w zakresie od %i%% do %i%%, z okresem %s", -- Gravity
     ["Crazy Runner"] = "Szalony Biegacz", -- A_Space_Adventure:moon02
     ["Cricket Time"] = "Czas na krykieta", -- Continental_supplies
@@ -457,11 +460,10 @@
     ["Deals 15 damage to all enemies in the circle."] = "Zadaje 15 obrażeń wszystkim wrogom w kole.", -- Continental_supplies
     ["Deer"] = "Jeleń",
     ["Defeat all enemies!"] = "Pokonaj wszystkich wrogów!", -- portal
+    ["Defeat!"] = "Porażka!", -- HedgeEditor
     ["Defeat Professor Hogevil!"] = "Pokonaj Profesora Jeżozło!", -- A_Space_Adventure:death01
+    ["Defeat the cannibals!"] = "Pokonaj kanibali!", -- A_Classic_Fairytale:shadow
     ["Defeat the cannibals!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "Pokonaj kanibali!|Porada do granatów: ustaw zapalnik używając [1-5], celuj [Góra]/[Dół] i przytrzymaj [Spację], by ustawić moc", -- A_Classic_Fairytale:shadow
-    ["Defeat the cannibals!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "Pokonaj kanibali!|Porada do granatów: ustaw zapalnik używając [1-5], celuj [Góra]/[Dół] i przytrzymaj [Spację], by ustawić moc", -- A_Classic_Fairytale:shadow
-    ["Defeat the cannibals"] = "Pokonaj kanibali", -- A_Classic_Fairytale:backstab
-    ["Defeat the cannibals!|"] = "Pokonaj kanibali!|", -- A_Classic_Fairytale:united
     ["Defeat the cyborgs!"] = "Pokonaj cyborgów!", -- A_Classic_Fairytale:enemy
     ["Defeat the enemy!"] = "Pokonaj wroga!", -- A_Classic_Fairytale:queen
     ["Delete Waypoint"] = "Usuń punkt kontrolny", -- HedgeEditor
@@ -482,11 +484,11 @@
     ["Destroyer of planes"] = "Niszczyciel samolotów", -- User_Mission_-_RCPlane_Challenge
     ["Destroy him, Leaks A Lot! He is responsible for the deaths of many of us!"] = "Zniszcz go, Spory Przecieku! On jest odpowiedzalny za śmierć wielu z nas!", -- A_Classic_Fairytale:first_blood
     ["Destroy invaders and collect bonuses to score points."] = "Niszcz najeźdźców i zbieraj bonusy, by zaliczać punkty.", -- Space_Invasion
-    ["Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."] = "Zniszcz cele!|Porada: Wybierz Ognistą Pięść i wciśnij [Spację]|P.S. Możesz używać jej także w powietrzu.", -- A_Classic_Fairytale:first_blood
-    ["Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"] = "Zniszcz cele!|Porada: [Góra], [Dół], by celować; [Spacja] by strzelić", -- A_Classic_Fairytale:first_blood
+    ["- Destroy the enemy"] = "- Zniszcz wroga", -- HedgeEditor
+    ["- Destroy the red target"] = "- Zniszcz czerwony cel", -- HedgeEditor
+    ["- Destroy the red targets"] = "- Zniszcz czerwone cele", -- HedgeEditor
     ["Destroy the targets!"] = "Zniszcz cele!", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
     ["+%d flamer fuel!"] = "+%d paliwa miotacza ognia!", -- Tumbler
-    ["%d Hapless Hogs left"] = "Zostało %d nieszczęśliwych jeży", -- User_Mission_-_That_Sinking_Feeling
     ["+%d health"] = "+%d zdrowia", -- Mutant
     ["%d-Hit Combo! +%d points!"] = "%d-krotne kombo! +%d punktów!", -- Space_Invasion
     ["Did anyone follow you?"] = "Czy ktoś cię śledził?", -- A_Classic_Fairytale:united
@@ -507,7 +509,6 @@
     ["Disguise as a Rockhopper Penguin"] = "Przebież się za Pingwina Rakietoskoczka", -- Continental_supplies
     ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "Przebranie za pingwina skalnegi: [Zamień miejsce z losowym wrogim jeżem w kole]", -- Continental_supplies
     ["Displacer"] = "Wypieracz",
-    ["Disqualified!"] = "Zdyskwalifikowany!", -- User_Mission_-_That_Sinking_Feeling
     ["Diver"] = "Nurek", -- User_Mission_-_Diver
     ["%d ms"] = "%d ms", -- HedgeEditor
     ["Doing stuff a monkey could do."] = "Robić rzeczy, które mogłaby zrobić małpa.", -- A_Classic_Fairytale:queen
@@ -594,10 +595,8 @@
     ["Elderbot"] = "Starszyrobot", -- A_Classic_Fairytale:family
     ["Elimate your captor."] = "Wyeliminuj swojego porywacza.", -- User_Mission_-_The_Great_Escape
     ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Wyeliminuj wszystkie cele, zanim upłynie czas.|W tej misji masz nieskończoną ilość amunicji.",
-    ["Eliminate the Blue Team before the time runs out."] = "Wyeliminuj Niebieską Drużynę, zanim upłynie czas.", -- User_Mission_-_Dangerous_Ducklings
     ["Eliminate the enemy before the time runs out."] = "Wyeliminuj wroga, zanim upłynie czas.", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree
     ["Eliminate the enemy hogs to win."] = "Wybij jeże przeciwnika by wygrać.",
-    ["Eliminate the enemy specialists."] = "Zabij specjalistów wroga.",
     ["Eliminate the enemy."] = "Wyeliminuj wroga.", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh
     ["Eliminate Unit 3378."] = "Wyeliminuj Jednostkę 3378.", -- User_Mission_-_Teamwork
     ["Eliminate WatchBot 4000."] = "Wyeliminuj PaczBota 4000.", -- User_Mission_-_Teamwork_2
@@ -622,13 +621,14 @@
     ["Exactly, man! That was my dream."] = "Dokładnie ziom! To był mój sen.", -- A_Classic_Fairytale:backstab
     ["Except me, of course! I just saved a whole planet!"] = "Oprócz mnie, oczywiście! Właśnie uratowałem całą planetę!", -- A_Space_Adventure:final
     ["Experienced beginner"] = "Doświadczony początkujący", -- User_Mission_-_RCPlane_Challenge
-    ["Explore the tunnel with the other hedgehogs and search for the device"] = "Przeszukaj tunel z innymi jeżami i szukaj urządzenia", -- A_Space_Adventure:fruit02
+    ["Explore the tunnel with the other hedgehogs and search for the device."] = "Przeszukaj tunel z innymi jeżami i poszukaj urządzenia.", -- A_Space_Adventure:fruit02
     ["Exploring the tunnel"] = "Eksploracja tunelu", -- A_Space_Adventure:fruit02
     ["Eye Chewer"] = "Przeżuwacz Oczu", -- A_Classic_Fairytale:journey
     ["Fair Wind"] = "Sprawiedliwy Wiatr",
     ["Fall Damage"] = "Obrażenia od upadku", -- Basic_Training_-_Movement
     ["Fallen Angel"] = "Upadły anioł", -- Tentacle_Terror
     ["Family Reunion"] = "Spotkanie rodzinne", -- A_Classic_Fairytale:family
+    ["Fastest escape: %d turns"] = "Najszybsza ucieczka: %d tur", -- A_Space_Adventure:desert02
     ["Fastest lap: %.3fs by %s"] = "Najszybsze okrążenie: %.3fs (%s)", -- TrophyRace
     ["Fastest lap: "] = "Najszybsze okrążenie: ",
     ["Feeble Resistance"] = "Ruch Oporu",
@@ -648,11 +648,12 @@
     ["Final result"] = "Końcowy rezultat", -- Mutant
     ["Final Targets"] = "Ostatnie cele", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
     ["Final team scores:"] = "Końcowe wyniki drużyn:", -- Space_Invasion
+    ["Find all the parts of the anti-gravity device."] = "Znajdź wszystkie części urządzenia antygrawitacyjnego.", -- A_Space_Adventure:cosmos
     ["Find a way to detonate all the explosives and stay alive!"] = "Znajdź sposób, by zdetonować wszystkie ładunki wybuchowe i przeżyć!", -- A_Space_Adventure:final
     ["Find your tribe!|Cross the lake!"] = "Znajdź swoje plemie!|Przekrocz jezioro!", -- A_Classic_Fairytale:dragon
     ["Finish this challenge as fast as possible to earn bonus points."] = "Ukończ to wyzwanie najszybciej, jak to możliwe, by zdobyć dodaktowe punkty.", -- User_Mission_-_Rope_Knock_Challenge
     ["Finish waypoint placement"] = "Zakończ stawianie punktów kontrolnych", -- Racer
-    ["Finish your training|Hint: Animations can be skipped with the [Precise] key."] = "Ukończ swój trening|Porada: Animacje mogą być pominięte przyciskiem [Precyzja]", -- A_Classic_Fairytale:first_blood
+    ["Finish your training."] = "Ukończ swój trening.", -- A_Classic_Fairytale:first_blood
     ["Finite Ropes"] = "Skończone liny", -- Basic_Training_-_Rope
     ["Fire a rocket with napalm."] = "Strzel rakietą z napalmem.", -- Continental_supplies
     ["Fire: [Precise]"] = "Strzel: [Precyzja]", -- Space_Invasion, Tumbler
@@ -680,6 +681,7 @@
     ["Flying Saucer Training"] = "Trening latającego talerza", -- Basic_Training_-_Flying_Saucer
     ["Fly into space to fight off the invaders with barrels!"] = "Leć w kosmos, by odeprzeć najeźdźców beczkami!", -- Space_Invasion
     ["Fly to the meteorite and detonate the explosives"] = "Poleć do meteorytu i zdetonuj ładunki", -- A_Space_Adventure:cosmos
+    ["Follow the path and destroy the next target."] = "Podążaj ściezką i zniszcz następny cel.", -- Basic_Training_-_Rope
     ["Forgetfulness: You will lose all your weapons each turn."] = "Zapominalstwo: W każdej turze stracisz wszystkie swoje bronie.", -- Continental_supplies
     ["For the next crate, you have to do back jumps."] = "Do następnej skrzyni musisz zrobić skoki w tył.", -- Basic_Training_-_Movement
     ["Four Eyes"] = "Czterooki",
@@ -699,8 +701,6 @@
     ["“g=150”, where 150 is 150% of normal gravity."] = "\"g=150\", gdzie 150 to 150% normalnej grawitacji.", -- Gravity
     ["“g=50, g2=150, period=4000” for gravity changing|from 50 to 150 and back with period of 4000 ms."] = "\"g=50, g2=150, period=4000\" dla grawitacji zmieniającej|się od 50 do 150 i z powrotem, z okresem 4000 ms.", -- Gravity
     ["Galaxy Guardians"] = "Galaktyczni Strażnicy", -- Big_Armory
-    ["Game Modifiers: "] = "Modyfikatory: ",
-    ["GAME OVER!"] = "KONIEC GRY!",
     ["Game over!"] = "Koniec gry", -- Space_Invasion
     ["Game Started!"] = "Gra rozpoczęta!",
     ["Game? Was this a game to you?!"] = "Gra? To była dla ciebie gra?", -- A_Classic_Fairytale:enemy
@@ -710,18 +710,16 @@
     ["Gasp! A smuggler!"] = "*dyszy* Przemytnik!", -- A_Space_Adventure:desert01
     ["Gasp!"] = "*dyszy*", -- A_Space_Adventure:desert01
     ["Gathering fruits all day long."] = "Zbieram owoce przez całe dnie.", -- A_Classic_Fairytale:queen
-    ["Gear information hidden"] = "Informacje o rzeczach ukryte", -- HedgeEditor
-    ["Gear information shown"] = "Informacje o rzeczach pokazane", -- HedgeEditor
     ["Gear Placement Tool"] = "Narzędzie Ustawiania Rzeczy", -- HedgeEditor
+    ["General information"] = "Ogólne informacje", -- Continental_supplies
     ["General information:"] = "Ogólne informacje:", -- Continental_supplies
-    ["General information"] = "Ogólne informacje", -- Continental_supplies
     ["General Lemon"] = "Generał Cytryna", -- A_Space_Adventure:fruit01
     ["Generator: Generates energy."] = "Generator: Generuje energię.", -- Construction_Mode
     ["Generator"] = "Generator", -- Construction_Mode
     ["Get Dense Cloud out of the pit!"] = "Wydostań Gęstą Chmurę z dołu!", -- A_Classic_Fairytale:journey
     ["Get him, Spike!"] = "Bierz go, Kolczasy!", -- A_Space_Adventure:desert01
     ["Get on over there and take him out!"] = "Dostań się tam i go wykończ!",
-    ["Get on the head of the mole"] = "Wejdź na głowę kreta", -- A_Classic_Fairytale:first_blood
+    ["Get on the head of the mole."] = "Wejdź na głowę jeża.", -- A_Classic_Fairytale:first_blood
     ["Get past the flower."] = "Przejdź przez kwiatek.", -- A_Classic_Fairytale:journey
     ["Get ready to fight!"] = "Przygotuj się do walki!", -- A_Space_Adventure:moon01
     ["Get that crate!"] = "Zdobądź tę skrzynię!", -- A_Classic_Fairytale:first_blood
@@ -759,7 +757,6 @@
     ["GO! GO! GO!"] = "RUCHY! RUCHY! RUCHY!",
     ["Good birdy......"] = "Dobry ptaszek......",
     ["Good bye!"] = "Do widzenia!", -- Basic_Training_-_Flying_Saucer
-    ["Good Dude"] = "Dobry Kolo", -- User_Mission_-_The_Great_Escape
     ["Good idea, they'll never find us there!"] = "Dobry pomysł, nigdy nas tu nie znajdą!", -- A_Classic_Fairytale:united
     ["Good job! Defeat the rest of the aliens!"] = "Dobra robota! Pokonaj resztę obcych!", -- A_Classic_Fairytale:queen
     ["Good job!"] = "Dobra robota!", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
@@ -770,7 +767,7 @@
     ["Good so far!"] = "Jak dotąd idzie dobrze!",
     ["Good to go!"] = "Gotowi do akcji!",
     ["Good! You now control Cappy."] = "Dobrze! Teraz kontrolujesz Czapeczkę.", -- Basic_Training_-_Movement
-    ["Go on top of the flower"] = "Wejdź na szczyt kwiatka", -- A_Classic_Fairytale:first_blood
+    ["Go on top of the flower."] = "Wejdź na szczyt kwiatka.", -- A_Classic_Fairytale:first_blood
     ["Go, quick!"] = "Idź szybko!", -- A_Classic_Fairytale:backstab
     ["Gorkij"] = "Gorkij", -- A_Classic_Fairytale:journey
     ["Go surf!"] = "Idź serfować!", -- WxW
@@ -791,7 +788,6 @@
     ["Great!"] = "Świetnie!", -- Basic_Training_-_Rope
     ["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"] = "Świetna robota! Teraz uderz go swoim kijem bejsbolowym!|Porada: Możesz zmienić broń 'Prawym kliknięciem'!", -- Basic_Training_-_Rope
     ["Great! You will be contacted soon for assistance."] = "Świetnie! Niedługo skontaktujemy się z tobą po pomoc.", -- A_Classic_Fairytale:shadow
-    ["Green Bananas won!"] = "Zielone Banany wygrywają!", -- A_Space_Adventure:fruit01
     ["Green Bananas"] = "Zielone Banany", -- A_Space_Adventure:fruit01
     ["Green double rings also give you a new flying saucer."] = "Zielone podwójne pierścienie również dają nowy latający talerz.", -- A_Space_Adventure:ice02
     ["Green Hog Grape"] = "Zielonojeżowy Winogron", -- A_Space_Adventure:fruit01
@@ -803,11 +799,8 @@
     ["Greetings, cloudy one!"] = "Witaj, chmurzysty", -- A_Classic_Fairytale:shadow
     ["Greetings from the Navy, %s (%s), for being a distance of %d away from the mainland!"] = "Pozdrowienia od Marynarki, %s (%s), za bycie w odległości %d od lądu!", -- ClimbHome
     ["Greetings, %s!"] = "Pozdrowienia, %s!", -- A_Classic_Fairytale:dragon
-    ["Greg"] = "Grzegorz", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
-    ["Grenade Group"] = "Granatowa Grupa", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard
     ["Grenades explode after 1 to 5 seconds (you decide)."] = "Granat wybucha po 1 do 5 sekundach (ty wybierasz).", -- Basic_Training_-_Grenade
     ["Grenades with high bounciness bounce a lot and behave chaotic."] = "Granat z dużą odbijalnością odbija się bardzo dużo i zachowuje chaotycznie.", -- Basic_Training_-_Grenade
-    ["Grenade Team"] = "Granatowa drużyna", -- Basic_Training_-_Grenade
     ["Grenade Training"] = "Trening Granatowy", -- Basic_Training_-_Grenade
     ["Grenadier"] = "Grenadier", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor
     ["Grenadiers"] = "Grenadierzy", -- Basic_Training_-_Grenade
@@ -847,7 +840,6 @@
     ["Health Modification Mode"] = "Tryb Modyfikacji Zdrowia", -- HedgeEditor
     ["HEALTH MODIFICATION MODE"] = "TRYB MODYFIKACJI ZDROWIA", -- HedgeEditor
     ["Health"] = "Zdrowie", -- Basic_Training_-_Movement
-    ["Heartful"] = "Serdeczny", -- Challenge_-_Speed_Shoppa_-_Hedgelove
     ["Heavenly Defense"] = "Niebiańska obrona", -- Tentacle_Terror
     ["Heavy Cannfantry"] = "Ciężka Kanibaleria", -- A_Classic_Fairytale:united
     ["Heavy"] = "Ciężki",
@@ -857,9 +849,10 @@
     ["HEDGEEDITOR"] = "JEŻEDYTOR", -- HedgeEditor
     ["HedgeEditor tool"] = "Narzędzie JeżEdytora", -- HedgeEditor
     ["Hedgehog"] = "Jeż",
+    ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "Jeżowy pocisk: [Wystrzel swojego jeża jak minę samoprzylepną]", -- Continental_supplies
     ["Hedgehog Projectile"] = "Pocisk jeżowy", -- Continental_supplies
-    ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "Jeżowy pocisk: [Wystrzel swojego jeża jak minę samoprzylepną]", -- Continental_supplies
     ["Hedgehogs can not be deleted."] = "Jeże nie mogą być usunięte", -- HedgeEditor
+    ["Hedgehogs left: %d"] = "Pozostałe jeże: %d", -- User_Mission_-_That_Sinking_Feeling
     ["Hedgehogs will be revived after their death."] = "Jeże zostaną ożywione po śmierci.", -- Mutant
     ["Hedgehogs will start in the first waypoint."] = "Jeże zaczną na pierwszym punkcie kontrolnym.", -- Racer
     ["Hedgibal Lecter"] = "Hanijeż Lekter", -- A_Classic_Fairytale:backstab
@@ -875,7 +868,6 @@
     ["Help Enabled"] = "Pomoc włączona", -- HedgeEditor
     ["Helpers: Each team starts with %d helper points"] = "Pomocnicy: Każda drużyna zaczyna z %d punktami pomocniczymi", -- Battalion
     ["Helpers: Hogs will get 1 out of 2 helpers randomly each turn"] = "Pomocnicy: Jeże dostaną losowo 1 z 2 pomocników co turę", -- Battalion
-    ["Help Hog Solo to find all the parts of the anti-gravity device."] = "Pomóż Hogowi Solo znaleźć wszystkie części urządzenia antygrawitacyjnego.", -- A_Space_Adventure:cosmos
     ["Help me, Leaks!"] = "Przeciek, pomóż mi!", -- A_Classic_Fairytale:journey
     ["Help me, please!!!"] = "Pomóż mi, proszę!!!", -- A_Classic_Fairytale:journey
     ["Help me, please!"] = "Pomóż mi, proszę!", -- A_Classic_Fairytale:journey
@@ -890,20 +882,20 @@
     ["Here you will find the current mission instructions."] = "Tutaj znajdziesz instrukcje do aktualnej misji", -- Basic_Training_-_Movement
     ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "Tutaj poznasz jak lata się latającym talerzem|i będziesz mieć szansę poznać odlotowe sztuczki.", -- Basic_Training_-_Flying_Saucer
     ["Heroic Wind"] = "Heroiczny wiatr", -- Continental_supplies
-    ["Hero Team"] = "Drużyna Bohatera", -- User_Mission_-_The_Great_Escape
     ["He's so brave..."] = "Jest taki odważny...", -- A_Classic_Fairytale:first_blood
     ["He was the lab assistant of Dr. Goodhogan, the inventor of the anti-gravity device."] = "Był asystentem laboratoryjnym Dr Dobrojeża, wynalazcy urządzenia antygrawitacyjnego.", -- A_Space_Adventure:moon02
     ["He won't be selling us out anymore!"] = "On już nas nie sprzeda!", -- A_Classic_Fairytale:backstab
     ["Hey, don't forget us! We still need to climb up!"] = "Hej, nie zapomnij o nas! Nadal potrzebujemy się wspiąć!", -- A_Classic_Fairytale:family
     ["Hey, guys!"] = "Hej, koledzy!", -- A_Classic_Fairytale:backstab
     ["Hey guys!"] = "Hej koledzy!", -- A_Classic_Fairytale:united
-    ["Hey, Hog Solo! Finally you have come!"] = "Hej, Hog Solo! Nareszcie przybyłeś!", -- A_Space_Adventure:moon01
     ["Hey! I was supposed to collect it!"] = "Hej! Miałem ją zebrać!", -- A_Space_Adventure:fruit02
+    ["Hey, %s! Finally you have come!"] = "Hej, %s! W końcu przyszedłeś!", -- A_Space_Adventure:moon01
     ["Hey, %s! Look, someone is stealing the saucer!"] = "Hej, %s! Zobacz, ktoś kradnie nasz talerz!", -- A_Space_Adventure:cosmos
     ["Hey! This is cheating!"] = "Hej! To oszukiwanie!", -- A_Classic_Fairytale:journey
     ["Hidden"] = "Ukryte", -- portal
     ["High Gravity: Gravity is %i%%"] = "Wysoka grawitacja: Grawitacja wynosi %i%%", -- Gravity
     ["High Jump: [Backspace]"] = "Wysoki skok: [Backspace]", -- Basic_Training_-_Movement
+    ["High Jump: Tap the [Curvy Arrow] shortly"] = "Wysoki skok: Wciśnij krótko [Zakręconą strzałkę]", -- Basic_Training_-_Movement
     ["Highlander: Eliminate hogs to take their weapons"] = "Highlander: Wyeliminuj jeże, by zabrać ich bronie", -- Highlander
     ["Highland: Hogs get %d random weapons from their pool"] = "Wyżyna: Jeże dostają %d losowych broni ze swoich pul", -- Battalion
     ["--- Highland Mode ---"] = "Tryb wyżyny", -- Battalion
@@ -913,20 +905,24 @@
     ["Hightower"] = "Wysowieża",
     ["Hill Guard"] = "Straż górna", -- Bazooka_Battlefield
     ["Hi! Nice to meet you."] = "Cześć! Miło cię poznać.", -- A_Space_Adventure:ice01
-    ["Hint: Double Jump - Press [Backspace] twice"] = "Wskazówka: Podwójny skok - Wciśnij [Backspace] dwa razy", -- A_Classic_Fairytale:first_blood
+    ["Hint: Cinematics can be skipped with the [Precise] key."] = "Porada: Przerywniki mogą zostać pominięte klawiszem [Precyzja].", -- A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
     ["Hint: Drilling holes should solve everything."] = "Wywiercenie dziur powinno wszystko rozwiązać.", -- A_Classic_Fairytale:family
     ["Hint: Hold down [M] to review the mission texts."] = "Wskazówka: Przytrzymaj [M], by zobaczyć teksty misji.", -- A_Classic_Fairytale:first_blood
     ["Hint: If this mission panel disappears, you can|see it again by hitting the Pause or Quit key."] = "Wskazówka: Jeśli panel misji zniknie, możesz zobaczyć go ponownie, wciskając Pauzę lub Wyjście.", -- Basic_Training_-_Movement
     ["Hint: It might be a good idea to place a girder before starting to drill. Just saying."] = "Wskazówka: To może być dobry pomysł, by ustawić belki przed rozpoczęciem wiercenia. Tylko mówię.", -- A_Classic_Fairytale:family
     ["Hint: It might be easier if you vary the angle only slightly."] = "Wskazówka: Może być łatwiej, jeśli zmienisz kąt tylko trochę.", -- Basic_Training_-_Bazooka
+    ["Hint: Just select the parachute, it opens automatically when you fall."] = "Porada: Po prostu wybierz spadochron. Otwiera się automatycznie, gdy spadasz.", -- A_Classic_Fairytale:first_blood
     ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "Wskazówka: Zabójstwa nie przetransferują puli jeża do puli zabójcy", -- Battalion
     ["Hint: Launch the bazooka horizontally at full power."] = "Wskazówka: Wystrzel bazookę poziomo z pełną mocą.", -- Basic_Training_-_Bazooka
-    ["Hint: Press [Esc] to review the mission texts."] = "Porada: Wciśnij [Esc], by zobaczyć teksty misji.", -- A_Classic_Fairytale:first_blood
+    ["Hint: Pause the game to review the mission texts."] = "Porada: Spauzuj grę, by zobaczyć tekst misji.", -- A_Classic_Fairytale:first_blood
     ["Hint: Select the blow torch, aim and press [Fire]. Press [Fire] again to stop."] = "Porada: Wybierz palnik, wyceluj i wciśnij [Strzał]. Wciśnij ponownie [Strzał], by się zatrzymać.", -- A_Classic_Fairytale:journey
     ["Hint: Select the low gravity and press [Fire]."] = "Porada: Wybierz niską grawitację i wciśnij [Strzał].", -- A_Classic_Fairytale:journey
+    ["Hint: Select the rope, [Up] or [Down] to aim, [Attack] to fire, directional keys to move."] = "Porada: Wybierz linę, [Góra] lub [Dół], by celować, [Atak], by strzelić, klawisze kierunkowe, by się poruszać.", -- A_Classic_Fairytale:first_blood
+    ["Hint: Select the Shoryuken and hit [Attack].|P.S.: You can use it mid-air."] = "Porada: Wybierz Ognistą pięść i wciśnij [Atak].|PS Możesz użyć jej w powietrzu.", -- A_Classic_Fairytale:first_blood
     ["Hint: %s needs to get really close to the princess!"] = "Wskazówka: %s potrzebuje dostać się naprawdę blisko księżniczki!", -- A_Classic_Fairytale:family
     ["Hint: The rope only bends around objects.|When it doesn't hit anything, it's always straight."] = "Wskazówka: Lina owija się jedynie wokół obiektów.|Jeśli nic nie uderzy, zawsze jest prosta.", -- Basic_Training_-_Rope
     ["Hint: To jump higher, wait a bit before you hit “High Jump” a second time."] = "Wskazówka: By skoczyć wyżej, poczekaj trochę zanim ponownie wciśniesz \"Wysoki skok\".", -- Basic_Training_-_Movement
+    ["Hint: To place a girder, select it,|then use [Left] and [Right] to select angle and length,|then choose a location for the girder."] = "Porada: By ustawić belkę wybierz ją,|potem użuj [Lewo] i [Prawo], by wybrać kąt i długość,|a potem wybierz położenie belki.", -- A_Classic_Fairytale:shadow
     ["Hint: Use the quit key to see the team’s continent."] = "Porada: Uzyj klawisza wyjścia, by zobaczyć kontynent drużyny", -- Continental_supplies
     ["Hint: When you shorten the rope, you move faster!|And when you lengthen it, you move slower."] = "Wskazówka: Kiedy skrócisz linę poruszasz się szybciej!|A kiedy ją wydłużysz, poruszasz się wolniej.", -- Basic_Training_-_Rope
     ["--- Hint ---"] = "--- Wskazówka ---", -- Battalion
@@ -962,24 +958,11 @@
     ["Hogminator"] = "Jeżminator", -- A_Classic_Fairytale:family
     ["Hog nueve"] = "Jeż nueve", -- A_Space_Adventure:fruit03
     ["Hog octo"] = "Jeż okto", -- A_Space_Adventure:fruit03
-    ["Hogonauts"] = "Jeżonauci", -- Basic_Training_-_Flying_Saucer
     ["Hog onze"] = "Jeż onze", -- A_Space_Adventure:fruit03
     ["Hog Saturn"] = "Jeż Saturn", -- A_Space_Adventure:fruit03
     ["Hogs in sight!"] = "Jeż na widoku!", -- Continental_supplies
     ["Hog Solo and GB"] = "Hog Solo i ZB", -- A_Space_Adventure:fruit02
-    ["Hog Solo arrived at the Desert Planet!"] = "Hog Solo przybył na Pustynną Planetę!", -- A_Space_Adventure:cosmos
-    ["Hog Solo arrived at the Fruit Planet!"] = "Hog Solo przybył na Planetę Owoców!", -- A_Space_Adventure:cosmos
-    ["Hog Solo arrived at the Ice Planet!"] = "Hog Solo przybył na Lodową Planetę!", -- A_Space_Adventure:cosmos
-    ["Hog Solo arrived at the meteorite!"] = "Hog Solo przybył na meteoryt!", -- A_Space_Adventure:cosmos
-    ["Hog Solo arrived at the moon!"] = "Hog Solo przybył na księżyć!", -- A_Space_Adventure:cosmos
-    ["Hog Solo arrived at the Planet of Death!"] = "Hog Solo przybył na Planetę Śmierci!", -- A_Space_Adventure:cosmos
-    ["Hog Solo couldn't escape, try again!"] = "Hog Solo nie mógł uciec, spróbuj ponownie!", -- A_Space_Adventure:fruit01
-    ["Hog Solo escaped successfully!"] = "Hog Solo uciekł pomyślnie!", -- A_Space_Adventure:fruit01
-    ["Hog Solo has to reach the last crates"] = "Hog Solo musi dostać się do ostatnich skrzyń", -- A_Space_Adventure:fruit02
-    ["Hog Solo has to refuel his saucer."] = "Hog Solo musi uzupełnić paliwo w swoim spodku.", -- A_Space_Adventure:moon01
     ["Hog Solo"] = "Hog Solo", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01, A_Space_Adventure:moon02
-    ["Hog Solo lost, try again!"] = "Hog Solo przegrał, spróbuj ponownie!", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
-    ["Hog Solo wins, congratulations!"] = "Hog Solo wygrywa, gratulacje!", -- A_Space_Adventure:moon01
     ["- Hogs will be revived"] = "- Jeże zostaną ożywione", -- Capture_the_Flag
     ["- Hogs will drop the flag when killed"] = "Jeże upuszczą flagę po zginięciu", -- Capture_the_Flag
     ["Hog two"] = "Jeż dwa", -- A_Space_Adventure:fruit03
@@ -989,9 +972,7 @@
     ["Homing Bee"] = "Pszczoła", -- Construction_Mode
     ["Honda"] = "Honda",
     ["Honest Lee"] = "Szczery Li", -- A_Classic_Fairytale:enemy
-    ["Hook"] = "Hak", -- Challenge_-_Speed_Shoppa_-_Ropes
     ["Hooks"] = "Haki",
-    ["Hooray!"] = "Hurra!",
     ["Hooray! I actually did it! Hogera is safe!"] = "Hurra! Jednak mi się udało! Jeżera jest bezpieczna!", -- A_Space_Adventure:final
     ["Hooray! I've found it, now I have to get back to Captain Lime!"] = "Hurra! Znalazłem to. Teraz muszę wrócić do Kapitana Limonki.", -- A_Space_Adventure:fruit02
     ["Hooray! You are a champion!"] = "Hurra! Jesteś mistrzem!", -- A_Space_Adventure:ice02
@@ -1007,7 +988,7 @@
     ["However, if you fail to do so, she dies a most violent death, just like your friend! Muahahaha!"] = "Jednakże, jeśli nie uda ci się tego zrobić, ona umrze najbardziej brutalną śmiercią, tak jak twój przyjaciel! Muahahaha!", -- A_Classic_Fairytale:journey
     ["However, if you fail to do so, she dies a most violent death! Muahahaha!"] = "Jednakże, jeśli nie uda ci się tego zrobić, ona umrze najbardziej brutalną śmiercią! Muahahaha!", -- A_Classic_Fairytale:journey
     ["However, my mates don't agree with me on letting you go..."] = "Jednakże, moi kumple nie zgodzą się ze mną, by cię wypuścić...", -- A_Classic_Fairytale:dragon
-    ["However, the army of Yellow Watermelons is about to attack any moment now."] = "Jednakże, armia Żółtych Arbuzów może zaatakować w każdej chwili.", -- A_Space_Adventure:fruit01
+    ["However, the army of %s is about to attack any moment now."] = "Jednakże, armia %s może zaatakować w każdej chwili.", -- A_Space_Adventure:fruit01
     ["How to Rope"] = "Jak używać liny", -- Basic_Training_-_Rope
     ["How would you like being discriminated against?"] = "Jak podoba ci się bycie dyskryminowanym?", -- A_Classic_Fairytale:queen
     ["Huh?"] = "Huh?", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen
@@ -1028,7 +1009,6 @@
     ["I can't let you go further because …"] = "Nie mogę pozwolić ci pójść dalej, bo...", -- A_Classic_Fairytale:queen
     ["I can't wait any more, I have to save myself!"] = "Nie mogę już dłużej czekać, muszę się ratować!", -- A_Classic_Fairytale:shadow
     ["Ice Jake"] = "Lodowy Dżejk", -- A_Space_Adventure:ice01
-    ["Ice"] = "Lód", -- Basic_Training_-_Movement
     ["I could just teleport myself there..."] = "Mógłbym się tam po prostu teleportować.", -- A_Classic_Fairytale:family
     ["Icy Girder: [3]"] = "Lodowa Belka: [3]", -- HedgeEditor
     ["Icy Land: [3]"] = "Lodowy Teren: [3]", -- HedgeEditor
@@ -1085,7 +1065,6 @@
     ["I just found out that they have captured your princess!"] = "Właśnie się dowiedziałem, że porwali waszą księżniczkę!", -- A_Classic_Fairytale:family
     ["I just want the strange device you found!"] = "Chcę po prostu to dziwne urządzenie, które znalazłeś!", -- A_Space_Adventure:ice01
     ["I just wonder where Ramon and Spiky disappeared..."] = "Zastanawiam się, gdzie podziali się Ramon i Kolczasty.", -- A_Classic_Fairytale:journey
-    ["Ikeda"] = "Ikeda", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
     ["I know and I'm terribly sorry!"] = "Wiem, i strasznie mi przykro!", -- A_Classic_Fairytale:epil
     ["I know, my hero!"] = "Wiem, mój bohaterze!", -- A_Classic_Fairytale:epil
     ["I know that your resources are low due to the battle but I'll send two of my best hogs to assist you."] = "Wiem, że twoje zasoby są na wyczerpaniu z powodu bitwy, ale wyślę dwóch z moich najlepszych jeży, by cię wsparli.", -- A_Space_Adventure:fruit02
@@ -1113,6 +1092,7 @@
     ["I'm living a dream!"] = "Przeżywam sen!", -- A_Classic_Fairytale:queen
     ["I'm not sure about that!"] = "Nie jestem tego pewny!", -- A_Classic_Fairytale:united
     ["IMPORTANT: To see the mission panel again, hold the mission panel key."] = "WAŻNE: By ponownie zobaczyć panel misji, przytrzymaj klawisz panelu misji.", -- Basic_Training_-_Movement
+    ["IMPORTANT: To see the mission panel again, pause the game."] = "WAŻNE: By zobaczyć ponownie panel misji, zapauzuj grę.", -- Basic_Training_-_Movement
     ["IMPORTANT: To see the mission panel again, use the quit or pause key."] = "WAŻNE: By zobaczyć panel misji ponownie, użyj przycisku wyjścia lub pauzy.", -- Basic_Training_-_Movement
     ["Impressive...you are still dry as the corpse of a hawk after a week in the desert..."] = "Imponujące... nadal jesteś suchy, jak zwłoki jastrzębia po tygodniu na pustyni...", -- A_Classic_Fairytale:first_blood
     ["%i ms"] = "%i ms", -- Gravity
@@ -1270,7 +1250,6 @@
     ["Kill The Leader: You must also hit the team with the most health."] = "Zabij Przywódcę: Musisz również uderzyć drużynę z największą ilością zdrowia.", -- WxW
     ["Kill The Leader"] = "Zabij Przywódcę", -- WxW
     ["Kill the traitor, %s, or spare his life!"] = "Zabij zdrajcę, %s, lub oszczędź mu życie!", -- A_Classic_Fairytale:backstab
-    ["King Customer"] = "Król Klient", -- Challenge_-_Speed_Shoppa_-_ShoppaKing
     ["--- King ---"] = "--- Król ---", -- Battalion
     ["King"] = "Król", -- Battalion
     ["--- King Mode ---"] = "--- Tryb Króla ---", -- Battalion
@@ -1291,7 +1270,7 @@
     ["Launch some bazookas to destroy the targets!"] = "Wystrzel trochę bazook i zniszcz cele!", -- Basic_Training_-_Bazooka
     ["Leaderbot"] = "Dowódcobot", -- A_Classic_Fairytale:queen
     ["Leader"] = "Dowódca", -- A_Classic_Fairytale:enemy
-    ["Lead the Green Bananas to battle and eliminate all the enemies!"] = "Poprowadź Zielone Banany do walki i wyeliminuj wszystkich wrogów!", -- A_Space_Adventure:fruit01
+    ["Lead your allies to battle and eliminate all the enemies!"] = "Poprowadź swoich sprzymierzeńców do walki i wyeliminuj wszystkich wrogów!", -- A_Space_Adventure:fruit01
     ["Leaks A Lot, depressed for killing his loved one, failed to save the village..."] = "Spory Przeciek, przygnębiony po zabiciu ukochanej, zawiódł w ratowaniu wioski...", -- A_Classic_Fairytale:journey
     ["Leaks A Lot gave his life for his tribe! He should have survived!"] = "Spory Przeciek oddał swoje życie dla jego plemienia! Powinien był przeżyć!", -- A_Classic_Fairytale:first_blood
     ["Leaks A Lot must survive!"] = "Spory Przeciek musi przeżyć!", -- A_Classic_Fairytale:journey
@@ -1306,7 +1285,6 @@
     ["Left/right: Choose crate contents"] = "Left/right: Wybierz zawartość skrzyni", -- Construction_Mode
     ["Left/right: Choose structure type|Cursor: Build structure"] = "Left/right: Wybierz rodzaj struktury|Kursor: Zbuduj strukturę", -- Construction_Mode
     ["Left/right: Choose structure type"] = "Lewo/Prawo: Wybierz typ struktury", -- Construction_Mode
-    ["Left Tong"] = "Lewy Tong", -- Bazooka_Battlefield
     ["Legs"] = "Nogi",
     ["Less tools, more fun"] = "Mniej narzędzi, więcej zabawy", -- Battalion
     ["Lestat"] = "Lestat", -- portal
@@ -1333,20 +1311,21 @@
     ["Little did they know that this hunt will mark them forever..."] = "Nie zdają sobie sprawy, że to polowanie naznaczy ich na zawsze...", -- A_Classic_Fairytale:shadow
     ["Little Obstacle Course"] = "Mały tor przeszkód", -- Basic_Training_-_Rope
     ["Lively Lifeguard"] = "Żwawy Ratownik",
+    ["Lonely Cries: [Rise the water if no hog is in the circle and deal 6 damage to all enemy hogs.]"] = "Samotne łkanie: [Podnosi wodę, jeśli nie ma jeża w kole i zadaje 6 obrażeń każdemu wrogiemu jeżowi.]", -- Continental_supplies
     ["Lonely Cries"] = "Samotne łkanie", -- Continental_supplies
-    ["Lonely Cries: [Rise the water if no hog is in the circle and deal 6 damage to all enemy hogs.]"] = "Samotne łkanie: [Podnosi wodę, jeśli nie ma jeża w kole i zadaje 6 obrażeń każdemu wrogiemu jeżowi.]", -- Continental_supplies
-    ["Lonely Hog"] = "Samotny Jeż", -- ClimbHome
     ["Long Jump: [Enter]"] = "Długi skok: [Enter]", -- Basic_Training_-_Movement
+    ["Long Jump: Tap the [Curvy Arrow] button for long"] = "Długi skok: Przytrzymaj dłużej przycisk [Zakręconej strzałki]", -- Basic_Training_-_Movement, A_Classic_Fairytale:first_blood
     ["Long Live The Queen"] = "Niech żyje królowa", -- A_Classic_Fairytale:queen
     ["Look around: [Mouse movement]"] = "Rozejrzyj się: [Ruch myszą]", -- Basic_Training_-_Movement
+    ["Look around: [Tap or swipe on the screen]"] = "Rozejrzyj się: [Wciśnij lub przejedź po ekranie]", -- Basic_Training_-_Movement
     ["Look, boss! There is the target!"] = "Zobacz, szefie! Tam jest cel!", -- A_Space_Adventure:moon01
     ["Look, I had no choice!"] = "Słuchaj, nie miałem wyboru!", -- A_Classic_Fairytale:backstab
     ["Look out! There's more of them!"] = "Uważaj! Jest ich więcej!", -- A_Classic_Fairytale:backstab
     ["Look out! We're surrounded by cannibals!"] = "Uważaj! Jesteśmy otoczeni przez kanibali!", -- A_Classic_Fairytale:enemy
     ["Looks like the whole world is falling apart!"] = "Wygląda, jakby cały świat się walił!", -- A_Classic_Fairytale:enemy
+    ["Look to the left and do a backwards jump towards the mushroom."] = "Spójrz w lewo i zrób skok w tył w stronę grzyba.", -- A_Classic_Fairytale:first_blood
     ["Loon"] = "Gbur", -- The_Specialists
     ["Loopy"] = "Wariat",
-    ["Lord Evil"] = "Lord Zło", -- Tentacle_Terror
     ["Losing Condition: Destroy"] = "Warunek przegranej: Zniszcz", -- HedgeEditor
     ["Low Gravity: Gravity is %i%%"] = "Niska grawitacja: Grawitacja wynosi %i%%", -- Gravity
     ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "Lojalny Highlander: Wyeliminuj jeże wroga, by przejąć ich bronie", -- Highlander
@@ -1365,7 +1344,6 @@
     ["Many meters below the surface ..."] = "Wiele metrów pod ziemią...", -- A_Space_Adventure:desert02
     ["Mario"] = "Mario",
     ["Mark gears for win/lose conditions"] = "Zaznacz rzeczy jako warunki wygranej/przegranej", -- HedgeEditor
-    ["Mark"] = "Marek", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
     ["Mark/unmark gear: [Left Click]"] = "Zaznacz/odznacz rzecz: [Lewy klik]", -- HedgeEditor
     ["- Massive weapon bonus on first turn"] = "- Masywny bonus broni w pierwszej turze", -- Continental_supplies
     ["Max Citrus"] = "Maks Cytrus", -- A_Space_Adventure:fruit01
@@ -1374,14 +1352,13 @@
     ["Maybe you should try easier waypoints next time."] = "Może następnym razem powinieneś spróbować łatwiejszych punktów kontrolnych.", -- Racer
     ["May the spirits aid you in all your quests!"] = "Niech dusze pomogą wam w waszych zadaniach!", -- A_Classic_Fairytale:backstab
     ["Meals"] = "Mils",
+    ["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"] = "Lekarstwo: [Wystrzel trochę eksplodującego leku, który uleczy wszystkie jeże w jej zasięgu]", -- Continental_supplies
     ["Medicine"] = "Lekarstwo", -- Continental_supplies
-    ["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"] = "Lekarstwo: [Wystrzel trochę eksplodującego leku, który uleczy wszystkie jeże w jej zasięgu]", -- Continental_supplies
     ["Medic"] = "Medyk", -- Battalion
     ["MEDIUM"] = "ŚREDNI", -- Continental_supplies
     ["Mega kill!"] = "Mega zabójstwo!", -- Mutant
     ["Meiwes"] = "Meifs", -- A_Classic_Fairytale:backstab
     ["mikade"] = "mikade",
-    ["milliseconds"] = "milisekund", -- SpeedShoppa, Racer, TechRacer
     ["Mindy"] = "Mindi", -- A_Classic_Fairytale:united
     ["Mine Deployer"] = "Rozmieszczacz Min",
     ["Mine Placement Mode"] = "Tryb Ustawiania Min", -- Construction_Mode
@@ -1399,13 +1376,13 @@
     ["Mine Strike"] = "Nalot", -- Construction_Mode
     ["Minion"] = "Sługus", -- A_Space_Adventure:moon01
     ["Minions"] = "Sługusy", -- A_Space_Adventure:moon01
-    ["MISSION FAILED"] = "MISJA ZAKOŃCZONA NIEPOWODZENIEM",
     ["Mission failed!"] = "Misja zakończona niepowodzeniem!", -- Big_Armory
     ["Mission failure in %d s"] = "Porażka misji w %d s", -- Big_Armory
+    ["Mission"] = "Misja", -- HedgeEditor
     ["Mission lost!"] = "Misja stracona!", -- Basic_Training_-_Grenade
     ["Mission panel: [M]"] = "Panel misji: [M]", -- Basic_Training_-_Movement
     ["Mission Panel"] = "Panel misji", -- Basic_Training_-_Movement
-    ["MISSION SUCCESSFUL"] = "MISJA POWIODŁA SIĘ",
+    ["Mission succeeded!"] = "Misja ukończona!", -- portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, SimpleMission, HedgeEditor
     ["Mission won!"] = "Misja wygrana!", -- Basic_Training_-_Grenade
     ["Mister Pear"] = "Pan Perła", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02
     ["Mixed %d"] = "Mieszane %d", -- WxW
@@ -1421,7 +1398,6 @@
     ["Monster kill!"] = "Potworne zabójstwo!", -- Mutant
     ["Monsters"] = "Potwory",
     ["Mooney"] = "Muni",
-    ["More Natives"] = "Więcej Tubylców", -- A_Classic_Fairytale:epil
     ["Morris"] = "Moris",
     ["Most mines are not active."] = "Większość min jest nieaktywna", -- A_Space_Adventure:desert02
     ["Most of the destructible terrain in marked with blue color"] = "Większość zniszczalnego terenu jest zaznaczone na niebieski kolor", -- A_Space_Adventure:desert01
@@ -1441,13 +1417,11 @@
     ["Nade Boy"] = "Natowy Chłopak", -- Basic_Training_-_Grenade
     ["Nah, probably everyone was just stupid."] = "Nie, prawdopodobnie każdy był po prostu głupi.", -- A_Space_Adventure:final
     ["Name"] = "Imię", -- A_Classic_Fairytale:queen
-    ["Nameless Heroes"] = "Bezimienni Bohaterowie",
     ["Nancy Screw"] = "Nansi Gwóźdź", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:queen
     ["Napalm"] = "Napalm", -- Construction_Mode
+    ["Napalm rocket: [Fire a bomb with napalm!]"] = "Napalmowa rakieta: [Wystrzel bombę z napalmem!]", -- Continental_supplies
     ["Napalm Rocket"] = "Rakieta napalmowa", -- Continental_supplies
-    ["Napalm rocket: [Fire a bomb with napalm!]"] = "Napalmowa rakieta: [Wystrzel bombę z napalmem!]", -- Continental_supplies
     ["Naranja Jed"] = "Narandża Dżed", -- A_Space_Adventure:fruit01
-    ["Natives"] = "Tubylcy", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
     ["Naughty Ninja"] = "Niegrzeczny Ninja", -- User_Mission_-_Dangerous_Ducklings
     ["Near a PAotH base on the moon ..."] = "Niedaleko bazy PSJ na księżycu...", -- A_Space_Adventure:moon01
     ["Near Secret Base 17 of PAotH in the rural Hogland ..."] = "Niedaleko Sekretnej Bazy 17 PSJ w miejskim Jeżlandzie...", -- A_Space_Adventure:cosmos
@@ -1542,11 +1516,8 @@
     ["Oh, my! I forgot something!"] = "Jejku, zapomniałem o czymś!", -- A_Classic_Fairytale:queen
     ["Oh, my!"] = "Ojej!", -- A_Classic_Fairytale:first_blood
     ["Oh, my! This is even more entertaining than I've expected!"] = "Ojejku! To jest bardziej zabawne, niż myślałem!", -- A_Classic_Fairytale:backstab
-    ["Oh no! Just try again!"] = "Ojojoj! Spróbuj jeszcze raz!",
     ["Oh no, not %s!"] = "O nie, to %s!", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
-    ["Oh no, the Green Bananas have betrayed Hog Solo and stole the anti-gravity device part!"] = "O nie, Zielone Banany zdradziły Hoga Solo i ukradły część urządzenia antygrawitacyjnego!", -- A_Space_Adventure:fruit02
-    ["Oh no! Time's up! Just try again."] = "Ajajaj! Koniec czasu! Spróbuj jeszcze raz.",
-    ["Oh no! You failed! Just try again."] = "O nie! Nie udało ci się! Spróbuj jeszcze raz.", -- Basic_Training_-_Cluster_Bomb
+    ["Oh no, the companions have betrayed %s and stole the anti-gravity device part!"] = "O nie, kompani zdradzili %s i ukradli część urządzenia antygrawitacyjnego!", -- A_Space_Adventure:fruit02
     ["Oh no! You have died. Try again!"] = "Och nie! Umarłeś. Spróbuj jeszcze raz!", -- Basic_Training_-_Flying_Saucer
     ["Oh! Please spare me. You can take all my treasures!"] = "Och! Proszę, oszczędź mnie. Możesz zabrać wszystkie moje skarby!", -- A_Space_Adventure:ice01
     ["Oh, silly me! I forgot that I'm the shaman."] = "Och, głupi ja! Zapomniałem, że to ja jestem szamanem.", -- A_Classic_Fairytale:backstab
@@ -1568,9 +1539,9 @@
     ["One shall not judge one by one's appearance!"] = "Nie powinno się kogoś sądzić po jego wyglądzie!", -- A_Classic_Fairytale:epil
     ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "Nasze plemię było pokojowe, spędzając swój czas na polowaniu i treningu, ciesząc się z małych przyjemności w życiu...", -- A_Classic_Fairytale:first_blood
     ["Oneye"] = "Jednooki", -- portal
-    ["Only Hog Solo can be trusted with the crate."] = "Skrzynia może być powierzona tylko Hogowi Solo.", -- A_Space_Adventure:fruit02
     ["Only one hog per team allowed! Excess hogs will be removed"] = "Dozwolony tylko jeden jeż na drużynę! Nadmiarowe jeże będą usunięte", -- Mutant
     ["Only one hog per team allowed! Excess hogs will be removed."] = "Dozwolony tylko jeden jeż na drużynę! Nadmiarowe jeże będą usunięte.", -- Mutant
+    ["Only %s can be trusted with the crate."] = "Tylko jeżowi %s można ufać ze skrzynią.", -- A_Space_Adventure:fruit02
     ["Only the best pilots can master the following stunts."] = "Tylko najlepsi piloci mogą opanować następujące wyczyny.", -- Basic_Training_-_Flying_Saucer
     ["Only two clans allowed! Excess hedgehogs will be removed."] = "Tylko dwa klany dozwolone! Nadmiarowe jeże będą usunięte.", -- CTF_Blizzard
     ["On the Ice Planet, where ice rules ..."] = "Na Lodowej Planecie, gdzie rządzi lód...", -- A_Space_Adventure:ice01
@@ -1582,6 +1553,7 @@
     ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "Ups, zostałem zauważony i nie mam broni! Już po mnie!", -- A_Space_Adventure:moon01
     ["Oops! You have selected the wrong hedgehog! Just try again."] = "Ups! Wybrałeś złego jeża! Po prostu spróbuj ponownie.", -- Basic_Training_-_Movement
     ["Open ammo menu: [Right click]"] = "Otwórz menu amunicji: [Prawy klik]", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
+    ["Open ammo menu: Tap the [Suitcase]"] = "Otwórz menu amunicji: Wciśnij [Walizkę]", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
     ["Open that crate and we will continue!"] = "Otwórz tę skrzynię i będziemy kontynuować!", -- A_Classic_Fairytale:first_blood
     ["Opposing Team: "] = "Przeciwna Drużyna",
     ["Orange"] = "Pomarańcz",
@@ -1601,15 +1573,14 @@
     ["PAotH"] = "PSJ", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01, A_Space_Adventure:desert01, A_Space_Adventure:moon01
     ["Parachute"] = "Spadochron", -- Continental_supplies
     ["Patches"] = "Łatek",
-    ["Pathetic Resistance"] = "Żałosny Opór", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
     ["Paul McHoggy"] = "Paul McJeżu", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02
     ["Pause: [P]"] = "Pauza: [P]", -- Basic_Training_-_Movement
+    ["Pause: Tap the [Pause] button"] = "Pauza: Wciśnij przycisk [Pauza]", -- Basic_Training_-_Movement
     ["Penalty: If you violate above rule, you have to skip in the next turn."] = "Kara: Jeśli naruszysz powyższą zasadę, będziesz musiał opuścić następną turę.", -- WxW
-    ["Penguin Roar"] = "Ryk pingwina", -- Continental_supplies
     ["Penguin roar: [Deal 15 damage + 10% of your hog’s health to all hogs around you and get 2/3 back]"] = "Ryk pingwina: [Zadaj 15 obrażeń + 10% zdrowia twojego jeża wszystkim jeżom wokół ciebie i otrzymaj 2/3 z powrotem]", -- Continental_supplies
     ["Penguin roar: [Deal 15 damage + 10% of your hogs health to all hogs around you and get 2/3 back]"] = "Ryk pingwina: [Zadaje 15 obrażeń + 10% zdrowia twojego jeża wszystkim jeżom dookoła i dostaje 2/3 z powrotem]", -- Continental_supplies
+    ["Penguin Roar"] = "Ryk pingwina", -- Continental_supplies
     ["Perfect! Now try to get the next crate without hurting yourself!"] = "Idealnie! Teraz spróbuj zdobyć następną skrzynię bez zranienia się!", -- A_Classic_Fairytale:first_blood
-    ["Per-Hog Ammo"] = "Oddzielna amunicja dla jeży",
     ["Per-hog Ammo: Weapons are not shared between hogs"] = "Oddzielna amunicja dla jeży: Bronie nie są dzielone między jeżami", -- User_Mission_-_Nobody_Laugh
     ["Personal best: %.3f seconds"] = "Osobisty rekord: %.3f sekund", -- A_Space_Adventure:ice02
     ["Per team weapons"] = "Drużynowa amunicja", -- Continental_supplies
@@ -1618,7 +1589,6 @@
     ["Physicist"] = "Fizyk", -- HedgeEditor
     ["Piano Strike"] = "Zrzut pianina", -- Construction_Mode
     ["Pikachu"] = "Pikachu",
-    ["Pincer Knights"] = "Szczypcowi Rycerze", -- Bazooka_Battlefield
     ["Pings left: %d"] = "Pozostałe sygnały: %d", -- Space_Invasion
     ["Pink"] = "Róż",
     ["Pirates"] = "Piraci",
@@ -1653,8 +1623,8 @@
     ["- Place your clan flag at the end of your first turn"] = "- Ustaw flagę swojego klanu na końcu swojej pierwszej tury", -- Capture_the_Flag
     ["- Place your team flag at the end of your first turn"] = "- Postaw flagę twojej drużyny na końcu swojej pierwszej tury", -- Capture_the_Flag
     ["Planes used: %d"] = "Użyte samoloty: %d", -- User_Mission_-_RCPlane_Challenge
+    ["Planes Used"] = "Użyte Samoloty", -- User_Mission_-_RCPlane_Challenge
     ["Planes Used:"] = "Użyte Samoloty:", -- User_Mission_-_RCPlane_Challenge
-    ["Planes Used"] = "Użyte Samoloty", -- User_Mission_-_RCPlane_Challenge
     ["Planets with all missions completed will be marked with two flowers."] = "Planety ze wszystkimi misjami ukończonymi będą zaznaczone dwoma kwiatkami.", -- A_Space_Adventure:cosmos
     ["Planets with completed main missions will be marked with a flower."] = "Planety z ukończonymi głównymi misjami będą zaznaczone kwiatkiem.", -- A_Space_Adventure:cosmos
     ["Play with me!"] = "Zagraj ze mną", -- A_Classic_Fairytale:shadow
@@ -1671,8 +1641,6 @@
     ["Point Blank Combo! +5 points!"] = "Kombo martwego punktu! +5 punktów!", -- Space_Invasion
     ["--- Points Mode ---"] = "--- Tryb Punktów ---", -- Battalion
     ["--- Points ---"] = "--- Punkty ---", -- Battalion
-    ["points"] = "punkty", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
-    ["point(s)"] = "punkt(y)", -- TargetPractice, Mutant
     ["Poisonous Apple"] = "Zatrute Jabłko", -- A_Space_Adventure:fruit02
     ["Poisonous, deals no damage."] = "Zatrute, nie zadaje obrażeń.", -- Continental_supplies
     ["Poison"] = "Truciciel",
@@ -1692,37 +1660,37 @@
     ["Prepare for battle!"] = "Przygotować się do bitwy!", -- A_Space_Adventure:moon01
     ["Prepare to fight"] = "Przygotuj się do walki", -- A_Space_Adventure:moon01
     ["Prepare to flee!"] = "Przygotuj się do ucieczki!", -- A_Space_Adventure:cosmos
-    ["Prepare yourself"] = "Przygotuj się",
+    ["Prepare yourself, %s!"] = "Przygotuj się, %s!", -- The_Specialists
     ["Press [Attack] (space bar by default) to start,|repeadedly tap the up, left and right movement keys to accelerate."] = "Wciśnij [Atak] (domyślnie spacja), by zacząć,|wielokrotnie wciskaj góra, lewo i prawo, by przyśpieszyć.", -- Basic_Training_-_Flying_Saucer
     ["Press [Attack] (space bar by default) to start,|repeatedly tap the up, left and right movement keys to accelerate."] = "Wciśnij [Atak] (domyślnie spacja), by zacząć,|wciśnij wielokrotnie przyciski ruchu w górę, lewo i prawo, by przyśpieszyć.", -- Basic_Training_-_Flying_Saucer
     ["Press [Attack] to begin."] = "Wciśnij [Atak], by zacząć.", -- A_Classic_Fairytale:first_blood
     ["Press [Attack] to confirm."] = "Wciśnik [Atak], by zatwierdzić.", -- Continental_supplies
     ["Press [Attack] to select this continent!"] = "Wciśnij [Atak], by wybrać ten kontynent!", -- Continental_supplies
     ["Press [Left] and [Right] to change the difficulty."] = "Wciśnij [Lewo] i [Prawo], by zmienić trudność.", -- A_Classic_Fairytale:first_blood
-    ["Press [Left] or [Right] to move around, [Enter] to jump"] = "Wciśnij [Lewo] lub [Prawo], by poruszaćsię, [Enter] by skoczyć.", -- A_Classic_Fairytale:first_blood
+    ["Press [Left] or [Right] to move around, [Long Jump] to jump forwards."] = "Wciśnij [Lewo] lub [Prawo], by się poruszać, [Długi skok], by skoczyć w przód.", -- A_Classic_Fairytale:first_blood
     ["Press [Long jump] to accept this configuration and begin placing hedgehogs."] = "Wciśnij [Długi skok] by zaakceptować tę konfigurację i zacząć ustawiać jeże.", -- WxW
     ["Press [Long jump] to accept this configuration and start the game."] = "Wciśnij [Długi skok] by zaakceptować tę konfigurację i zacząć grę.", -- WxW
+    ["Press [M] to see the mission texts"] = "Wciśnij [M], by zobaczyć tekst misji", -- Basic_Training_-_Movement
     ["Press [Precise] to skip intro"] = "Naciśnij [Precyzja] by pominąć intro",
     ["Press [Up] and [Down] to move between menu items.|Press [Attack], [Left], or [Right] to toggle."] = "Wciśnij [Góra] i [Dół], by poruszać się między pozycjami menu.|Wciśnij [Atak], [Lewo] lub [Prawo], by przełączyć.", -- WxW
     ["Prestigious Pilot"] = "Prestiżowy pilot", -- User_Mission_-_RCPlane_Challenge
     ["Princess"] = "Księżniczka", -- A_Classic_Fairytale:family, A_Classic_Fairytale:journey
     ["Princess Peach"] = "Księżniczka Peach",
-    ["Private Nolak"] = "Szeregowiec Nolak", -- Target_Practice_-_Cluster_Bomb
     ["Problems, dude? Chillax!"] = "Problem, koleś? Wrzuć na luz!", -- A_Classic_Fairytale:epil
     ["Professional pilot"] = "Profesjonalny pilot", -- User_Mission_-_RCPlane_Challenge
     ["Professional stunt pilot"] = "Profesjonalny pilot kaskaderski", -- User_Mission_-_RCPlane_Challenge
     ["Professor Hogevil, then known as James Hogus, worked for PAotH back in my time."] = "Profesor Jeżozło, wtedy znany jako Jakub Jeżus, za moich czasów pracował dla PSJ.", -- A_Space_Adventure:moon02
     ["Professor"] = "Profesor", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
+    ["Professor's Team"] = "Drużyna Profesora", -- A_Space_Adventure:death01
     ["Prof. Hogevil"] = "Prof. Jeżozło", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
-    ["Pro Killers"] = "Pro Zabójcy", -- Big_Armory
     ["Protect the King: When the king dies, so does the team"] = "Chroń Króla: Kiedy król umiera, drużyna ginie razem z nim", -- Battalion
-    ["Protect yourselves!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "Brońcie się!|Wskazówka do granatów: Ustaw zaplnik używając [1-5], celuj [Góra]/[Dół] i przytrzymaj [Spację], by ustawić moc", -- A_Classic_Fairytale:shadow
     ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "Broń się!|Porada do granatu: ustaw zapalnik używając [1-5], celuj za pomocą [Góra]/[Dół] i przytrzymaj spację, by ustawić moc", -- A_Classic_Fairytale:shadow
     ["Purple"] = "Fiolet",
     ["Pyromancer"] = "Piromanta", -- Battalion
     ["Pyro"] = "Piro", -- HedgeEditor, The_Specialists
     ["Quit: [Esc]"] = "Wyjście: [Esc]", -- Basic_Training_-_Movement
     ["Race complexity limit reached"] = "Limit złożoności wyścigu osiągnięty", -- Racer, TechRacer
+    ["Race failed!"] = "Wyścik nieudany!", -- A_Space_Adventure:moon02
     ["Racer tool"] = "Narzędzie wyścigu", -- Racer
     ["Racer"] = "Wyścig", -- Racer
     ["Race"] = "Wyścig", -- TrophyRace
@@ -1758,23 +1726,19 @@
     ["Replenishment: Weapons are restocked on turn start of a new hog"] = "Uzupełnianie: Bronie są uzupełnione na początku tury nowego jeża", -- Highlander
     ["Repositioning Mode"] = "Tryb Przesuwania", -- HedgeEditor
     ["REPOSITIONING MODE"] = "TRYB PRZESUWANIA", -- HedgeEditor
-    ["rescues"] = "ratuje", -- User_Mission_-_That_Sinking_Feeling
     ["Rescue the imprisoned PAotH team and get the fuel!"] = "Uratuj uwięziony zespół PSJ i zdobądź paliwo!", -- A_Space_Adventure:moon01
     ["Respawner"] = "Odradzacz", -- Construction_Mode
     ["Respawner: Resurrects dead hogs."] = "Odradzacz: Ożywia martwe jeże.", -- Construction_Mode
     ["Resurrector"] = "Wskrzeszacz", -- Construction_Mode
     ["Retract/Extend rope: [Up]/[Down]"] = "Zwiń/Rozwiń linę: [Góra]/[Dół]", -- Basic_Training_-_Rope
-    [" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = " - Przynieś flagę wroga do swojej bazy by zdobyć punkt | - Pierwszy kto zrobi to 3 razy, wygrywa | - Punkt zdobywasz tylko, gdy twoja flaga znajduje się w bazie | - Jeże upuszczą flagę gdy zostaną zabite bądź utopione | - Upuszczona flaga może być przywrócona lub przechwycona ponownie | - Jeże odradzają się po śmierci",
     ["- Return the enemy flag to your base to score"] = "- Zanieś wrogą flagę do swojej bazy, by zapunktować", -- Capture_the_Flag
     ["Return to Leaks A Lot!"] = "Wróć do Sporego Przecieka!", -- A_Classic_Fairytale:shadow
     ["Return to the mission menu by pressing the \"Go back\" button."] = "Wróć do menu misji, wciskając przycisk \"Wstecz\".", -- A_Space_Adventure:cosmos
     ["Return to the Surface"] = "Wróć na Powierzchnię", -- A_Space_Adventure:fruit02
     ["Return to the training menu by pressing the “Go back” button."] = "Wróć do menu treningu, wciskając przycisk \"Powrót\".", -- Basic_Training_-_Movement
-    ["Rhombus"] = "Romb", -- Basic_Training_-_Movement
     ["Rider"] = "Jeźdźec", -- portal
     ["Rifleman"] = "Strzelec", -- Battalion
     ["Righteous Beard"] = "Cnotliwa Broda", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:queen, A_Classic_Fairytale:united
-    ["Right Tong"] = "Prawy Tong", -- Bazooka_Battlefield
     ["Ripe"] = "Dojrzały",
     ["Rise the water if nobody else is in the circle and deal 6 damage to all enemy hogs."] = "Podwyższ wodę, jeśli nikt inny nie jest w kole i zadaj 6 obrażeń wszystkim wrogim jeżom.", -- Continental_supplies
     ["Robert Yellow Apple"] = "Robert Żółte Jabłko", -- A_Space_Adventure:fruit01
@@ -1783,8 +1747,8 @@
     ["Roof"] = "Dach", -- WxW
     ["Rope-knocking Challenge"] = "Wyzwania Uderzania Liną", -- User_Mission_-_Rope_Knock_Challenge
     ["Rope Master"] = "Mistrz Liny", -- Basic_Training_-_Rope
-    ["Roper"] = "Liniacz", -- SpeedShoppa
     ["Ropes and Crates"] = "Liny i Skrzynie", -- Challenge_-_Speed_Shoppa_-_Ropes
+    ["Ropes can be fired again in the air!"] = "Liny mogą być wystrzelone ponownie w powietrzu!", -- A_Classic_Fairytale:first_blood
     ["Rope Team"] = "Linowa Drużyna", -- Basic_Training_-_Rope
     ["Rope Training"] = "Trening linowy", -- Basic_Training_-_Rope
     ["Rope Weapons"] = "Linowe bronie", -- Basic_Training_-_Rope
@@ -1799,7 +1763,6 @@
     ["Rounds complete: %d/%d"] = "Ukończone rundy: %d/%d", -- Racer, Space_Invasion, TechRacer
     ["Round score: %d"] = "Wynik rundy: %d", -- Space_Invasion
     ["Round's slowest lap: %.3fs by %s"] = "Najwolniejsze okrążenie rundy: %.3fs (%s)", -- TrophyRace
-    ["Rounds until Sudden Death: %d"] = "Rundy do Nagłej Śmierci: %d", -- Battalion
     ["RS1"] = "RS1", -- A_Space_Adventure:fruit03
     ["RS2"] = "RS2", -- A_Space_Adventure:fruit03
     ["Rubber"] = "Guma", -- Construction_Mode, HedgeEditor
@@ -1825,10 +1788,17 @@
     ["Salvation was one step closer now..."] = "Odkupienie było teraz o krok bliżej...", -- A_Classic_Fairytale:dragon
     ["Sam"] = "Sam", -- A_Space_Adventure:cosmos
     ["Sandals?! I thought you left your ring!"] = "Sandały?! Myślałem, że zostawiłeś swój pierścień!", -- A_Classic_Fairytale:queen
+    ["%s and GB"] = "%s i GB.", -- A_Space_Adventure:fruit02
     ["%s and %s enter the battlefield"] = "%s i %s wchodzą na pole bitwy", -- A_Space_Adventure:fruit01
     ["Sandstorm"] = "Burza piaskowa", -- A_Space_Adventure:desert01
     ["Sandy"] = "Piaskowy", -- A_Space_Adventure:desert01
-    ["Save as many hapless hogs as possible!"] = "Uratuj jak najwięcej nieszczęsnych jeży jak to możliwe!",
+    ["%s arrived at the Desert Planet!"] = "%s dotarł na Pustynną Planetę!", -- A_Space_Adventure:cosmos
+    ["%s arrived at the Fruit Planet!"] = "%s dotarł na Planetę Owoców!", -- A_Space_Adventure:cosmos
+    ["%s arrived at the Ice Planet!"] = "%s dotarł na Lodową Planetę!", -- A_Space_Adventure:cosmos
+    ["%s arrived at the meteorite!"] = "%s dotarł na meteoryt!", -- A_Space_Adventure:cosmos
+    ["%s arrived at the moon!"] = "%s dotarł na księżyc!", -- A_Space_Adventure:cosmos
+    ["%s arrived at the Planet of Death!"] = "%s dotarł na Planetę Śmierci!", -- A_Space_Adventure:cosmos
+    ["Save as many hogs as possible!"] = "Uratuj tyle jeży, ile się da!", -- User_Mission_-_That_Sinking_Feeling
     ["Save Fell From Heaven!"] = "Uratuj Upadłego z Niebios!", -- A_Classic_Fairytale:journey
     ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "Uratuj Sporego Przecieka!|Porada: narzędzie zmiany jeża może być dla ciebe pomocne.", -- A_Classic_Fairytale:shadow
     ["Save Level: [Precise]+[4]"] = "Zapisz poziom: [Precyzja]+[4]", -- HedgeEditor
@@ -1839,10 +1809,10 @@
     ["%s bravely climbed up to a dizzy height of %d to reach home."] = "%s odważnie wspiął się na zawrotną wysokość %d, by dotrzeć do domu.", -- ClimbHome
     ["Scallywag"] = "Łobuziak",
     ["Scalp Muncher"] = "Przeżuwacz Skalpów", -- A_Classic_Fairytale:backstab
-    ["Scenario failed!"] = "Scenariusz zakończony porażką!", -- SimpleMission
     ["Scenario"] = "Scenariusz", -- Big_Armory, portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape
     ["Scientist"] = "Naukowiec", -- Battalion
     ["%s climbed home in %d seconds!"] = "%s wspiął się do domu w %d sekund!", -- ClimbHome
+    ["%s (contd.)"] = "%s (kont.)", -- A_Classic_Fairytale:epil
     ["Score: %d"] = "Wynik: %d", -- Space_Invasion
     ["Score goal: %d"] = "Wymagany wynik: %d", -- Control
     ["Score graph"] = "Graf wyniku", -- Mutant, Space_Invasion
@@ -1852,8 +1822,8 @@
     ["Scores"] = "Wyniki", -- Mutant
     ["Scores:"] = "Wyniki:", -- Mutant
     ["Scoring: "] = "Wynki: ", -- Mutant
+    ["%s couldn't escape, try again!"] = "%s nie mógł uciec, spróbuj ponownie!", -- A_Space_Adventure:fruit01
     ["Script parameter examples:"] = "Przykłady parametrów skryptu:", -- Gravity
-    ["%s (%d)"] = "%s (%d)", -- Continental_supplies
     ["%s: %d (deaths: %d)"] = "%s: %d (śmierci: %d)", -- Mutant
     ["%s (%d), %d sec"] = "%s (%d), %d sekund", -- Continental_supplies
     ["%s: Did not finish"] = "%s: Nie ukończył", -- Racer, TechRacer
@@ -1863,19 +1833,19 @@
     ["%s doesn’t really know how to handle a rope properly."] = "%s nie wie tak naprawdę jak posługiwać się liną.", -- ClimbHome
     ["%s (+%d)"] = "%s (+%d)", -- Battalion
     ["%s: %d"] = "%s: %d", -- Capture_the_Flag, Control
+    ["%s (%d)"] = "%s (%d)", -- Continental_supplies
     ["%s, %d sec"] = "%s, %d sekund", -- Continental_supplies
-    ["Search for the device with the help of the other hedgehogs "] = "Poszukaj urządzenia z pomocą innych jeży", -- A_Space_Adventure:fruit02
+    ["Search for the device with the help of the other hedgehogs."] = "Posukaj urządzenia z pomocą innych jeży.", -- A_Space_Adventure:fruit02
     ["Searching in the dust"] = "Poszukiwanie w kurzu", -- A_Space_Adventure:desert01
     ["Searching the stars!"] = "Szukanie gwiazd!", -- A_Space_Adventure:cosmos
-    ["seconds"] = "sekund", -- ClimbHome
     ["Seduction"] = "Uwodzenie", -- Continental_supplies
     ["Seems like every time you take a \"walk\", the enemy finds us!"] = "Wygląda na to, żeza każdym razem, gdy idziesz na \"spacer\", wróg nas znajduje!", -- A_Classic_Fairytale:backstab
     ["See that crate farther on the right?"] = "Widzisz tę skrzynię po prawej?", -- A_Classic_Fairytale:first_blood
     ["See ya!"] = "Do zobaczenia!",
     ["Segmentation Paul"] = "Naruszenie Pawła", -- A_Classic_Fairytale:dragon
     ["Select a placement mode and read the infos|in the mission panel to learn how to use it."] = "Wybierz tryb ustawiania i przeczytaj informacje|w panelu misji, by dowiedzieć się jak go używać.", -- HedgeEditor
+    ["Select continent!"] = "Wybierz kontynent!", -- Continental_supplies
     ["Select continent"] = "Wybierz kontynent", -- Continental_supplies
-    ["Select continent!"] = "Wybierz kontynent!", -- Continental_supplies
     ["Selection Mode"] = "Tryb Wyboru", -- HedgeEditor
     ["Select, modify, or delete girders, rubbers and sprites"] = "Wybierz, modyfikuj lub usuń belki, gumy i grafiki", -- HedgeEditor
     ["Select/Place/Delete Gear: [Left Click]"] = "Wybierz/Ustaw/Usuń rzecz: [Lewy klik]", -- HedgeEditor
@@ -1894,6 +1864,7 @@
     ["Select your continent with [Up]/[Down] or by selecting a representative weapon."] = "Wybierz swój kotnynent używając [Góra]/[Dół] lub wybierając reprezentatywną broń.", -- Continental_supplies
     ["%s enters the battlefield"] = "%s wchodzi na pole bitwy", -- A_Space_Adventure:fruit01
     ["Sergey"] = "Sergiusz",
+    ["%s escaped successfully!"] = "%s uciekł pomyślnie!", -- A_Space_Adventure:fruit01
     ["Set bounciness: [Left Shift] + [1]-[5]"] = "Wybierz odbijalność: [Lewy Shift] + [1]-[5]", -- Basic_Training_-_Grenade
     ["Set detonation timer: [1]-[5]"] = "Wybierz czas detonacji: [1]-[5]", -- Basic_Training_-_Grenade
     ["Set Health: [Left Click]"] = "Ustaw zdrowie: [Lewy klik]", -- HedgeEditor
@@ -1917,10 +1888,12 @@
     ["%s has been killed before taking enough damage first."] = "%s został zabity, zanim wcześniej dostał odpowiednią ilość obrażeń.", -- SimpleMission
     ["%s has been knocked out."] = "%s został zrzucony.", -- User_Mission_-_Rope_Knock_Challenge
     ["%s has been rescued from death"] = "%s został uratowany od śmierci", -- Construction_Mode
+    ["%s has dropped the flag!"] = "%s upuścił flagę!", -- CTF_Blizzard
     ["%s has fallen victim to gravity."] = "%s stał się ofiarą grawitacji.", -- User_Mission_-_Rope_Knock_Challenge
     ["%s has mutated! +2 points"] = "%s zmutował! +2 punkty", -- Mutant
     ["%s has passed the best height of %s!"] = "%s przekroczył najlepszą wysokość %s!", -- ClimbHome
     ["%s has scored!"] = "%s zapunktował!", -- Capture_the_Flag
+    ["%s has to refuel the saucer."] = "%s musi zatankować spodek.", -- A_Space_Adventure:moon01
     ["%s hates Newton."] = "%s nienawidzi Newtona.", -- User_Mission_-_Rope_Knock_Challenge
     ["She endangered the whole tribe!"] = "Ona naraziła całe plemię!", -- A_Classic_Fairytale:epil
     ["sheepluva"] = "sheepluva",
@@ -1937,8 +1910,6 @@
     ["Shinobi"] = "Shinobi",
     ["%s hit the ground."] = "%s uderza w ziemię", -- User_Mission_-_Rope_Knock_Challenge
     ["Shoppa Love"] = "Kochamy Shoppa", -- Challenge_-_Speed_Shoppa_-_Hedgelove
-    ["Shoppa Union"] = "Unia Shoppa", -- Challenge_-_Speed_Shoppa_-_Ropes, Challenge_-_Speed_Shoppa_-_ShoppaKing
-    ["Shoppers"] = "Shopperzy", -- SpeedShoppa
     ["Shotgun"] = "Strzelba", -- Continental_supplies
     ["Sigh."] = "Ech.", -- A_Classic_Fairytale:epil
     ["Silly"] = "Głuptas",
@@ -1951,11 +1922,11 @@
     ["%s is now as poor as a church mouse"] = "%s jest teraz tak biedny, jak mysz kościelna", -- Construction_Mode
     ["%s is now a zombie hedgehog"] = "%s jest teraz zombie jeżem", -- Construction_Mode
     ["%s is suddenly low on ammo"] = "%s nagle ma mało amunicji", -- Construction_Mode
-    ["Skip your turn to try again."] = "Pomiń turę, by spróbować ponownie.", -- Basic_Training_-_Rope
     ["Skulls"] = "Czaszki", -- Bazooka_Battlefield
     ["Slimer"] = "Szlamiarz",
     ["Slippery"] = "Śliski", -- A_Classic_Fairytale:journey
     ["%s lost all the weapons"] = "%s stracił wszystkie bronie", -- Construction_Mode
+    ["%s lost, try again!"] = "%s straconył, spróbuj ponownie!", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
     ["Slot %d: %s"] = "Slot %d: %s", -- Frenzy
     ["Slot keys save time! (F1-F10 by default)"] = "Klawisze slotów oszczędzają czas! (domyślnie F1-F10)", -- Frenzy
     ["Slowpoke"] = "Slowpoke",
@@ -1969,6 +1940,7 @@
     ["Smith 0.99f"] = "Smith 0.99f", -- A_Classic_Fairytale:enemy
     ["Smith 1.0"] = "Smith 1.0", -- A_Classic_Fairytale:enemy
     ["Smugglers"] = "Przemytnicy", -- A_Space_Adventure:desert01
+    ["%s must collect the final crates."] = "%s musi zebrać ostatnie skrzynie.", -- A_Space_Adventure:fruit02
     ["%s must skip this turn for rule violation."] = "%s musi opuścić swoją turę za naruszenie zasad.", -- WxW
     ["Sneaks"] = "Donosiciele", -- Bazooka_Battlefield
     ["%s never got the ninja diploma."] = "%s nigdy nie zdobył dyplomu ninja.", -- ClimbHome
@@ -1977,10 +1949,8 @@
     ["Sniper Rifle"] = "Karabin snajperski", -- Continental_supplies
     ["Sniper"] = "Snajper", -- HedgeEditor, The_Specialists
     ["Sniper Training"] = "Trening snajperski",
-    ["Sniperz"] = "Snajperzy",
     ["So, as promised I have brought you where I think that the device you are looking for is hidden."] = "Więc jak obiecałem, przyprowadziłem cię tam, gdzie myślę, że jest schowane urządzenie, którego szukasz.", -- A_Space_Adventure:fruit02
     ["So far, you had infinite ropes, but in the|real world, ropes are usually limited."] = "Dotąd miałeś nieskończone liny, ale w prawdziwym|świecie, liny są zazwyczaj ograniczone.", -- Basic_Training_-_Rope
-    ["So Hog Solo, here we are ..."] = "Więc, Hog Solo, oto jesteśmy...", -- A_Space_Adventure:cosmos
     ["So humiliating..."] = "Tak upokarzające...", -- A_Classic_Fairytale:first_blood
     ["So, I believe that it's a good place to start."] = "A więc, wierzę, że to jest dobre miejsce, by zacząć.", -- A_Space_Adventure:desert01
     ["So, I kindly ask for your help."] = "Więc, grzecznie proszę o twoją pomoc.", -- A_Space_Adventure:fruit01
@@ -1990,11 +1960,12 @@
     ["Some parts of the land are indestructible."] = "Niektóre części lądu są niezniszczalne.", -- A_Space_Adventure:fruit03
     ["Some sick game of yours?!"] = "Jakaś twoja chora gra?!", -- A_Classic_Fairytale:queen
     ["Some weapons can be dropped from the rope."] = "Niektóre bronie mogą być upuszczone z liny.", -- Basic_Training_-_Rope
-    ["Somewhere else on the planet of fruits, Captain Lime helps Hog Solo"] = "Gdzieś indziej na planecie owoców, Kapitan Limonka pomaga Hogowi Solo", -- A_Space_Adventure:fruit02
-    ["Somewhere else on the planet of fruits Hog Solo gets closer to the device"] = "Gdzieś indziej na planecie owoców, Hog Solo zbliża się do urządzenia", -- A_Space_Adventure:fruit02
+    ["Somewhere else on the planet of fruits, Captain Lime helps %s"] = "Gdzieś indziej na planecie owoców, Kapitan Limonka pomaga jeżowi %s", -- A_Space_Adventure:fruit02
+    ["Somewhere else on the planet of fruits, %s gets closer to the device"] = "Gdzieś indziej na planecie owoców, %s zbliża się do urządzenia", -- A_Space_Adventure:fruit02
     ["Somewhere on the Planet of Fruits a terrible war is about to begin ..."] = "Gdzieś na Planecie Owoców, straszliwa wojna ma właśnie się rozpocząć...", -- A_Space_Adventure:fruit01
     ["Somewhere on the uninhabitable Death Planet ..."] = "Gdzieś na niezamieszkalnej Planecie Śmierci...", -- A_Space_Adventure:death01
     ["So, now I got the last part and I have your friends captured."] = "Więc, mam teraz ostatnią część i przetrzymuję twoich przyjaciół.", -- A_Space_Adventure:death01
+    ["So, %s, here we are ..."] = "A więc, %s, dotarliśmy...", -- A_Space_Adventure:cosmos
     ["So the princess was never heard of again ..."] = "Więc o księżniczce nigdy więcej nie słyszano...", -- A_Classic_Fairytale:family
     ["So, uhmm, how did you manage to teleport them so far?"] = "Więc, um, jak ci się udało ich teleportować tak daleko?", -- A_Classic_Fairytale:epil
     ["Sour"] = "Surowy",
@@ -2032,7 +2003,6 @@
     ["Squirtle"] = "Squirtle",
     ["Squishy"] = "Grząski",
     ["%s reached home in %.3f seconds. Congratulations!"] = "%s dotarł do domu w %.3f sekund. Gratulacje!", -- ClimbHome
-    ["%s: %s"] = "%s: %s", -- Continental_supplies
     ["%s (%s) destroyed %d invaders in one round."] = "%s (%s) zniszczył %d najeźdźców w jednej rundzie.", -- Space_Invasion
     ["%s (%s) does not have to feel ashamed for their best height of %d."] = "%s (%s) nie musi się wstydzić swojej najlepszej wysokości %d.", -- ClimbHome
     ["%s, select your continent!"] = "%s, wybierz swój kontynent!", -- Continental_supplies
@@ -2054,6 +2024,7 @@
     ["%s (%s) reached for the sky and beyond with a height of %d!"] = "%s (%s) dosięgnął nieba i dalej, z wysokością %d!", -- ClimbHome
     ["%s (%s) reached home in %.3f seconds."] = "%s (%s) dotarł do domu w %.3f sekund.", -- ClimbHome
     ["%s (%s) shot %d invaders and never missed in the best round!"] = "%s (%s) zestrzelił %d najeźdźców i nigdy nie spudłował w najlepszej rundzie!", -- Space_Invasion
+    ["%s: %s"] = "%s: %s", -- Continental_supplies
     ["%s (%s) struck like a meteor: %d points in only one round!"] = "%s (%s) uderzył jak meteor: %d punktów w tylko jednej rundzie!", -- Space_Invasion
     ["%s still had a long way to go."] = "%s nadal miał daleką drogę do przejścia.", -- ClimbHome
     ["%s stumbled."] = "%s potknął się.", -- User_Mission_-_Rope_Knock_Challenge
@@ -2095,8 +2066,6 @@
     ["Structure Placement Mode"] = "Tryb Ustawiania Struktur", -- Construction_Mode
     ["Structure Placer"] = "Stawiacz Struktur", -- Construction_Mode
     ["Stupid, stupid Hogerians!"] = "Głupi, głupi Jeżarianie!", -- A_Space_Adventure:final
-    ["Subject 1"] = "Podmiot 1", -- portal
-    ["Subjects"] = "Podmioty", -- portal
     ["Subtract %d"] = "Odejmij %d", -- HedgeEditor
     ["--- Sudden Death ---"] = "--- Nagła Śmierć ---", -- Battalion
     ["Summer Squash"] = "Kabaczek", -- A_Space_Adventure:fruit01
@@ -2113,7 +2082,7 @@
     ["Surfer! +15 points!"] = "Surfer! +15 punktów!", -- Space_Invasion
     ["Surfer!"] = "Surfer!", -- WxW
     ["Surprise supplies: Get 1-3 random weapons each turn."] = "Niespodziewane posiłki: Dostań 1-3 losowych broni w każdej turze.", -- Continental_supplies
-    ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "Przetrwaj!Porada: Przerywniki mogą zostać pominięte przyciskiem [Precyzja].", -- A_Classic_Fairytale:shadow
+    ["Survive!"] = "Przeżyj!", -- A_Classic_Fairytale:shadow
     ["%s violated the “All But Last” rule and will be penalized."] = "%s narusza zasadę \"Wszyscy Oprócz Ostatniego\" i będzie ukarany.", -- WxW
     ["%s violated the “Kill The Leader” rule and will be penalized."] = "%s narusza zasadę \"Zabij przywódcę\" i będzie ukarany.", -- WxW
     ["Swap place with a random enemy in the circle."] = "Zamień miejsce z losowym wrogiem w kole.", -- Continental_supplies
@@ -2132,6 +2101,7 @@
     ["%s! Why?!"] = "%s! Czemu?!", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
     ["Swing, Leaks A Lot, on the wings of the wind!"] = "Huśtaj się, Spory Przecieku, na skrzydłach wiatru!", -- A_Classic_Fairytale:first_blood
     ["Swing: [Left]/[Right]"] = "Huśtaj się: [Lewo]/[Prawo]", -- Basic_Training_-_Rope
+    ["%s wins, congratulations!"] = "%s wygrywa, gratulacje!", -- A_Space_Adventure:moon01
     ["%s wins!"] = "%s wygrywa!", -- Racer, Space_Invasion, TechRacer, ClimbHome
     ["%s wins with a best time of %.1fs."] = "%s wygrywa z najlepszym czasem %.1fs.", -- Racer, TechRacer
     ["Switch: Drop ball of dirt from parachute (once)"] = "Zmiana: Upuść kulę ziemi ze spadochronu (raz)", -- Continental_supplies
@@ -2145,6 +2115,7 @@
     ["switch"] = "przełącz", -- Continental_supplies
     ["Switch: Select weapon special"] = "Zmiana: Wybierz speciał broni", -- Continental_supplies
     ["Switch: Toggle crate radar"] = "Zmiana: Przełącz radar skrzyń", -- WxW
+    ["%s won!"] = "%s wygrywa!", -- A_Space_Adventure:fruit01
     ["Swords"] = "Miecze", -- Bazooka_Battlefield
     ["Syntax Errol"] = "Błąt Składni", -- A_Classic_Fairytale:dragon
     ["%s, you may choose the rules."] = "%s, możesz wybrać zasady.", -- WxW
@@ -2153,6 +2124,8 @@
     ["Tails"] = "Reszka",
     ["Talk about mixed signals..."] = "Mów o pomieszanych sygnałach...", -- A_Classic_Fairytale:dragon
     ["Tall Potato"] = "Wysoki Ziemniak", -- A_Space_Adventure:fruit01
+    ["Tap [Pause] to see the mission texts"] = "Wciśnij [Pauza], by zobaczyć tekst misji", -- Basic_Training_-_Movement
+    ["Tap the “rotating arrow” button on the left|until you have selected Cappy, the hedgehog with the cap!"] = "Wciśnij przycisk \"obracającej się strzałki\" po lewej|dopóki nie wybrałeś Cappiego, jeża z czapką!", -- Basic_Training_-_Movement
     ["Target"] = "Cel", -- HedgeEditor
     ["Target Placement Mode"] = "Tryb Stawiania Celów", -- Construction_Mode
     ["TARGET PLACEMENT MODE"] = "TRYB STAWIANIA CELÓW", -- HedgeEditor
@@ -2168,15 +2141,18 @@
     ["Tatters"] = "Szmaciarze",
     ["Team %d: "] = "Drużyna %d: ",
     ["Team %d"] = "Drużyna %d", -- SimpleMission
+    ["Team highscore: %d"] = "Najlepszy wynik drużyny: %d", -- Utils
     ["Team Identity Mode"] = "Tryb Tożsamości Drużyny", -- HedgeEditor
     ["TEAM IDENTITY MODE"] = "TRYB TOŻSAMOŚCI DRUŻYNY", -- HedgeEditor
-    ["Team of Hearts"] = "Drużyna Serc", -- Challenge_-_Speed_Shoppa_-_Hedgelove
+    ["Team lowscore: %d"] = "Najniższy wynik drużyny: %d", -- Utils
     ["Teams are tied! Continue playing rounds until we have a winner!"] = "Drużyny remisują! Grajcie rundy, aż nie wyłonimy zwycięzcy!", -- Space_Invasion
+    ["Team's best time: %.3fs"] = "Najlepszy czas drużyny: %.3fs", -- Utils
     ["Team Scores:"] = "Wyniki drużyn:", -- Control
     ["Team scores:"] = "Wyniki drużyn:", -- Space_Invasion
+    ["Team's longest time: %.3fs"] = "Najdłuższy czas drużyny: %.3fs", -- Utils
+    ["Team's top accuracy: %d%"] = "Najlepsza celność drużyny: %d%", -- Utils
     ["Teamwork 2"] = "Praca zespołowa 2", -- User_Mission_-_Teamwork_2
     ["Teamwork"] = "Praca zespołowa", -- User_Mission_-_Teamwork
-    ["Team Zook"] = "Drużyna Zook", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
     ["TechRacer"] = "TechWyścig", -- TechRacer
     ["Teleporation Node"] = "Węzeł Teleportacyjny", -- Construction_Mode
     ["Teleportation Mode"] = "Tryb Teleportacji", -- Construction_Mode
@@ -2268,11 +2244,12 @@
     ["The forgotten continent"] = "Zapomniany kontynent", -- Continental_supplies
     ["The giant umbrella from the last crate should help break the fall."] = "Ogromna parasolka z ostatniej skrzyni powinna pomóc pokonać upadek.", -- A_Classic_Fairytale:first_blood
     ["The Great Escape"] = "Wielka ucieczka", -- User_Mission_-_The_Great_Escape
-    ["The Green Bananas lost, try again!"] = "Zielone Banany przegrały, spróbuj ponownie!", -- A_Space_Adventure:fruit01
+    ["- The green target must survive"] = "- Zielony cel musi przeżyć", -- HedgeEditor
+    ["- The green targets must survive"] = "- Zielone cele muszą przeżyć", -- HedgeEditor
     ["The guardian"] = "Stróż", -- A_Classic_Fairytale:shadow
     ["The hardships of the war turned %s (%s) into a killing machine: %d invaders destroyed in one round!"] = "Trudy wojny zamieniły %s (%s) w maszynę do zabijania: %d najeźdźców zniszczonych w jednej rundzie!", -- Space_Invasion
+    ["The health of your current hedgehog|is shown at the top right corner."] = "Zdrowie twojego aktualnego jeża|jest widoczne w prawym-górnym rogu.", -- Basic_Training_-_Movement
     ["The hedgehog with least points (or most deaths) becomes the Bottom Feeder."] = "Jeż z najmniejszą ilością punktów (lub największą śmierci) stanie się Pasożytem.", -- Mutant
-    ["The Hogies"] = "Jeżusie", -- Target_Practice_-_Cluster_Bomb
     ["The Hospital"] = "Szpital",
     ["The Individualist"] = "Indywidualista", -- A_Classic_Fairytale:shadow
     ["Their buildings were very primitive back then, even for an uncivilised island."] = "Ich budynki były wtedy bardzo prymitywne, nawet jak na niecywilizowaną wyspę.", -- A_Classic_Fairytale:united
@@ -2290,7 +2267,6 @@
     ["The Mutant has super-weapons and a lot of health."] = "Mutant ma super bronie i dużo zdrowia.", -- Mutant
     ["The Mutant loses health quickly, but gains health by killing."] = "Mutant szybko traci zdrowie, ale je odnawia zabijając.", -- Mutant
     ["The Mutant loses health quickly if he doesn't keep scoring kills."] = "Mutant szybko traci zdrowie, jeśli przestanie zaliczać zabójstwa.", -- Mutant
-    ["The Nameless One"] = "Bezimienny",
     ["The Navy greets %s for managing to get in a distance of %d away from the mainland!"] = "Marynarka pozdrawia jeża %s, za zdołanie dostać się na odległość %d z dala od lądu!", -- ClimbHome
     ["The next 4 times you play the \"The last encounter\" mission you'll get 20 more hit points and a laser sight."] = "Przez następne 4 razy, w których zagrasz misję \"Ostateczne spotkanie\", dostaniesz 20 więcej punktów zdrowia i celownik laserowy.", -- A_Space_Adventure:death02
     ["The next crate is an utility crate."] = "Następna skrzynia zawiera narzędzia.", -- Basic_Training_-_Movement
@@ -2304,6 +2280,7 @@
     ["The only woman, huh?"] = "Jedyna kobieta, co?", -- A_Classic_Fairytale:epil
     ["The oppression of the elders, of course!"] = "Ucisk starszych, oczywiście!", -- A_Classic_Fairytale:queen
     ["The opression of the elders, of course!"] = "Ucisk starszych, oczywiście!", -- A_Classic_Fairytale:queen
+    ["The other hog has died, he should have survived!"] = "Drugi jeż umarł, a powinien przeżyć!", -- A_Space_Adventure:moon02
     ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "To inne składało się z kanibali, spędzających swój czas na jedzeniu organów jeży...", -- A_Classic_Fairytale:first_blood
     ["The Police"] = "Policja",
     ["The power of love! No, wait, the power of the aliens!"] = "Potęga miłości! Nie, czekaj, potęga obcych!", -- A_Classic_Fairytale:queen
@@ -2328,7 +2305,7 @@
     ["The Showdown"] = "Pojedynek", -- A_Classic_Fairytale:shadow
     ["The Slaughter"] = "Rzeź", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:first_blood
     ["The Society of Perfectionists greets %s (%s): No misses and %d hits in its best round."] = "Społeczeństwo Perfekcjonistów pozdrawia jeża %s (%s): Żadnego pudła i %d trafień w swojej najlepszej rundzie.", -- Space_Invasion
-    ["THE SPECIALISTS"] = "SPECJALIŚCI",
+    ["The Specialists: Each hedgehog starts with its own weapon set"] = "Specjaliści: Każdy jeż zaczyna ze swoim własnym zestawem broni", -- The_Specialists
     ["The spinning arrows above your hedgehog show|which hedgehog is selected right now."] = "Kręcące się strzałki nad twoim jeżem pokazują,|który jeż jest właśnie wybrany.", -- Basic_Training_-_Movement
     ["The spirits of the ancerstors are surely pleased, Leaks A Lot."] = "Dusze przodków są z pewnością zadowolone, Spory Przecieku.", -- A_Classic_Fairytale:first_blood
     ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "Dusze przodków z pewnością są zadowolone, Spory Przecieku.", -- A_Classic_Fairytale:first_blood
@@ -2376,7 +2353,6 @@
     ["This almost concludes our tutorial."] = "To prawie kończy nasz samouczek.", -- Basic_Training_-_Flying_Saucer
     ["This also increases the effectiveness of Medicine."] = "To również zwiększa efektywność Lekarstwa.", -- Continental_supplies
     ["This game wasn’t really exciting."] = "Ta gra nie była naprawdę ekscytująca.", -- Space_Invasion
-    ["This Hog Solo is so naive! When he returns I'll shoot him and keep that device for myself!"] = "Ten Hog Solo jest taki naiwny! Kiedy wróci, zastrzelę go i zatrzymam urządzenie dla siebie!", -- A_Space_Adventure:fruit02
     ["This is a new personal best, congratulations!"] = "To nowy osobisty rekord, gratulacje!", -- A_Space_Adventure:death02, A_Space_Adventure:desert02, A_Space_Adventure:fruit03
     ["This is a new personal best time, congratulations!"] = "To nowy osobisty najlepszy czas, gratulacje!", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
     ["This is Cappy."] = "To jest Czapeczka", -- Basic_Training_-_Movement
@@ -2384,8 +2360,8 @@
     ["This island is the only place left on Earth with grass on it!"] = "Ta wyspa to jedyne pozostałe miejsce na Ziemi, w którym jest trawa!", -- A_Classic_Fairytale:enemy
     ["This is seems like a wealthy hedgehog, nice ..."] = "On wygląda jak bogaty jeż, nieźle...", -- A_Space_Adventure:desert01
     ["This is the mission panel."] = "To jest panel misji.", -- Basic_Training_-_Movement
+    ["This is the Olympic stadium of saucer flying."] = "To jest Stadion Olimpijski Latania Spodkiem.", -- A_Space_Adventure:ice02
     ["This is the Olympic Stadium of Saucer Flying."] = "To jest Stadion Olimpijski Latania Spodkiem.", -- A_Space_Adventure:ice02
-    ["This is the Olympic stadium of saucer flying."] = "To jest Stadion Olimpijski Latania Spodkiem.", -- A_Space_Adventure:ice02
     ["This is typical!"] = "To typowe!", -- A_Classic_Fairytale:dragon
     ["This must be some kind of sorcery!"] = "To musi być jakaś magia!", -- A_Classic_Fairytale:shadow
     ["This must be the caves!"] = "To muszą być jaskinie!", -- A_Classic_Fairytale:backstab
@@ -2394,6 +2370,7 @@
     ["This rain is really something..."] = "Ten deszcz to naprawdę coś...",
     ["This round’s award for ultimate disappointment goes to: Everyone!"] = "Nagroda tej rundy za ostateczne rozczarowanie idzie do: Każdego!", -- ClimbHome
     ["This seems like a wealthy hedgehog, nice ..."] = "To wygląda jak bogaty jeż, nieźle...", -- A_Space_Adventure:desert01
+    ["This %s is so naive! I'm going to shoot this fool so I can keep that device for myself!"] = "Ten %s jest taki naiwny! Mam zamiar zastrzelić tego głupca, żeby zatrzymać urządzenie dla siebie!", -- A_Space_Adventure:fruit02
     ["This was an awesome performance! But this challenge can be finished with even just one RC plane. Can you figure out how?"] = "To było niesamowite przedstawienie! Ale to wyzwanie może być ukończone tyko jednym samolocikiem. Potrafsz wykombinować jak?", -- User_Mission_-_RCPlane_Challenge
     ["This will be fun!"] = "To będzie zabawne!", -- A_Classic_Fairytale:enemy
     ["This will be useful when I need a new platform or if I want to rise."] = "To będzie żyteczne, kiedy będę potrzebował platformy albo chciał się wznieść.", -- portal
@@ -2434,11 +2411,11 @@
     ["To begin with the training, hit the attack key!"] = "By zacząć trening, wciśnij przycisk ataku!", -- Basic_Training_-_Movement
     ["To begin with the training, select the bazooka from the ammo menu!"] = "By zacząć trening, wybierz bazookę z menu amunicji!", -- Basic_Training_-_Bazooka
     ["To begin with the training, select the grenade from the ammo menu!"] = "By zacząć trening, wybierz granat z menu amunicji!", -- Basic_Training_-_Grenade
+    ["To begin with the training, tap the attack button!"] = "By zacząć trening, wciśnij przycisk ataku!", -- Basic_Training_-_Movement
     ["To finish hedgehog selection, just do anything|with him, like walking."] = "By skończyć wybierać jeża, zrób z nim cokolwiek,|np. rusz się", -- Basic_Training_-_Movement
     ["To get over the next obstacles, keep some distance from the wall before you back jump."] = "By przekroczyć następną przeszkodę, utrzymaj trochę dystansu od ściany zanim skoczysz w tył.", -- Basic_Training_-_Movement
     ["To get over the water, you have to do multiple|rope shots and swings."] = "By przejść przez wodę, musisz wykonać wielokrotne|strzały i zamachy liną.", -- Basic_Training_-_Rope
     ["Toggle Editing Weapons and Tools: [Precise]+[2]"] = "Przełącz edytujące bronie i narzędzia: [Precyzja]+[2]", -- HedgeEditor
-    ["Toggle Gear Information: [Precise]+[3]"] = "Przełącz informacje o rzeczach: [Precyzja]+[3]", -- HedgeEditor
     ["Toggle Help: [Precise]+[1]"] = "Przełącz pomoc: [Precyzja]+[1]", -- HedgeEditor
     ["Toggle Placement/Deletion: [Left], [Right]"] = "Przełącz ustawianie/usuwanie: [Lewo], [Prawo]", -- HedgeEditor
     ["Toggle Shield: [Long jump]"] = "Przełącz osłonę: [Długi skok]", -- Space_Invasion
@@ -2448,14 +2425,14 @@
     ["Too bad! Then you should really leave!"] = "Jaka szkoda! Więc musisz naprawdę odejść!", -- A_Space_Adventure:fruit01
     ["Too slow! Try again ..."] = "Za wolno! Spróbuj ponownie...", -- A_Space_Adventure:moon02
     ["Top-class elite pilot"] = "Elitarny pilot najwyższej klasy", -- User_Mission_-_RCPlane_Challenge
-    ["To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"] = "By postawić belkę wybierz ją, użyj [Lewo] i [Prawo], by wybrać kąt i długość, ustaw używając [Lewy Klik]", -- A_Classic_Fairytale:shadow
     ["To reach higher ground, walk to a ledge, look to the left, then do a back jump."] = "By dostać się na wyższy poziom, wejdź na krawędz, spójrz w lewo i wykonaj skok w tył.", -- Basic_Training_-_Movement
     ["Torn Muscle"] = "Rozerwany Mięsień", -- A_Classic_Fairytale:journey
     ["To the caves..."] = "Do jaskiń...", -- A_Classic_Fairytale:united
     ["Touch all waypoints as fast as you can!"] = "Dotknij wszystkich punktów kontrolnych najszybciej jak potrafisz!", -- Racer
-    ["To win the game, Hog Solo has to get the bottom crates and come back to the surface."] = "By wygrać tę grę, Hog Solo musi dostać się do skrzyń na dnie i wrócić z powrotem na powierzchnię.", -- A_Space_Adventure:fruit02
+    ["- Touch the sparkles near your base to teleport"] = "- Dotknij iskier przy swojej bazie, by się teleportować", -- CTF_Blizzard
+    ["To win the game, %s has to get the bottom crates and come back to the surface."] = "By wygrać grę, %s musi się dostać do dolnych skrzyń i wrócić na powierzchnię.", -- A_Space_Adventure:fruit02
     ["To win the game you had to collect the 2 crates with no specific order."] = "By wygrać grę, musisz zebrać 2 skrzynie, bez specjalnej kolejności.", -- A_Space_Adventure:desert01
-    ["To win the game you have to eliminate all your enemies."] = "By wygrać grę, musisz wyeliminować wszystkich swoich wrogów.", -- A_Space_Adventure:death01
+    ["To win the game you have to eliminate Professor Hogevil."] = "By wygrać grę, musisz wyeliminować Profesora Jeżozło.", -- A_Space_Adventure:death01
     ["To win the game you have to find the right crate."] = "By wygrać grę, musisz znaleźć odpowiednią skrzynię.", -- A_Space_Adventure:desert01
     ["To win the game you have to go next to Thanta."] = "By wygrać grę, musisz pójść obok Tanty.", -- A_Space_Adventure:ice01
     ["To win the game you have to go to the surface."] = "By wygrać grę, musisz pójść na powierzchnię.", -- A_Space_Adventure:desert02
@@ -2463,13 +2440,10 @@
     ["To win the game you have to stand next to Thanta."] = "By wygrać grę, musisz stanąć obok Tanty.", -- A_Space_Adventure:ice01
     ["Toxic Team"] = "Toksyczny Zespół",
     ["Track completed!"] = "Trasa ukończona!", -- Racer, TechRacer
-    ["Trainee"] = "Trenujący", -- TargetPractice
     ["Training complete!"] = "Trening ukończony!", -- Basic_Training_-_Flying_Saucer
-    ["Training Team"] = "Drużyna Treningowa", -- TargetPractice
     ["Training"] = "Trening", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
     ["Traitors don't get to shout around here!"] = "Zdrajcy tutaj nie krzyczą!", -- A_Classic_Fairytale:epil
     ["Traitors"] = "Zdrajcy", -- A_Classic_Fairytale:epil
-    ["Trapped"] = "Uwięziony", -- Basic_Training_-_Movement
     ["Trapper"] = "Traper", -- HedgeEditor
     ["Travel carefully as your fuel is limited"] = "Lataj ostrożnie, gdyż twoje paliwo jest ograniczone", -- A_Space_Adventure:cosmos
     ["Travel to all the neighbor planets and collect all the pieces"] = "Poleć na wszystkie sąsiednie planety i zbierz wszystkie części", -- A_Space_Adventure:cosmos
@@ -2486,7 +2460,6 @@
     ["Try to land softly, as you can still take fall damage!"] = "Spróbuj wylądować miękko, bo nadal możesz otrzymać obrażenia od upadku!", -- Basic_Training_-_Flying_Saucer
     ["Try to protect the chief! You won't lose if he dies, but it is advised that he survives."] = "Spróbuj ochronić wodza! Nie przegramy, gdy on umrze, ale zalecane jest, by przeżył.", -- A_Classic_Fairytale:united
     ["Try to reach and destroy the next target quickly."] = "Spróbuj dostać się i zniszczyć następny cel szybko.", -- Basic_Training_-_Rope
-    ["T_T"] = "T_T",
     ["Tumbler"] = "Akrobata", -- Tumbler
     ["Turn around: [Left Shift] + [Left]/[Right]"] = "Obróć się: [Lewy Shift] + [Lewo]/[Prawo]", -- Basic_Training_-_Movement
     ["Turning Around"] = "Obracanie się", -- Basic_Training_-_Movement
@@ -2505,7 +2478,6 @@
     ["Uhmm...ok no."] = "Umm... niedobrze.", -- A_Classic_Fairytale:enemy
     ["Ukemi"] = "Ukemi",
     ["Ultra kill!"] = "Ultra zabójstwo!", -- Mutant
-    ["Ultrasoldier"] = "Ultrażołnierz", -- Big_Armory
     ["unC0Rr"] = "unC0Rr",
     ["Under Construction"] = "W Trakcie Budowy", -- A_Classic_Fairytale:shadow
     ["Under normal circumstances we could easily defeat them but we have kindly sent most of our men to the Kingdom of Sand to help with the annual dusting of the king's palace."] = "W normalnych okolicznościach pokonalibyśmy ich z łatwością, ale życzliwie wysłaliśmy większość naszych ludzi do Królestwa Piasku, by pomóc z corocznym odkurzaniu pałacu króla.", -- A_Space_Adventure:fruit01
@@ -2530,7 +2502,6 @@
     ["Unit"] = "Jednostka",
     ["Unlike bazookas, grenades are not influenced by wind."] = "W przeciwieństwie do bazook, na granaty wiatr nie ma wpływu.", -- Basic_Training_-_Grenade
     ["Unlimited Attacks: Attacks don't end your turn"] = "Nieskończone ataki: Ataki nie kończą twojej tury", -- User_Mission_-_Diver, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree
-    ["Unlimited Attacks"] = "Nieograniczone ataki",
     ["Unlucky Sods"] = "Pechowi Kolesie", -- User_Mission_-_Rope_Knock_Challenge
     ["Unstoppable!"] = "Nie do zatrzymania!",
     ["Unsuspecting Louts"] = "Niepodejrzewające Chamy", -- User_Mission_-_Rope_Knock_Challenge
@@ -2545,13 +2516,14 @@
     ["Use it with precaution!"] = "Użyj tego z ostrożnośćią!", -- A_Classic_Fairytale:first_blood
     ["User Challenge"] = "Wyzwanie użytkownika",
     ["!"] = "!", -- User_Mission_-_Dangerous_Ducklings
+    ["User Mission"] = "Misja użytkownika", -- HedgeEditor
     ["Use the attack key twice to change the flying saucer while being in air."] = "Wciśnij dwukrotnie przycisk ataku, by zmienić latający talerz w powietrzu.", -- A_Space_Adventure:ice02
     ["Use the attack key twice to change the flying saucer while floating in mid-air."] = "Wciśnij dwukrotnie przycisk ataku, by zmienić latający talerz unosząc w powietrzu.", -- A_Space_Adventure:ice02
     ["Use the bazooka and the flying saucer to get the freezer."] = "Użyj bazooki i latającego talerza, by zdobyć zamrażarkę.", -- A_Space_Adventure:ice01
     ["Use the flying saucer from the crate to fly to the moon."] = "Użyj latającego talerza ze skrzyni, by polecieć na księżyc.", -- A_Space_Adventure:cosmos
     ["Use the flying saucer to fly to other planets."] = "Użyj latającego talerza, by polecieć na inne planety.", -- A_Space_Adventure:cosmos
     ["Use the flying saucer to fly to the other planets."] = "Użyj latającego talerza, by polecieć na inne planety.", -- A_Space_Adventure:cosmos
-    ["Use the parachute ([Space] while in air) to get the next crate"] = "Użyj spadochronu ([Spacja] w powietrzu), by zdobyć następną skrzynię", -- A_Classic_Fairytale:first_blood
+    ["Use the parachute to get the next crate."] = "Użyj spadochronu, by zdobyć następną skrzynię.", -- A_Classic_Fairytale:first_blood
     ["Use the portal gun to get to the next crate, then use the new gun to get to the final destination!|"] = "Użyj wyrzutnika portali, by zdobyć następną skrzynię, potem użyj nowej broni, by dostać sie do ostatniego celu!|", -- A_Classic_Fairytale:dragon
     ["Use the RC plane and destroy the all the targets."] = "Użyj radiowego samolociku i zniszcz wszystkie cele.", -- A_Space_Adventure:desert03
     ["Use the rope in order to catch the blue hedgehog"] = "Użyj liny, żeby złapać niebieskiego jeża", -- A_Space_Adventure:moon02
@@ -2584,7 +2556,6 @@
     ["Victory Condition: Collect"] = "Warunek zwycięstwa: Zbierz", -- HedgeEditor
     ["Victory Condition: Destroy"] = "Warunek zwycięstwa: Zniszcz", -- HedgeEditor
     ["Victory for %s!"] = "Zwycięstwo dla %s!", -- Capture_the_Flag
-    ["Victory for the "] = "Zwycięstwo przypadło",
     ["Victory!"] = "Zwycięstwo!", -- Basic_Training_-_Rope
     ["Violence is not the answer to your problems!"] = "Przemoc nie jest odpowiedzią na twoje problemy!", -- A_Classic_Fairytale:first_blood
     ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "Odwiedź planety Lodu, Pustyni i owoców, zanim udasz się na Planetę Śmierci", -- A_Space_Adventure:cosmos
@@ -2604,9 +2575,6 @@
     ["Walls left: %d"] = "Pozostałe ściany: %d", -- WxW
     ["Wall to wall"] = "Ściana do ściany", -- WxW
     ["Waluigi"] = "Waluigi",
-    ["Wannabe Flyboys"] = "Lotniczy Pozerzy", -- User_Mission_-_RCPlane_Challenge
-    ["Wannabe Ropers"] = "Niedoszli liniarze", -- Basic_Training_-_Rope
-    ["Wannabe Shoppsta"] = "Shoppi Pozerzy", -- User_Mission_-_Rope_Knock_Challenge
     ["Wario"] = "Wario",
     ["Warming Up"] = "Rozgrzewka", -- Basic_Training_-_Grenade
     ["Warning: Fire cake detected"] = "Ostrzeżenie: Ogniste ciasto wykryte", -- ClimbHome
@@ -2635,7 +2603,6 @@
     ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "Bronie: Jeże dostaną 1 z 3 broni losowo w każdej turze", -- Battalion
     ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "Bronie: Prawie każdy wariant jeża dostaje 1 kamikaze", -- Battalion
     ["Weapon specials: Some weapons have special modes (see weapon description)."] = "Speciały broni: Niektóre bronie mają specjalne tryby (zobacz opis broni).", -- Continental_supplies
-    ["Weapons Reset"] = "Reset broni",
     ["Weapons reset: The weapons are reset after each turn."] = "Reset broni: Bronie resetują się po każdej turze.", -- WxW
     ["We are indeed."] = "Jesteśmy zaiste.", -- A_Classic_Fairytale:backstab
     ["We can't defeat them!"] = "Nie możemy ich pokonać!", -- A_Classic_Fairytale:shadow
@@ -2652,9 +2619,9 @@
     ["We have to hurry! Are you armed?"] = "Musimy się pośpieszyć! Jesteś uzbrojony?", -- A_Space_Adventure:moon01
     ["We have to protect the village!"] = "Musimy bronić wioski!", -- A_Classic_Fairytale:united
     ["We have to unite and defeat those cylergs!"] = "Musimy się zjednoczyć i pokonać cylergów!", -- A_Classic_Fairytale:enemy
-    ["Welcome Hog Solo, surprised to see me?"] = "Witaj, Hogu Solo, zaskoczony moim widokiem?", -- A_Space_Adventure:death01
     ["Welcome home! Please take a seat"] = "Witaj w domu! Usiądź proszę", -- ClimbHome
     ["Welcome, Leaks A Lot!"] = "Witaj, Spory Przecieku!", -- A_Classic_Fairytale:journey
+    ["Welcome, %s, surprised to see me?"] = "Witaj, %s, zaskoczony widząc mnie?", -- A_Space_Adventure:death01
     ["Welcome to the Death Planet!"] = "Witaj na Planecie Śmierci!", -- A_Space_Adventure:cosmos
     ["Welcome to the Desert Planet!"] = "Witaj na Planecie Pustyni!", -- A_Space_Adventure:cosmos
     ["Welcome to the Fruit Planet!"] = "Witaj na Planecie Owoców!", -- A_Space_Adventure:cosmos
@@ -2821,16 +2788,16 @@
     ["You can’t open a portal on the blue surface."] = "Nie możesz otworzyć portalu na niebieskiej powierzchni.", -- portal
     ["You can use the other 2 hogs to assist you."] = "Możesz użyć 2 innych jeży, by ci pomogli.", -- A_Space_Adventure:fruit02
     ["You can use the rope to reach new places."] = "Możesz użyć liny, by dostać się do nowych miejsc.", -- Basic_Training_-_Rope
-    ["You choose well, Hog Solo!"] = "Wybierz dobrze, Hog Solo!", -- A_Space_Adventure:fruit01
+    ["You choose well, %s!"] = "Wybierz mądrze, %s!", -- A_Space_Adventure:fruit01
     ["You completed the mission in %.3f seconds."] = "Ukończyłeś tę misję w %.3f sekund.", -- A_Space_Adventure:ice02
     ["You completed the mission in %d rounds."] = "Ukończyłeś tę misję w %d rund.", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03
-    ["You couldn't have come to a worse time, Hog Solo!"] = "Nie mógłbyś przyjść w gorszym czasie, Hogu Solo!", -- A_Space_Adventure:fruit01
+    ["You couldn't have come to a worse time, %s!"] = "Nie mogłeś przyjść o gorszej porze, %s!", -- A_Space_Adventure:fruit01
     ["You couldn't possibly believe that after refusing my offer I'd just let you go!"] = "Nie mógłbyś chyba wierzyć, że po odrzuceniu mojej oferty po prostu puściłbym cię wolno!", -- A_Classic_Fairytale:journey
     ["You'd almost swear the water was rising!"] = "Prawie byś przysiągł, że woda zdaje się podnosić!",
     ["You'd better watch your steps..."] = "Lepiej patrz po nogi...", -- A_Classic_Fairytale:journey
     ["You defended yourself against Captain Lime."] = "Obroniłeś się przed Kapitanem Limonką.", -- A_Space_Adventure:fruit02
-    ["You defended yourself against the Fruit Assassins."] = "Obroniłeś się przed Owocowymi Zabójcami.", -- A_Space_Adventure:fruit02
-    ["You did great, Hog Solo! However, we aren't out of danger yet!"] = "Dobrze się spisałeś, Hog Solo! Jednakże, wciąż nie jesteśmy bezpieczni!", -- A_Space_Adventure:cosmos
+    ["You defended yourself against %s."] = "Broń się przeciwko %s.", -- A_Space_Adventure:fruit02
+    ["You did great, %s! However, we aren't out of danger yet!"] = "Dobrze sobie poradziłeś, %s! Jednakże, wciąż jesteśmy zagrożeni!", -- A_Space_Adventure:cosmos
     ["You did not make it in time, try again!"] = "Nie udało ci się na czas, spróbuj ponownie!", -- Basic_Training_-_Rope
     ["You don't deserve my sacrifice!"] = "Nie zasługujesz na moje poświęcenie!", -- A_Classic_Fairytale:queen
     ["You drove Professor Hogevil away."] = "Odpędziłeś Profesora Jeżozło.", -- A_Space_Adventure:moon01
@@ -2846,12 +2813,12 @@
     ["You got me!"] = "Masz mnie!", -- A_Space_Adventure:moon02
     ["You had %.1fs remaining on the clock (+%d points)."] = "Pozostało ci na zegarze %.1fs sekund (+%d punktów).", -- TargetPractice
     ["You had %.2fs remaining on the clock (+%d points)."] = "Pozostało ci na zegarze %.2fs sekund (+%d punktów).", -- Basic_Training_-_Sniper_Rifle
-    ["You had %d additional flying saucers left."] = "Pozostało ci %d dodatkowych latających talerzy.", -- A_Space_Adventure:ice02
     ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: You might want to use some mines ..."] = "Masz 7 tur, zanim następna fala nadejrzie.|Upewnij się, że nadchodzące kanibale są odpowiednio powitane!|Jeśli umrze jeż, sprawa jest stracona.|Wskazówka: Możesz chcieć użyć paru min...", -- A_Classic_Fairytale:backstab
     ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: you might want to use some mines..."] = "Masz 7 tur, zanim przybędzie następna fala.|Upewnij się, że przybywający kanibale zostaną odpowiednio powitani!|Jeśli jeż umrze, sprawa będzie przegrana.|Porada: możesz chcieć użyć paru min...", -- A_Classic_Fairytale:backstab
     ["You have acquired the last device part."] = "Zdobyłeś ostatnią część urządzenia.", -- A_Space_Adventure:death01
     ["You have activated Switch Hedgehog!"] = "Aktywowałeś Zmianę Jeża!", -- Basic_Training_-_Movement
     ["You have beaten the challenge!"] = "Pokonałeś wyzwanie!", -- ClimbHome
+    ["You have beaten the team record, congratulations!"] = "Pobiłeś rekord drużyny, gratulacje!", -- Utils
     ["You have been giving us out to the enemy, haven't you!"] = "Wydawałeś nas wrogom, co nie!", -- A_Classic_Fairytale:backstab
     ["You have chosen the perfect moment to leave."] = "Wybrałeś idealny moment, by odejść.", -- A_Classic_Fairytale:united
     ["You have chosen to fight!"] = "Wybrałeś bitwę!", -- A_Space_Adventure:fruit01
@@ -2870,7 +2837,6 @@
     ["You have eliminated all visible enemy hedgehogs!"] = "Wyeliminowałeś wszystkie widoczne wrogie jeże!", -- A_Space_Adventure:fruit01
     ["You have eliminated Professor Hogevil."] = "Wyeliminowałeś Profesora Jeżozło.", -- A_Space_Adventure:moon01
     ["You have eliminated the evil minions."] = "Wyeliminowałeś złych sługusów.", -- A_Space_Adventure:moon01
-    ["You have eliminated the whole evil team. You're pretty tough!"] = "Wyeliminowałeś całą złą drużynę. Jesteś całkiem twardy!", -- A_Space_Adventure:moon01
     ["You have escaped successfully."] = "Pomyślnie uciekłeś.", -- A_Space_Adventure:desert02
     ["You have failed to complete your task, young one!"] = "Nie udało ci się ukończyć twojego zadania, młodzieńcze!", -- A_Classic_Fairytale:journey
     ["You have failed to save the tribe!"] = "Nie udało ci się uratować plemienia!", -- A_Classic_Fairytale:backstab
@@ -2925,6 +2891,7 @@
     ["You have to travel again"] = "Musisz podróżować ponownie", -- A_Space_Adventure:cosmos
     ["You have to try again!"] = "Musisz spróbować ponownie!", -- A_Space_Adventure:cosmos
     ["You have triggered the secret Do-Not-Rope-to-the-Moon Defense System."] = "Uruchomiłeś sekretny Nie-Używaj-Liny-Na-Księżyc System Obronny.", -- A_Space_Adventure:cosmos
+    ["You have unlocked the target radar!"] = "Odblokowałeś radar celów!", -- TargetPractice
     ["You have used %d flying saucers."] = "Użyłeś %d latających talerzy.", -- A_Space_Adventure:ice02
     ["You have used %d RC planes."] = "Użyłeś %d radiowych samolocików.", -- User_Mission_-_RCPlane_Challenge
     ["You have used only 1 RC plane. Outstanding!"] = "Użyłeś tylko 1 radiowy samolocik. Wybitnie!", -- User_Mission_-_RCPlane_Challenge
@@ -2943,10 +2910,9 @@
     ["You'll have only 2 watermelon bombs during the game."] = "Będziesz miał tylko 2 arbuzowe bomby podczas tej gry.", -- A_Space_Adventure:fruit03
     ["You'll have only one RC plane at the start of the mission."] = "Będziesz miał tylko jeden radiowy samolocik na początku misji.", -- A_Space_Adventure:desert03
     ["You'll have to eliminate Captain Lime at the end."] = "Będziesz musiał na koniec wyeliminować Kapitana Limonkę.", -- A_Space_Adventure:fruit02
-    ["You'll have to eliminate the Fruit Assassins at the end."] = "Będziesz musiał wyeliminować na koniec Owocowych Zabójców.", -- A_Space_Adventure:fruit02
+    ["You'll have to eliminate %s at the end."] = "Będziesz musiał na końcu weliminować %s.", -- A_Space_Adventure:fruit02
     ["You'll lose if you die or if your time is up."] = "Przegrasz, jeśli zginiesz lub skończy ci się czas.", -- A_Space_Adventure:moon02
     ["You'll see what I mean!"] = "Zobaczysz, co mam na myśli!", -- A_Classic_Fairytale:enemy
-    ["You lose!"] = "Przegrywasz!", -- Basic_Training_-_Sniper_Rifle, Big_Armory, Basic_Training_-_Bazooka, TargetPractice, ClimbHome
     ["You lost your target, try again!"] = "Straciłeś swój cel, spróbuj ponownie!", -- TargetPractice
     ["You may find it handy."] = "Może ci się przydać.", -- A_Space_Adventure:cosmos
     ["You may only attack from a rope!"] = "Możesz atakować tylko z liny!", -- WxW
@@ -2968,8 +2934,7 @@
     ["Your accuracy was %.1f%% (+%d points)."] = "Twoja celność wynosiła %.1f%% (+%d punktów).", -- TargetPractice
     ["Your accuracy was %.1f%%."] = "Twoja celność wynosiła %.1f%%.", -- Basic_Training_-_Bazooka, TargetPractice
     ["Your ammo is limited this time."] = "Twoja amunicja jest teraz ograniczona.", -- Basic_Training_-_Bazooka
-    ["Your deaths will be avenged, Cannibals!"] = "Wasze śmierci zostaną pomszczone, Kanibale!", -- A_Classic_Fairytale:enemy
-    ["Your deaths will be avenged, Natives!"] = "Wasze śmierci zostaną pomszczone, Tubylcy!", -- A_Classic_Fairytale:enemy
+    ["Your deaths will be avenged, %s!"] = "Wasze śmierci zostaną pomszczone, %s!", -- A_Classic_Fairytale:enemy
     ["Your death will not be in vain, Dense Cloud!"] = "Twoja śmierć nie pójdzie na marne, Gęsta Chmuro!", -- A_Classic_Fairytale:shadow
     ["You're a coward!"] = "Jesteś tchórzem!", -- A_Classic_Fairytale:queen
     ["You're...alive!? But we saw you die!"] = "Ty... żyjesz?! Ale widzieliśmy jak umierasz!", -- A_Classic_Fairytale:backstab
@@ -2997,21 +2962,21 @@
     ["Your next task is to collect some crates by using the rope!"] = "Twoje następne zadanie to zebrać trochę skrzyń, używając liny!", -- A_Classic_Fairytale:first_blood
     ["Your personal best time so far: %.3f seconds"] = "Twój osobisty najlepszy czas jak dotąd: %.3f sekund", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
     ["Your rank: %s"] = "Twoja ranga: %s", -- User_Mission_-_RCPlane_Challenge
-    ["You saved %d of 8 Hapless Hogs."] = "Uratowałeś %d z 8 Nieszczęśliwych Jeży.", -- User_Mission_-_That_Sinking_Feeling
+    ["Your rope is gone! Try again!"] = "Twoja lina się skończyła! Spróbuj ponownie!", -- Basic_Training_-_Rope
+    ["You saved %d of 8 hegehogs."] = "Uratowałeś %d z 8 jeży.", -- User_Mission_-_That_Sinking_Feeling
     ["You see, hedgehog spikes are very, very valuable."] = "Widzisz, kolce jeża są bardzo, bardzo cenne.", -- A_Classic_Fairytale:queen
     ["You see the wind strength at the bottom right corner."] = "Możesz zobaczyć siłę wiatru w prawym dolnym rogu.", -- Basic_Training_-_Bazooka
+    ["You see the wind strength at the top."] = "Na górze widzisz siłę wiatru.", -- Basic_Training_-_Bazooka
     ["You should have known that we don't rely on meatbags!"] = "Powinienieś wiedzieć, że nie polegamy na mięsnych workach!", -- A_Classic_Fairytale:queen
     ["You should know this more than anyone, Leaks!"] = "Powinieneś to wiedzieć lepiej niż wszyscy, Przecieku!", -- A_Classic_Fairytale:queen
     ["You speak great truth, Hannibal. Here, take a sip!"] = "Mówisz wielką prawdę, Hannibalu. Masz, weź łyka!", -- A_Classic_Fairytale:epil
     ["You've been assaulting us, we have been just defending ourselves!"] = "Najeżdżaliście nas, my tylko się broniliśmy!", -- A_Classic_Fairytale:enemy
-    ["You've failed. Try again."] = "Przegrałeś. Spróbuj jeszcze raz",
     ["You've reached the goal!| |Time: "] = "Dotarłeś do celu!| |Czas: ",
     ["You will be avenged!"] = "Zostaniesz pomszczony!", -- A_Classic_Fairytale:shadow
     ["You will fail if you run out of ammo and there are still targets available."] = "Oblejesz, jeśli skończy ci się amunicja i zostaną dostępne cele.", -- A_Space_Adventure:desert03
     ["You will gain some extra ammo from the crates the next time you play the \"Getting to the device\" mission."] = "Dostaniesz trochę dodatkowej amunicji ze skrzyń następnym razem, gdy zagrasz w misję \"Dojście do urządzenia\".", -- A_Space_Adventure:fruit03
     ["You will play every 3 turns."] = "Będziesz grał co każde 3 tury.", -- A_Space_Adventure:fruit01
     ["- You will recieve 2-4 weapons on each kill! (Even on own hogs)"] = "- Otrzymasz 2-3 bronie za każde zabójstwo! (Nawet swoich jeży)", -- Continental_supplies
-    ["You win!"] = "Wygrywasz!", -- Big_Armory
     ["You won't believe what happened to me!"] = "Nie uwierzysz, co mi się przytrafiło!", -- A_Classic_Fairytale:backstab
     ["Yuck! I bet they'll keep worshipping her even after I save the village!"] = "Fuj! Założę się, że dalej będą ją czcić, nawet jak uratuję wioskę.", -- A_Classic_Fairytale:family
     ["Yumme Gunpowder"] = "Pyszny Proch Strzelniczy",
@@ -3019,6 +2984,7 @@
     ["Zombie"] = "Zombie",
     ["Zombi"] = "Zombi", -- portal
     ["'Zooka Team"] = "Bazookinierzy",
-    ["Zook"] = "Zook", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
+    ["Zoom: [Pinch] with 2 fingers"] = "Przybliż: [Uszczypnij] dwoma palcami", -- Basic_Training_-_Movement
+    ["Zoom: [Rotate mouse wheel]"] = "Przyybliż: [Obróć kółkiem myszy]", -- Basic_Training_-_Movement
     ["Zork"] = "Zork", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen
 }
--- a/share/hedgewars/Data/Locale/pl.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/pl.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -54,6 +54,7 @@
 00:51=Kula błotna
 00:52=Nie wybrano broni
 00:53=TARDIS
+; 00:54=Budynek
 00:54=Miotacz błota
 00:55=Zamrażarka
 00:56=Tasak
@@ -110,6 +111,7 @@
 01:45=%1: %2
 01:46=[Klan] %1: %2
 01:47=[%1]: %2
+01:48=?
 
 ; Zdarzenia
 ; Jeż (%1) umiera
@@ -605,6 +607,7 @@
 03:51=Znalezione na ziemi
 03:52=UNUSED
 03:53=Typ 40
+;03:54=Zbuduj coś
 03:54=Narzędzie
 03:55=Chłodniej już nie będzie!
 03:56=Nie przytnij sobie igieł!
@@ -730,3 +733,5 @@
 06:24=/shrug: Spraw, by jeż wzruszył ramionami
 06:25=/wave: Spraw, by jeż pomachał dłonią
 06:26=Nieznana komenda lub niepoprawne parametry. Powiedz w czacie "/help" dla listy komend.
+06:27=/help room: Lista komend czatu w pokoju
+06:28=Nie jesteś online!
--- a/share/hedgewars/Data/Locale/pt_BR.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/pt_BR.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -26,7 +26,6 @@
 --      ["Above-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Accuracy Bonus! +15 points"] = "", -- Space_Invasion
 --      ["Accuracy bonus: +%d points"] = "", -- Basic_Training_-_Sniper_Rifle
-      ["Ace"] = "Ás", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge
 --      ["Achievement gotten: %s"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_That_Sinking_Feeling, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, Basic_Training_-_Rope, Tumbler
       ["A Classic Fairytale"] = "Um conto de fadas clássico", -- A_Classic_Fairytale:first_blood
 --      ["A crate critical to this mission has been destroyed."] = "", -- SimpleMission
@@ -46,7 +45,6 @@
 --      ["Again with the 'cannibals' thing!"] = "", -- A_Classic_Fairytale:enemy
 --      ["A Hedgewars minigame"] = "", -- Capture_the_Flag
 --      ["A Hedgewars mini-game"] = "", -- Racer, Space_Invasion, TechRacer, Tumbler
-      ["a Hedgewars mini-game"] = "um mini-jogo Hedgewars", -- Space_Invasion, The_Specialists
 --      ["A Hedgewars tag game"] = "", -- Mutant
 --      ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome
 --      ["Aim at the ceiling and hold [Attack] pressed until the rope attaches."] = "", -- Basic_Training_-_Rope
@@ -141,13 +139,14 @@
 --      ["As you've seen, the dropped grenade roughly fell into your flying direction."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Athlete"] = "", -- Battalion
 --      ["Attack: Activate"] = "", -- Racer
---      ["Attack Captain Lime before he attacks back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack Captain Lime before he attacks back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack From Rope: %s"] = "", -- WxW
 --      ["Attack From Rope: You may only attack from a rope."] = "", -- WxW
 --      ["Attack rule: %s"] = "", -- WxW
 --      ["Attack: Select this continent"] = "", -- Continental_supplies
 --      ["Attack: [Space]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
---      ["Attack the assassins before they attack back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack: Tap the [Bomb]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
+--      ["Attack the assassins before they attack back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack: Throw ball"] = "", -- Knockball
 --      ["At the end of the game your health was %d."] = "", -- A_Space_Adventure:ice01
 --      ["At the start of the game each enemy hog has only the weapon that he is named after."] = "", -- A_Space_Adventure:death02
@@ -155,16 +154,18 @@
 --      ["Available weapon specials:"] = "", -- Continental_supplies
 --      ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion
---      ["Avoid the mines!"] = "", -- Basic_Training_-_Rope
 --      ["Axes"] = "", -- Bazooka_Battlefield
 --      ["Aye! Fellow! Let me exit this chamber of doom!"] = "", -- A_Classic_Fairytale:epil
 --      ["Back Breaker"] = "", -- A_Classic_Fairytale:backstab
 --      ["Back in the village, after telling the villagers about the threat..."] = "", -- A_Classic_Fairytale:united
 --      ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil
 --      ["Back Jump: [Backspace] ×2"] = "", -- Basic_Training_-_Movement
+--      ["Back Jump: Double-tap the [Curvy Arrow]"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (1/2)"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (2/2)"] = "", -- Basic_Training_-_Movement
 --      ["Backstab"] = "", -- A_Classic_Fairytale:backstab
+--      ["Backwards jump: Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Backwards jump: Tap the [Curvy Arrow] twice"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Bacon"] = "", -- 
 --      ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Badmad"] = "", -- portal
@@ -197,7 +198,6 @@
 --      ["Bazooka Battlefield"] = "", -- Bazooka_Battlefield
 --      ["Bazooka Master"] = "", -- Basic_Training_-_Bazooka
 --      ["Bazookas are influenced by wind."] = "", -- Basic_Training_-_Bazooka
---      ["Bazooka Team"] = "", -- Basic_Training_-_Bazooka
 	["Bazooka Training"] = "Treino com a Bazuca",
 --      ["Bearded Beast"] = "", -- 
 --      ["Be careful, the future of Hogera is in your hands!"] = "", -- A_Space_Adventure:cosmos
@@ -231,7 +231,6 @@
 --      ["Bloodpie"] = "", -- A_Classic_Fairytale:backstab
 --      ["Bloodrocutor"] = "", -- A_Classic_Fairytale:shadow
 --      ["Bloodsucker"] = "", -- A_Classic_Fairytale:shadow
---      ["Bloody Rookies"] = "", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 --      ["Blue"] = "", -- 
 --      ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Bob"] = "", -- A_Space_Adventure:cosmos
@@ -314,7 +313,9 @@
 --      ["Challenge objectives"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit03, A_Space_Adventure:moon02
 --      ["Challenge over!"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa, ClimbHome
+--      ["Change bounciness: Tap [B]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Content: [Left], [Right]"] = "", -- HedgeEditor
+--      ["Change detonation timer: Tap the [Clock]"] = "", -- Basic_Training_-_Grenade, A_Classic_Fairytale:shadow
 --      ["Change direction: [Left]/[Right]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Change Health: [Left], [Right]"] = "", -- HedgeEditor
@@ -334,6 +335,8 @@
 --      ["Chicken"] = "", -- 
 --      ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01
 --      ["Chikorita"] = "", -- 
+--      ["Choose location: Left click"] = "", -- A_Classic_Fairytale:shadow
+--      ["Choose location: Tap the [Target] button, then tap on the spot you want to choose"] = "", -- A_Classic_Fairytale:shadow
 --      ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Choose your continent wisely, as your decision will be permanent."] = "", -- Continental_supplies
 --      ["Choose your side! If you want to join the strange man, walk up to him.|Otherwise, walk away from him. If you decide to att...nevermind..."] = "", -- A_Classic_Fairytale:shadow
@@ -342,7 +345,6 @@
 --      ["Cleaver"] = "", -- Construction_Mode
 --      ["Cleaver Placement Mode"] = "", -- Construction_Mode
 --      ["CLEAVER PLACEMENT MODE"] = "", -- HedgeEditor
---      ["Climber"] = "", -- ClimbHome
 --      ["Climb Home"] = "", -- ClimbHome
 --      ["Closing in"] = "", -- A_Classic_Fairytale:queen
 --      ["Clown"] = "", -- HedgeEditor
@@ -352,11 +354,13 @@
 --      ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb
 --      ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey
 --      ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey
+--      ["- Collect all the blue crates"] = "", -- HedgeEditor
       ["Collect all the crates, but remember, our time in this life is limited!"] = "Colete todas as caixas, mas lembre-se: nosso tempo nesta vida é limitado!", -- A_Classic_Fairytale:first_blood
 --      ["Collect or destroy all the health crates."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Collect or destroy the final crate to finish the training."] = "", -- Basic_Training_-_Flying_Saucer
+--      ["- Collect the blue crate"] = "", -- HedgeEditor
 --      ["Collect the crate and attack!"] = "", -- WxW
-      ["Collect the crate on the right.|Hint: Select the rope, [Up] or [Down] to aim, [Space] to fire, directional keys to move.|Ropes can be fired again in the air!"] = "Pegue a caixa à direita.|Dica: Selecione a corda, [Cima] ou [Baixo] para mirar, [Espaço] para atirar, teclas direcionais para se mover.|Cordas podem ser disparadas novamente no ar!", -- A_Classic_Fairytale:first_blood
+--      ["Collect the crate on the right."] = "", -- A_Classic_Fairytale:first_blood
       ["Collect the crates within the time limit!|If you fail, you'll have to try again."] = "Colete as caixas dentro do limite de tempo!|Se falhar, você terá que tentar de novo.", -- A_Classic_Fairytale:first_blood
 --      ["Collect the first crate to begin!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Collect the freezer and get the device part from Thanta."] = "", -- A_Space_Adventure:ice01
@@ -424,7 +428,6 @@
 --      ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates per turn: %d"] = "", -- WxW
---      ["crate(s)"] = "", -- SpeedShoppa
 --      ["Crazy Gravity: Gravity randomly changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity
 --      ["Crazy Runner"] = "", -- A_Space_Adventure:moon02
 --      ["Cricket Time"] = "", -- Continental_supplies
@@ -457,11 +460,10 @@
 --      ["Deals 15 damage to all enemies in the circle."] = "", -- Continental_supplies
 --      ["Deer"] = "", -- 
 --      ["Defeat all enemies!"] = "", -- portal
+--      ["Defeat!"] = "", -- HedgeEditor
 --      ["Defeat Professor Hogevil!"] = "", -- A_Space_Adventure:death01
---      ["Defeat the cannibals"] = "", -- A_Classic_Fairytale:backstab
---      ["Defeat the cannibals!|"] = "", -- A_Classic_Fairytale:united
+--      ["Defeat the cannibals!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cannibals!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Defeat the cannibals!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cyborgs!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen
 --      ["Delete Waypoint"] = "", -- HedgeEditor
@@ -482,11 +484,11 @@
 --      ["Destroyer of planes"] = "", -- User_Mission_-_RCPlane_Challenge
       ["Destroy him, Leaks A Lot! He is responsible for the deaths of many of us!"] = "Destrua-o, Vaza Demais! Ele é responsável pelas mortes de muitos de nós!", -- A_Classic_Fairytale:first_blood
 --      ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion
+--      ["- Destroy the enemy"] = "", -- HedgeEditor
+--      ["- Destroy the red target"] = "", -- HedgeEditor
+--      ["- Destroy the red targets"] = "", -- HedgeEditor
 --      ["Destroy the targets!"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
-      ["Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."] = "Destrua os alvos!|Dica: Selecione o Shoryuken e aperte [Espaço]|Obs.: Você pode usá-lo em pleno ar.", -- A_Classic_Fairytale:first_blood
-      ["Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"] = "Destrua os alvos!|Dica: [Cima], [Baixo] para mirar, [Espaço] para atirar", -- A_Classic_Fairytale:first_blood
 --      ["+%d flamer fuel!"] = "", -- Tumbler
---      ["%d Hapless Hogs left"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["+%d health"] = "", -- Mutant
 --      ["%d-Hit Combo! +%d points!"] = "", -- Space_Invasion
 --      ["Did anyone follow you?"] = "", -- A_Classic_Fairytale:united
@@ -507,7 +509,6 @@
 --      ["Disguise as a Rockhopper Penguin"] = "", -- Continental_supplies
 --      ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies
 --      ["Displacer"] = "", -- 
---      ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Diver"] = "", -- User_Mission_-_Diver
 --      ["%d ms"] = "", -- HedgeEditor
 --      ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen
@@ -594,10 +595,8 @@
 --      ["Elderbot"] = "", -- A_Classic_Fairytale:family
 --      ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape
 	["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Destrua todos os alvos antes que o tempo acabe.|Você tem munição infinita para esta missão.", --Bazooka, Shotgun, SniperRifle
---      ["Eliminate the Blue Team before the time runs out."] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Eliminate the enemy before the time runs out."] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 --      ["Eliminate the enemy hogs to win."] = "",
---      ["Eliminate the enemy specialists."] = "",
 --      ["Eliminate the enemy."] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh
 --      ["Eliminate Unit 3378."] = "", -- User_Mission_-_Teamwork
 --      ["Eliminate WatchBot 4000."] = "", -- User_Mission_-_Teamwork_2
@@ -622,13 +621,14 @@
 --      ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab
 --      ["Except me, of course! I just saved a whole planet!"] = "", -- A_Space_Adventure:final
 --      ["Experienced beginner"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Explore the tunnel with the other hedgehogs and search for the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Explore the tunnel with the other hedgehogs and search for the device."] = "", -- A_Space_Adventure:fruit02
 --      ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02
 --      ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey
 --      ["Fair Wind"] = "", -- 
 --      ["Fall Damage"] = "", -- Basic_Training_-_Movement
 --      ["Fallen Angel"] = "", -- Tentacle_Terror
 --      ["Family Reunion"] = "", -- A_Classic_Fairytale:family
+--      ["Fastest escape: %d turns"] = "", -- A_Space_Adventure:desert02
 --      ["Fastest lap: %.3fs by %s"] = "", -- TrophyRace
 	["Fastest lap: "] = "Volta mais rápida: ",
 --      ["Feeble Resistance"] = "",
@@ -648,11 +648,12 @@
 --      ["Final result"] = "", -- Mutant
 --      ["Final Targets"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
 --      ["Final team scores:"] = "", -- Space_Invasion
+--      ["Find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Find a way to detonate all the explosives and stay alive!"] = "", -- A_Space_Adventure:final
 --      ["Find your tribe!|Cross the lake!"] = "", -- A_Classic_Fairytale:dragon
 --      ["Finish this challenge as fast as possible to earn bonus points."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Finish waypoint placement"] = "", -- Racer
---      ["Finish your training|Hint: Animations can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Finish your training."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Finite Ropes"] = "", -- Basic_Training_-_Rope
 --      ["Fire a rocket with napalm."] = "", -- Continental_supplies
 --      ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler
@@ -680,6 +681,7 @@
 --      ["Flying Saucer Training"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Fly into space to fight off the invaders with barrels!"] = "", -- Space_Invasion
 --      ["Fly to the meteorite and detonate the explosives"] = "", -- A_Space_Adventure:cosmos
+--      ["Follow the path and destroy the next target."] = "", -- Basic_Training_-_Rope
 --      ["Forgetfulness: You will lose all your weapons each turn."] = "", -- Continental_supplies
 --      ["For the next crate, you have to do back jumps."] = "", -- Basic_Training_-_Movement
 --      ["Four Eyes"] = "", -- 
@@ -699,8 +701,6 @@
 --      ["“g=150”, where 150 is 150% of normal gravity."] = "", -- Gravity
 --      ["“g=50, g2=150, period=4000” for gravity changing|from 50 to 150 and back with period of 4000 ms."] = "", -- Gravity
 --      ["Galaxy Guardians"] = "", -- Big_Armory
---      ["Game Modifiers: "] = "",
---      ["GAME OVER!"] = "",
 --      ["Game over!"] = "", -- Space_Invasion
 --      ["Game Started!"] = "",
 --      ["Game? Was this a game to you?!"] = "", -- A_Classic_Fairytale:enemy
@@ -710,8 +710,6 @@
 --      ["Gasp! A smuggler!"] = "", -- A_Space_Adventure:desert01
 --      ["Gasp!"] = "", -- A_Space_Adventure:desert01
 --      ["Gathering fruits all day long."] = "", -- A_Classic_Fairytale:queen
---      ["Gear information hidden"] = "", -- HedgeEditor
---      ["Gear information shown"] = "", -- HedgeEditor
 --      ["Gear Placement Tool"] = "", -- HedgeEditor
 --      ["General information"] = "", -- Continental_supplies
 --      ["General information:"] = "", -- Continental_supplies
@@ -721,7 +719,7 @@
 --      ["Get Dense Cloud out of the pit!"] = "", -- A_Classic_Fairytale:journey
 --      ["Get him, Spike!"] = "", -- A_Space_Adventure:desert01
 --      ["Get on over there and take him out!"] = "",
---      ["Get on the head of the mole"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Get on the head of the mole."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Get past the flower."] = "", -- A_Classic_Fairytale:journey
 --      ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01
 --      ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood
@@ -759,7 +757,6 @@
 --      ["GO! GO! GO!"] = "",
 --      ["Good birdy......"] = "",
 --      ["Good bye!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Good Dude"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Good idea, they'll never find us there!"] = "", -- A_Classic_Fairytale:united
 --      ["Good job!"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Good job! Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -770,7 +767,7 @@
 --      ["Good so far!"] = "",
 --      ["Good to go!"] = "",
 --      ["Good! You now control Cappy."] = "", -- Basic_Training_-_Movement
---      ["Go on top of the flower"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Go on top of the flower."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Go, quick!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Gorkij"] = "", -- A_Classic_Fairytale:journey
 --      ["Go surf!"] = "", -- WxW
@@ -793,7 +790,6 @@
 --      ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow
 --      ["Green"] = "", -- 
 --      ["Green Bananas"] = "", -- A_Space_Adventure:fruit01
---      ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Green double rings also give you a new flying saucer."] = "", -- A_Space_Adventure:ice02
 --      ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01
 --      ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01
@@ -803,11 +799,8 @@
 --      ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Greetings from the Navy, %s (%s), for being a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["Greetings, %s!"] = "", -- A_Classic_Fairytale:dragon
---      ["Greg"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
---      ["Grenade Group"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard
 --      ["Grenades explode after 1 to 5 seconds (you decide)."] = "", -- Basic_Training_-_Grenade
 --      ["Grenades with high bounciness bounce a lot and behave chaotic."] = "", -- Basic_Training_-_Grenade
---      ["Grenade Team"] = "", -- Basic_Training_-_Grenade
 --      ["Grenade Training"] = "", -- Basic_Training_-_Grenade
 --      ["Grenadiers"] = "", -- Basic_Training_-_Grenade
 --      ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor
@@ -848,7 +841,6 @@
 --      ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion
 --      ["Health Modification Mode"] = "", -- HedgeEditor
 --      ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor
---      ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
 --      ["Heavenly Defense"] = "", -- Tentacle_Terror
 --      ["Heavy"] = "",
 --      ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united
@@ -861,6 +853,7 @@
 --      ["Hedgehog Projectile"] = "", -- Continental_supplies
 --      ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies
 --      ["Hedgehogs can not be deleted."] = "", -- HedgeEditor
+--      ["Hedgehogs left: %d"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Hedgehogs will be revived after their death."] = "", -- Mutant
 --      ["Hedgehogs will start in the first waypoint."] = "", -- Racer
 --      ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab
@@ -876,7 +869,6 @@
 --      ["Help Enabled"] = "", -- HedgeEditor
 --      ["Helpers: Each team starts with %d helper points"] = "", -- Battalion
 --      ["Helpers: Hogs will get 1 out of 2 helpers randomly each turn"] = "", -- Battalion
---      ["Help Hog Solo to find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Help me, Leaks!"] = "", -- A_Classic_Fairytale:journey
 --      ["Help me, please!!!"] = "", -- A_Classic_Fairytale:journey
 --      ["Help me, please!"] = "", -- A_Classic_Fairytale:journey
@@ -891,20 +883,20 @@
 --      ["Here you will find the current mission instructions."] = "", -- Basic_Training_-_Movement
 --      ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Heroic Wind"] = "", -- Continental_supplies
---      ["Hero Team"] = "", -- User_Mission_-_The_Great_Escape
 --      ["He's so brave..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["He was the lab assistant of Dr. Goodhogan, the inventor of the anti-gravity device."] = "", -- A_Space_Adventure:moon02
 --      ["He won't be selling us out anymore!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey, don't forget us! We still need to climb up!"] = "", -- A_Classic_Fairytale:family
 --      ["Hey, guys!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey guys!"] = "", -- A_Classic_Fairytale:united
---      ["Hey, Hog Solo! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey! I was supposed to collect it!"] = "", -- A_Space_Adventure:fruit02
+--      ["Hey, %s! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey, %s! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey
 --      ["Hidden"] = "", -- portal
 --      ["High Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["High Jump: [Backspace]"] = "", -- Basic_Training_-_Movement
+--      ["High Jump: Tap the [Curvy Arrow] shortly"] = "", -- Basic_Training_-_Movement
 --      ["--- Highland ---"] = "", -- Battalion
 --      ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander
 --      ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion
@@ -915,20 +907,24 @@
 --      ["Hill Guard"] = "", -- Bazooka_Battlefield
 --      ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01
 --      ["--- Hint ---"] = "", -- Battalion
---      ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
 --      ["Hint: Drilling holes should solve everything."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: Hold down [M] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: If this mission panel disappears, you can|see it again by hitting the Pause or Quit key."] = "", -- Basic_Training_-_Movement
 --      ["Hint: It might be a good idea to place a girder before starting to drill. Just saying."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: It might be easier if you vary the angle only slightly."] = "", -- Basic_Training_-_Bazooka
+--      ["Hint: Just select the parachute, it opens automatically when you fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion
 --      ["Hint: Launch the bazooka horizontally at full power."] = "", -- Basic_Training_-_Bazooka
---      ["Hint: Press [Esc] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Pause the game to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Select the blow torch, aim and press [Fire]. Press [Fire] again to stop."] = "", -- A_Classic_Fairytale:journey
 --      ["Hint: Select the low gravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey
+--      ["Hint: Select the rope, [Up] or [Down] to aim, [Attack] to fire, directional keys to move."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Select the Shoryuken and hit [Attack].|P.S.: You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: %s needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family
 --      ["Hint: The rope only bends around objects.|When it doesn't hit anything, it's always straight."] = "", -- Basic_Training_-_Rope
 --      ["Hint: To jump higher, wait a bit before you hit “High Jump” a second time."] = "", -- Basic_Training_-_Movement
+--      ["Hint: To place a girder, select it,|then use [Left] and [Right] to select angle and length,|then choose a location for the girder."] = "", -- A_Classic_Fairytale:shadow
 --      ["Hint: Use the quit key to see the team’s continent."] = "", -- Continental_supplies
 --      ["Hint: When you shorten the rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope
 --      ["Hint: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey
@@ -962,24 +958,11 @@
 --      ["Hogminator"] = "", -- A_Classic_Fairytale:family
 --      ["Hog nueve"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog octo"] = "", -- A_Space_Adventure:fruit03
---      ["Hogonauts"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Hog onze"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog Saturn"] = "", -- A_Space_Adventure:fruit03
 --      ["Hogs in sight!"] = "", -- Continental_supplies
 --      ["Hog Solo and GB"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hog Solo"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01, A_Space_Adventure:moon02
---      ["Hog Solo couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo escaped successfully!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo has to reach the last crates"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo has to refuel his saucer."] = "", -- A_Space_Adventure:moon01
---      ["Hog Solo lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
---      ["Hog Solo wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["- Hogs will be revived"] = "", -- Capture_the_Flag
 --      ["- Hogs will drop the flag when killed"] = "", -- Capture_the_Flag
 --      ["Hog two"] = "", -- A_Space_Adventure:fruit03
@@ -989,9 +972,7 @@
 --      ["Homing Bee"] = "", -- Construction_Mode
 --      ["Honda"] = "", -- 
 --      ["Honest Lee"] = "", -- A_Classic_Fairytale:enemy
---      ["Hook"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
 --      ["Hooks"] = "", -- 
---      ["Hooray!"] = "",
 --      ["Hooray! I actually did it! Hogera is safe!"] = "", -- A_Space_Adventure:final
 --      ["Hooray! I've found it, now I have to get back to Captain Lime!"] = "", -- A_Space_Adventure:fruit02
 --      ["Hooray! You are a champion!"] = "", -- A_Space_Adventure:ice02
@@ -1007,7 +988,7 @@
 --      ["However, if you fail to do so, she dies a most violent death, just like your friend! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, if you fail to do so, she dies a most violent death! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, my mates don't agree with me on letting you go..."] = "", -- A_Classic_Fairytale:dragon
---      ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
+--      ["However, the army of %s is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
 --      ["How to Rope"] = "", -- Basic_Training_-_Rope
 --      ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen
 --      ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen
@@ -1027,7 +1008,6 @@
 --      ["I can't believe what I'm hearing!"] = "", -- A_Classic_Fairytale:backstab
 --      ["I can't let you go further because …"] = "", -- A_Classic_Fairytale:queen
 --      ["I can't wait any more, I have to save myself!"] = "", -- A_Classic_Fairytale:shadow
---      ["Ice"] = "", -- Basic_Training_-_Movement
 --      ["Ice Jake"] = "", -- A_Space_Adventure:ice01
 --      ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family
 --      ["Icy Girder: [3]"] = "", -- HedgeEditor
@@ -1085,7 +1065,6 @@
 --      ["I just found out that they have captured your princess!"] = "", -- A_Classic_Fairytale:family
 --      ["I just want the strange device you found!"] = "", -- A_Space_Adventure:ice01
 --      ["I just wonder where Ramon and Spiky disappeared..."] = "", -- A_Classic_Fairytale:journey
---      ["Ikeda"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["I know and I'm terribly sorry!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know, my hero!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know that your resources are low due to the battle but I'll send two of my best hogs to assist you."] = "", -- A_Space_Adventure:fruit02
@@ -1113,6 +1092,7 @@
 --      ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen
 --      ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united
 --      ["IMPORTANT: To see the mission panel again, hold the mission panel key."] = "", -- Basic_Training_-_Movement
+--      ["IMPORTANT: To see the mission panel again, pause the game."] = "", -- Basic_Training_-_Movement
 --      ["Impressive...you are still dry as the corpse of a hawk after a week in the desert..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["%i ms"] = "", -- Gravity
 --      ["I'm so glad this is finally over!"] = "", -- A_Space_Adventure:final
@@ -1271,7 +1251,6 @@
 --      ["Kill the traitor, %s, or spare his life!"] = "", -- A_Classic_Fairytale:backstab
 --      ["--- King ---"] = "", -- Battalion
 --      ["King"] = "", -- Battalion
---      ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing
 --      ["--- King Mode ---"] = "", -- Battalion
 --      ["Knight"] = "", -- Battalion
 --      ["Knives"] = "", -- 
@@ -1290,7 +1269,7 @@
 --      ["Launch some bazookas to destroy the targets!"] = "", -- Basic_Training_-_Bazooka
 --      ["Leader"] = "", -- A_Classic_Fairytale:enemy
 --      ["Leaderbot"] = "", -- A_Classic_Fairytale:queen
---      ["Lead the Green Bananas to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
+--      ["Lead your allies to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
 --      ["Leaks A Lot"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Leaks A Lot, depressed for killing his loved one, failed to save the village..."] = "", -- A_Classic_Fairytale:journey
 --      ["Leaks A Lot gave his life for his tribe! He should have survived!"] = "", -- A_Classic_Fairytale:first_blood
@@ -1305,7 +1284,6 @@
 --      ["Left/right: Choose crate contents"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode
---      ["Left Tong"] = "", -- Bazooka_Battlefield
 --      ["Legs"] = "", -- 
 --      ["Less tools, more fun"] = "", -- Battalion
 --      ["Lestat"] = "", -- portal
@@ -1334,18 +1312,19 @@
 --      ["Lively Lifeguard"] = "",
 --      ["Lonely Cries"] = "", -- Continental_supplies
 --      ["Lonely Cries: [Rise the water if no hog is in the circle and deal 6 damage to all enemy hogs.]"] = "", -- Continental_supplies
---      ["Lonely Hog"] = "", -- ClimbHome
 --      ["Long Jump: [Enter]"] = "", -- Basic_Training_-_Movement
+--      ["Long Jump: Tap the [Curvy Arrow] button for long"] = "", -- Basic_Training_-_Movement, A_Classic_Fairytale:first_blood
 --      ["Long Live The Queen"] = "", -- A_Classic_Fairytale:queen
 --      ["Look around: [Mouse movement]"] = "", -- Basic_Training_-_Movement
+--      ["Look around: [Tap or swipe on the screen]"] = "", -- Basic_Training_-_Movement
 --      ["Look, boss! There is the target!"] = "", -- A_Space_Adventure:moon01
 --      ["Look, I had no choice!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! There's more of them!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! We're surrounded by cannibals!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Looks like the whole world is falling apart!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Look to the left and do a backwards jump towards the mushroom."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Loon"] = "", -- The_Specialists
 --      ["Loopy"] = "", -- 
---      ["Lord Evil"] = "", -- Tentacle_Terror
 --      ["Losing Condition: Destroy"] = "", -- HedgeEditor
 --      ["Low Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander
@@ -1365,7 +1344,6 @@
 --      ["Mario"] = "", -- 
 --      ["Mark gears for win/lose conditions"] = "", -- HedgeEditor
 --      ["Mark/unmark gear: [Left Click]"] = "", -- HedgeEditor
---      ["Mark"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
 --      ["- Massive weapon bonus on first turn"] = "", -- Continental_supplies
 --      ["Max Citrus"] = "", -- A_Space_Adventure:fruit01
 --      ["Maybe you should try an easier map next time."] = "", -- Racer
@@ -1380,7 +1358,6 @@
 --      ["Mega kill!"] = "", -- Mutant
 --      ["Meiwes"] = "", -- A_Classic_Fairytale:backstab
 --      ["mikade"] = "", -- 
---      ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer
 --      ["Mindy"] = "", -- A_Classic_Fairytale:united
 --      ["Mine Deployer"] = "",
 --      ["Mine Placement Mode"] = "", -- Construction_Mode
@@ -1399,12 +1376,12 @@
 --      ["Minion"] = "", -- A_Space_Adventure:moon01
 --      ["Minions"] = "", -- A_Space_Adventure:moon01
 --      ["Mission failed!"] = "", -- Big_Armory
---      ["MISSION FAILED"] = "", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Mission failure in %d s"] = "", -- Big_Armory
+--      ["Mission"] = "", -- HedgeEditor
 --      ["Mission lost!"] = "", -- Basic_Training_-_Grenade
 --      ["Mission Panel"] = "", -- Basic_Training_-_Movement
 --      ["Mission panel: [M]"] = "", -- Basic_Training_-_Movement
---      ["MISSION SUCCESSFUL"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+--      ["Mission succeeded!"] = "", -- portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, SimpleMission, HedgeEditor
 --      ["Mission won!"] = "", -- Basic_Training_-_Grenade
 --      ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02
 --      ["Mixed %d"] = "", -- WxW
@@ -1420,7 +1397,6 @@
 --      ["Monster kill!"] = "", -- Mutant
 --      ["Monsters"] = "", -- 
 --      ["Mooney"] = "", -- 
---      ["More Natives"] = "", -- A_Classic_Fairytale:epil
 --      ["Morris"] = "", -- 
 --      ["Most mines are not active."] = "", -- A_Space_Adventure:desert02
 --      ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01
@@ -1440,13 +1416,11 @@
 --      ["Nade Boy"] = "", -- Basic_Training_-_Grenade
 --      ["Nah, probably everyone was just stupid."] = "", -- A_Space_Adventure:final
 --      ["Name"] = "", -- A_Classic_Fairytale:queen
---      ["Nameless Heroes"] = "",
 --      ["Nancy Screw"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:queen
 --      ["Napalm"] = "", -- Construction_Mode
 --      ["Napalm Rocket"] = "", -- Continental_supplies
 --      ["Napalm rocket: [Fire a bomb with napalm!]"] = "", -- Continental_supplies
 --      ["Naranja Jed"] = "", -- A_Space_Adventure:fruit01
---      ["Natives"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Naughty Ninja"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Near a PAotH base on the moon ..."] = "", -- A_Space_Adventure:moon01
 --      ["Near Secret Base 17 of PAotH in the rural Hogland ..."] = "", -- A_Space_Adventure:cosmos
@@ -1541,11 +1515,8 @@
 --      ["Oh, my!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oh, my! I forgot something!"] = "", -- A_Classic_Fairytale:queen
 --      ["Oh, my! This is even more entertaining than I've expected!"] = "", -- A_Classic_Fairytale:backstab
---      ["Oh no! Just try again!"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Oh no, not %s!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
---      ["Oh no, the Green Bananas have betrayed Hog Solo and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
-	["Oh no! Time's up! Just try again."] = "Oh não! O tempo acabou! Tente novamente.", --Bazooka, Shotgun, SniperRifle
---      ["Oh no! You failed! Just try again."] = "", -- Basic_Training_-_Cluster_Bomb
+--      ["Oh no, the companions have betrayed %s and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
 --      ["Oh no! You have died. Try again!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Oh! Please spare me. You can take all my treasures!"] = "", -- A_Space_Adventure:ice01
 --      ["Oh, silly me! I forgot that I'm the shaman."] = "", -- A_Classic_Fairytale:backstab
@@ -1567,9 +1538,9 @@
 --      ["One shall not judge one by one's appearance!"] = "", -- A_Classic_Fairytale:epil
 --      ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oneye"] = "", -- portal
---      ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant
 --      ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant
+--      ["Only %s can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard
 --      ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01
@@ -1581,6 +1552,7 @@
 --      ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01
 --      ["Oops! You have selected the wrong hedgehog! Just try again."] = "", -- Basic_Training_-_Movement
 --      ["Open ammo menu: [Right click]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
+--      ["Open ammo menu: Tap the [Suitcase]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
 --      ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Opposing Team: "] = "",
 --      ["Orange"] = "", -- 
@@ -1600,15 +1572,14 @@
 --      ["PAotH has sent explosives but unfortunately the trigger mechanism seems to be faulty!"] = "", -- A_Space_Adventure:cosmos
 --      ["Parachute"] = "", -- Continental_supplies
 --      ["Patches"] = "", -- 
---      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02
 --      ["Pause: [P]"] = "", -- Basic_Training_-_Movement
+--      ["Pause: Tap the [Pause] button"] = "", -- Basic_Training_-_Movement
 --      ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW
 --      ["Penguin Roar"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hog’s health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Perfect! Now try to get the next crate without hurting yourself!"] = "", -- A_Classic_Fairytale:first_blood
---      ["Per-Hog Ammo"] = "",
 --      ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh
 --      ["Personal best: %.3f seconds"] = "", -- A_Space_Adventure:ice02
 --      ["Per team weapons"] = "", -- Continental_supplies
@@ -1617,7 +1588,6 @@
 --      ["Physicist"] = "", -- HedgeEditor
 --      ["Piano Strike"] = "", -- Construction_Mode
 --      ["Pikachu"] = "", -- 
---      ["Pincer Knights"] = "", -- Bazooka_Battlefield
 --      ["Pings left: %d"] = "", -- Space_Invasion
 --      ["Pink"] = "", -- 
 --      ["Pirates"] = "", -- 
@@ -1669,9 +1639,7 @@
 --      ["Please wait …"] = "", -- WxW
 --      ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion
 --      ["--- Points ---"] = "", -- Battalion
---      ["points"] = "", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
 --      ["--- Points Mode ---"] = "", -- Battalion
---      ["point(s)"] = "", -- TargetPractice, Mutant
 --      ["Poison"] = "",
 --      ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02
 --      ["Poisonous, deals no damage."] = "", -- Continental_supplies
@@ -1691,37 +1659,37 @@
 --      ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to fight"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos
---      ["Prepare yourself"] = "",
+--      ["Prepare yourself, %s!"] = "", -- The_Specialists
 --      ["Press [Attack] (space bar by default) to start,|repeadedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] (space bar by default) to start,|repeatedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] to begin."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Attack] to confirm."] = "", -- Continental_supplies
 --      ["Press [Attack] to select this continent!"] = "", -- Continental_supplies
 --      ["Press [Left] and [Right] to change the difficulty."] = "", -- A_Classic_Fairytale:first_blood
---      ["Press [Left] or [Right] to move around, [Enter] to jump"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Press [Left] or [Right] to move around, [Long Jump] to jump forwards."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW
 --      ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW
+--      ["Press [M] to see the mission texts"] = "", -- Basic_Training_-_Movement
 --      ["Press [Precise] to skip intro"] = "",
 --      ["Press [Up] and [Down] to move between menu items.|Press [Attack], [Left], or [Right] to toggle."] = "", -- WxW
 --      ["Prestigious Pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Princess"] = "", -- A_Classic_Fairytale:family, A_Classic_Fairytale:journey
 --      ["Princess Peach"] = "", -- 
---      ["Private Nolak"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["Problems, dude? Chillax!"] = "", -- A_Classic_Fairytale:epil
 --      ["Professional pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professional stunt pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professor"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
 --      ["Professor Hogevil, then known as James Hogus, worked for PAotH back in my time."] = "", -- A_Space_Adventure:moon02
+--      ["Professor's Team"] = "", -- A_Space_Adventure:death01
 --      ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
---      ["Pro Killers"] = "", -- Big_Armory
 --      ["Protect the King: When the king dies, so does the team"] = "", -- Battalion
 --      ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Protect yourselves!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Purple"] = "", -- 
 --      ["Pyro"] = "", -- HedgeEditor, The_Specialists
 --      ["Pyromancer"] = "", -- Battalion
 --      ["Quit: [Esc]"] = "", -- Basic_Training_-_Movement
 --      ["Race complexity limit reached"] = "", -- Racer, TechRacer
+--      ["Race failed!"] = "", -- A_Space_Adventure:moon02
 --      ["Racer"] = "", -- Racer
 --      ["Racer tool"] = "", -- Racer
 --      ["Race"] = "", -- TrophyRace
@@ -1757,23 +1725,19 @@
 --      ["Replenishment: Weapons are restocked on turn start of a new hog"] = "", -- Highlander
 --      ["Repositioning Mode"] = "", -- HedgeEditor
 --      ["REPOSITIONING MODE"] = "", -- HedgeEditor
---      ["rescues"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Rescue the imprisoned PAotH team and get the fuel!"] = "", -- A_Space_Adventure:moon01
 --      ["Respawner"] = "", -- Construction_Mode
 --      ["Respawner: Resurrects dead hogs."] = "", -- Construction_Mode
 --      ["Resurrector"] = "", -- Construction_Mode
 --      ["Retract/Extend rope: [Up]/[Down]"] = "", -- Basic_Training_-_Rope
 --      ["- Return the enemy flag to your base to score"] = "", -- Capture_the_Flag
---      [" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = "",
 --      ["Return to Leaks A Lot!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Return to the mission menu by pressing the \"Go back\" button."] = "", -- A_Space_Adventure:cosmos
 --      ["Return to the Surface"] = "", -- A_Space_Adventure:fruit02
 --      ["Return to the training menu by pressing the “Go back” button."] = "", -- Basic_Training_-_Movement
---      ["Rhombus"] = "", -- Basic_Training_-_Movement
 --      ["Rider"] = "", -- portal
 --      ["Rifleman"] = "", -- Battalion
 --      ["Righteous Beard"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:queen, A_Classic_Fairytale:united
---      ["Right Tong"] = "", -- Bazooka_Battlefield
 --      ["Ripe"] = "", -- 
 --      ["Rise the water if nobody else is in the circle and deal 6 damage to all enemy hogs."] = "", -- Continental_supplies
 --      ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01
@@ -1782,8 +1746,8 @@
 --      ["Roof"] = "", -- WxW
 --      ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Rope Master"] = "", -- Basic_Training_-_Rope
---      ["Roper"] = "", -- SpeedShoppa
 --      ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
+--      ["Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Rope Team"] = "", -- Basic_Training_-_Rope
 --      ["Rope Training"] = "", -- Basic_Training_-_Rope
 --      ["Rope Weapons"] = "", -- Basic_Training_-_Rope
@@ -1797,7 +1761,6 @@
 --      ["Round limit:"] = "", -- TechRacer
 --      ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer
 --      ["Round's slowest lap: %.3fs by %s"] = "", -- TrophyRace
---      ["Rounds until Sudden Death: %d"] = "", -- Battalion
 --      ["RS1"] = "", -- A_Space_Adventure:fruit03
 --      ["RS2"] = "", -- A_Space_Adventure:fruit03
 --      ["Rubber"] = "", -- Construction_Mode, HedgeEditor
@@ -1823,10 +1786,17 @@
 --      ["Salvation was one step closer now..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Sam"] = "", -- A_Space_Adventure:cosmos
 --      ["Sandals?! I thought you left your ring!"] = "", -- A_Classic_Fairytale:queen
+--      ["%s and GB"] = "", -- A_Space_Adventure:fruit02
 --      ["%s and %s enter the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sandstorm"] = "", -- A_Space_Adventure:desert01
 --      ["Sandy"] = "", -- A_Space_Adventure:desert01
---      ["Save as many hapless hogs as possible!"] = "",
+--      ["%s arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
+--      ["Save as many hogs as possible!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey
 --      ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow
 --      ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor
@@ -1838,9 +1808,9 @@
 --      ["Scallywag"] = "", -- 
 --      ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab
 --      ["Scenario"] = "", -- Big_Armory, portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape
---      ["Scenario failed!"] = "", -- SimpleMission
 --      ["Scientist"] = "", -- Battalion
 --      ["%s climbed home in %d seconds!"] = "", -- ClimbHome
+--      ["%s (contd.)"] = "", -- A_Classic_Fairytale:epil
 --      ["Score: %d"] = "", -- Space_Invasion
 --      ["Score goal: %d"] = "", -- Control
 --      ["Score graph"] = "", -- Mutant, Space_Invasion
@@ -1850,6 +1820,7 @@
 --      ["Scores"] = "", -- Mutant
 --      ["Scores:"] = "", -- Mutant
 --      ["Scoring: "] = "", -- Mutant
+--      ["%s couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
 --      ["Script parameter examples:"] = "", -- Gravity
 --      ["%s (+%d)"] = "", -- Battalion
 --      ["%s: %d"] = "", -- Capture_the_Flag, Control
@@ -1862,10 +1833,9 @@
 --      ["%s died … and lives again!"] = "", -- Construction_Mode
 --      ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome
 --      ["%s, %d sec"] = "", -- Continental_supplies
---      ["Search for the device with the help of the other hedgehogs "] = "", -- A_Space_Adventure:fruit02
+--      ["Search for the device with the help of the other hedgehogs."] = "", -- A_Space_Adventure:fruit02
 --      ["Searching in the dust"] = "", -- A_Space_Adventure:desert01
 --      ["Searching the stars!"] = "", -- A_Space_Adventure:cosmos
---      ["seconds"] = "", -- ClimbHome
 --      ["Seduction"] = "", -- Continental_supplies
 --      ["Seems like every time you take a \"walk\", the enemy finds us!"] = "", -- A_Classic_Fairytale:backstab
 --      ["See that crate farther on the right?"] = "", -- A_Classic_Fairytale:first_blood
@@ -1892,6 +1862,7 @@
 --      ["Select your continent with [Up]/[Down] or by selecting a representative weapon."] = "", -- Continental_supplies
 --      ["%s enters the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sergey"] = "", -- 
+--      ["%s escaped successfully!"] = "", -- A_Space_Adventure:fruit01
 --      ["Set bounciness: [Left Shift] + [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set detonation timer: [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set Health: [Left Click]"] = "", -- HedgeEditor
@@ -1915,10 +1886,12 @@
 --      ["%s has been killed before taking enough damage first."] = "", -- SimpleMission
 --      ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has been rescued from death"] = "", -- Construction_Mode
+--      ["%s has dropped the flag!"] = "", -- CTF_Blizzard
 --      ["%s has fallen victim to gravity."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has mutated! +2 points"] = "", -- Mutant
 --      ["%s has passed the best height of %s!"] = "", -- ClimbHome
 --      ["%s has scored!"] = "", -- Capture_the_Flag
+--      ["%s has to refuel the saucer."] = "", -- A_Space_Adventure:moon01
 --      ["%s hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil
 --      ["sheepluva"] = "", -- 
@@ -1935,8 +1908,6 @@
 --      ["Shinobi"] = "", -- 
 --      ["%s hit the ground."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Shoppa Love"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
---      ["Shoppa Union"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes, Challenge_-_Speed_Shoppa_-_ShoppaKing
---      ["Shoppers"] = "", -- SpeedShoppa
 --      ["Shotgun"] = "", -- Continental_supplies
 --      ["Sigh."] = "", -- A_Classic_Fairytale:epil
 --      ["Silly"] = "",
@@ -1949,11 +1920,11 @@
 --      ["%s is now as poor as a church mouse"] = "", -- Construction_Mode
 --      ["%s is now a zombie hedgehog"] = "", -- Construction_Mode
 --      ["%s is suddenly low on ammo"] = "", -- Construction_Mode
---      ["Skip your turn to try again."] = "", -- Basic_Training_-_Rope
 --      ["Skulls"] = "", -- Bazooka_Battlefield
 --      ["Slimer"] = "", -- 
 --      ["Slippery"] = "", -- A_Classic_Fairytale:journey
 --      ["%s lost all the weapons"] = "", -- Construction_Mode
+--      ["%s lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
 --      ["Slot %d: %s"] = "", -- Frenzy
 --      ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy
 --      ["Slowpoke"] = "", -- 
@@ -1967,6 +1938,7 @@
 --      ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smugglers"] = "", -- A_Space_Adventure:desert01
+--      ["%s must collect the final crates."] = "", -- A_Space_Adventure:fruit02
 --      ["%s must skip this turn for rule violation."] = "", -- WxW
 --      ["Sneaks"] = "", -- Bazooka_Battlefield
 --      ["%s never got the ninja diploma."] = "", -- ClimbHome
@@ -1975,10 +1947,8 @@
 --      ["Sniper"] = "", -- HedgeEditor, The_Specialists
 --      ["Sniper Rifle"] = "", -- Continental_supplies
 	["Sniper Training"] = "Treino com o Rifle Sniper",
-	["Sniperz"] = "Franco-Atiradores",
 --      ["So, as promised I have brought you where I think that the device you are looking for is hidden."] = "", -- A_Space_Adventure:fruit02
 --      ["So far, you had infinite ropes, but in the|real world, ropes are usually limited."] = "", -- Basic_Training_-_Rope
---      ["So Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["So, I believe that it's a good place to start."] = "", -- A_Space_Adventure:desert01
 --      ["So, I kindly ask for your help."] = "", -- A_Space_Adventure:fruit01
@@ -1988,11 +1958,12 @@
 --      ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03
 --      ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen
 --      ["Some weapons can be dropped from the rope."] = "", -- Basic_Training_-_Rope
---      ["Somewhere else on the planet of fruits, Captain Lime helps Hog Solo"] = "", -- A_Space_Adventure:fruit02
---      ["Somewhere else on the planet of fruits Hog Solo gets closer to the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, Captain Lime helps %s"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, %s gets closer to the device"] = "", -- A_Space_Adventure:fruit02
 --      ["Somewhere on the Planet of Fruits a terrible war is about to begin ..."] = "", -- A_Space_Adventure:fruit01
 --      ["Somewhere on the uninhabitable Death Planet ..."] = "", -- A_Space_Adventure:death01
 --      ["So, now I got the last part and I have your friends captured."] = "", -- A_Space_Adventure:death01
+--      ["So, %s, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So the princess was never heard of again ..."] = "", -- A_Classic_Fairytale:family
 --      ["So, uhmm, how did you manage to teleport them so far?"] = "", -- A_Classic_Fairytale:epil
 --      ["Sour"] = "", -- 
@@ -2093,8 +2064,6 @@
 --      ["Structure Placement Mode"] = "", -- Construction_Mode
 --      ["Structure Placer"] = "", -- Construction_Mode
 --      ["Stupid, stupid Hogerians!"] = "", -- A_Space_Adventure:final
---      ["Subject 1"] = "", -- portal
---      ["Subjects"] = "", -- portal
 --      ["Subtract %d"] = "", -- HedgeEditor
 --      ["--- Sudden Death ---"] = "", -- Battalion
 --      ["Summer Squash"] = "", -- A_Space_Adventure:fruit01
@@ -2111,7 +2080,7 @@
 --      ["Surfer! +15 points!"] = "", -- Space_Invasion
 --      ["Surfer!"] = "", -- WxW
 --      ["Surprise supplies: Get 1-3 random weapons each turn."] = "", -- Continental_supplies
---      ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:shadow
+--      ["Survive!"] = "", -- A_Classic_Fairytale:shadow
 --      ["%s violated the “All But Last” rule and will be penalized."] = "", -- WxW
 --      ["%s violated the “Kill The Leader” rule and will be penalized."] = "", -- WxW
 --      ["Swap place with a random enemy in the circle."] = "", -- Continental_supplies
@@ -2130,6 +2099,7 @@
 --      ["%s! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
 --      ["Swing, Leaks A Lot, on the wings of the wind!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Swing: [Left]/[Right]"] = "", -- Basic_Training_-_Rope
+--      ["%s wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome
 --      ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer
 --      ["switch"] = "", -- Continental_supplies
@@ -2143,6 +2113,7 @@
 --      ["Switch Hog"] = "", -- Construction_Mode
 --      ["Switch: Select weapon special"] = "", -- Continental_supplies
 --      ["Switch: Toggle crate radar"] = "", -- WxW
+--      ["%s won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Swords"] = "", -- Bazooka_Battlefield
 --      ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon
 --      ["%s, you may choose the rules."] = "", -- WxW
@@ -2151,6 +2122,8 @@
 --      ["Tails"] = "", -- 
 --      ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Tall Potato"] = "", -- A_Space_Adventure:fruit01
+--      ["Tap [Pause] to see the mission texts"] = "", -- Basic_Training_-_Movement
+--      ["Tap the “rotating arrow” button on the left|until you have selected Cappy, the hedgehog with the cap!"] = "", -- Basic_Training_-_Movement
 --      ["Target"] = "", -- HedgeEditor
 --      ["Target Placement Mode"] = "", -- Construction_Mode
 --      ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor
@@ -2166,15 +2139,18 @@
 --      ["Tatters"] = "", -- 
 	["Team %d: "] = "Equipe %d: ",
 --      ["Team %d"] = "", -- SimpleMission
+--      ["Team highscore: %d"] = "", -- Utils
 --      ["Team Identity Mode"] = "", -- HedgeEditor
 --      ["TEAM IDENTITY MODE"] = "", -- HedgeEditor
---      ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
+--      ["Team lowscore: %d"] = "", -- Utils
 --      ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion
+--      ["Team's best time: %.3fs"] = "", -- Utils
 --      ["Team Scores:"] = "", -- Control
 --      ["Team scores:"] = "", -- Space_Invasion
+--      ["Team's longest time: %.3fs"] = "", -- Utils
+--      ["Team's top accuracy: %d%"] = "", -- Utils
 --      ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2
 --      ["Teamwork"] = "", -- User_Mission_-_Teamwork
---      ["Team Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
 --      ["TechRacer"] = "", -- TechRacer
 --      ["Teleporation Node"] = "", -- Construction_Mode
 --      ["Teleportation Mode"] = "", -- Construction_Mode
@@ -2266,11 +2242,12 @@
 --      ["The forgotten continent"] = "", -- Continental_supplies
 --      ["The giant umbrella from the last crate should help break the fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Great Escape"] = "", -- User_Mission_-_The_Great_Escape
---      ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01
+--      ["- The green target must survive"] = "", -- HedgeEditor
+--      ["- The green targets must survive"] = "", -- HedgeEditor
 --      ["The guardian"] = "", -- A_Classic_Fairytale:shadow
 --      ["The hardships of the war turned %s (%s) into a killing machine: %d invaders destroyed in one round!"] = "", -- Space_Invasion
+--      ["The health of your current hedgehog|is shown at the top right corner."] = "", -- Basic_Training_-_Movement
 --      ["The hedgehog with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant
---      ["The Hogies"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["The Hospital"] = "", -- 
 --      ["The Individualist"] = "", -- A_Classic_Fairytale:shadow
 --      ["Their buildings were very primitive back then, even for an uncivilised island."] = "", -- A_Classic_Fairytale:united
@@ -2288,7 +2265,6 @@
 --      ["The Mutant has super-weapons and a lot of health."] = "", -- Mutant
 --      ["The Mutant loses health quickly, but gains health by killing."] = "", -- Mutant
 --      ["The Mutant loses health quickly if he doesn't keep scoring kills."] = "", -- Mutant
---      ["The Nameless One"] = "",
 --      ["The Navy greets %s for managing to get in a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["The next 4 times you play the \"The last encounter\" mission you'll get 20 more hit points and a laser sight."] = "", -- A_Space_Adventure:death02
 --      ["The next crate is an utility crate."] = "", -- Basic_Training_-_Movement
@@ -2302,6 +2278,7 @@
 --      ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil
 --      ["The oppression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
 --      ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
+--      ["The other hog has died, he should have survived!"] = "", -- A_Space_Adventure:moon02
 --      ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Police"] = "", -- 
 --      ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -2326,7 +2303,7 @@
 --      ["The Showdown"] = "", -- A_Classic_Fairytale:shadow
 --      ["The Slaughter"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:first_blood
 --      ["The Society of Perfectionists greets %s (%s): No misses and %d hits in its best round."] = "", -- Space_Invasion
---      ["THE SPECIALISTS"] = "",
+--      ["The Specialists: Each hedgehog starts with its own weapon set"] = "", -- The_Specialists
 --      ["The spinning arrows above your hedgehog show|which hedgehog is selected right now."] = "", -- Basic_Training_-_Movement
 --      ["The spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
@@ -2374,7 +2351,6 @@
 --      ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["This also increases the effectiveness of Medicine."] = "", -- Continental_supplies
 --      ["This game wasn’t really exciting."] = "", -- Space_Invasion
---      ["This Hog Solo is so naive! When he returns I'll shoot him and keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This is a new personal best, congratulations!"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert02, A_Space_Adventure:fruit03
 --      ["This is a new personal best time, congratulations!"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["This is Cappy."] = "", -- Basic_Training_-_Movement
@@ -2392,6 +2368,7 @@
 --      ["This rain is really something..."] = "",
 --      ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome
 --      ["This seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01
+--      ["This %s is so naive! I'm going to shoot this fool so I can keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This was an awesome performance! But this challenge can be finished with even just one RC plane. Can you figure out how?"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["This will be fun!"] = "", -- A_Classic_Fairytale:enemy
 --      ["This will be useful when I need a new platform or if I want to rise."] = "", -- portal
@@ -2432,11 +2409,11 @@
 --      ["To begin with the training, hit the attack key!"] = "", -- Basic_Training_-_Movement
 --      ["To begin with the training, select the bazooka from the ammo menu!"] = "", -- Basic_Training_-_Bazooka
 --      ["To begin with the training, select the grenade from the ammo menu!"] = "", -- Basic_Training_-_Grenade
+--      ["To begin with the training, tap the attack button!"] = "", -- Basic_Training_-_Movement
 --      ["To finish hedgehog selection, just do anything|with him, like walking."] = "", -- Basic_Training_-_Movement
 --      ["To get over the next obstacles, keep some distance from the wall before you back jump."] = "", -- Basic_Training_-_Movement
 --      ["To get over the water, you have to do multiple|rope shots and swings."] = "", -- Basic_Training_-_Rope
 --      ["Toggle Editing Weapons and Tools: [Precise]+[2]"] = "", -- HedgeEditor
---      ["Toggle Gear Information: [Precise]+[3]"] = "", -- HedgeEditor
 --      ["Toggle Help: [Precise]+[1]"] = "", -- HedgeEditor
 --      ["Toggle Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Toggle Shield: [Long jump]"] = "", -- Space_Invasion
@@ -2446,14 +2423,14 @@
 --      ["Too bad! Then you should really leave!"] = "", -- A_Space_Adventure:fruit01
 --      ["Too slow! Try again ..."] = "", -- A_Space_Adventure:moon02
 --      ["Top-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"] = "", -- A_Classic_Fairytale:shadow
 --      ["To reach higher ground, walk to a ledge, look to the left, then do a back jump."] = "", -- Basic_Training_-_Movement
 --      ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey
 --      ["To the caves..."] = "", -- A_Classic_Fairytale:united
 --      ["Touch all waypoints as fast as you can!"] = "", -- Racer
---      ["To win the game, Hog Solo has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
+--      ["- Touch the sparkles near your base to teleport"] = "", -- CTF_Blizzard
+--      ["To win the game, %s has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
 --      ["To win the game you had to collect the 2 crates with no specific order."] = "", -- A_Space_Adventure:desert01
---      ["To win the game you have to eliminate all your enemies."] = "", -- A_Space_Adventure:death01
+--      ["To win the game you have to eliminate Professor Hogevil."] = "", -- A_Space_Adventure:death01
 --      ["To win the game you have to find the right crate."] = "", -- A_Space_Adventure:desert01
 --      ["To win the game you have to go next to Thanta."] = "", -- A_Space_Adventure:ice01
 --      ["To win the game you have to go to the surface."] = "", -- A_Space_Adventure:desert02
@@ -2461,13 +2438,10 @@
 --      ["To win the game you have to stand next to Thanta."] = "", -- A_Space_Adventure:ice01
 --      ["Toxic Team"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Track completed!"] = "", -- Racer, TechRacer
---      ["Trainee"] = "", -- TargetPractice
 --      ["Training"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Training complete!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Training Team"] = "", -- TargetPractice
 --      ["Traitors"] = "", -- A_Classic_Fairytale:epil
 --      ["Traitors don't get to shout around here!"] = "", -- A_Classic_Fairytale:epil
---      ["Trapped"] = "", -- Basic_Training_-_Movement
 --      ["Trapper"] = "", -- HedgeEditor
 --      ["Travel carefully as your fuel is limited"] = "", -- A_Space_Adventure:cosmos
 --      ["Travel to all the neighbor planets and collect all the pieces"] = "", -- A_Space_Adventure:cosmos
@@ -2484,7 +2458,6 @@
 --      ["Try to land softly, as you can still take fall damage!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Try to protect the chief! You won't lose if he dies, but it is advised that he survives."] = "", -- A_Classic_Fairytale:united
 --      ["Try to reach and destroy the next target quickly."] = "", -- Basic_Training_-_Rope
---      ["T_T"] = "",
 --      ["Tumbler"] = "", -- Tumbler
 --      ["Turn around: [Left Shift] + [Left]/[Right]"] = "", -- Basic_Training_-_Movement
 --      ["Turning Around"] = "", -- Basic_Training_-_Movement
@@ -2503,7 +2476,6 @@
 --      ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy
 --      ["Ukemi"] = "", -- 
 --      ["Ultra kill!"] = "", -- Mutant
---      ["Ultrasoldier"] = "", -- Big_Armory
 --      ["unC0Rr"] = "", -- 
 --      ["Under Construction"] = "", -- A_Classic_Fairytale:shadow
 --      ["Under normal circumstances we could easily defeat them but we have kindly sent most of our men to the Kingdom of Sand to help with the annual dusting of the king's palace."] = "", -- A_Space_Adventure:fruit01
@@ -2527,7 +2499,6 @@
 --      ["Unit 883"] = "", -- 
 --      ["United We Stand"] = "", -- A_Classic_Fairytale:united
 --      ["Unlike bazookas, grenades are not influenced by wind."] = "", -- Basic_Training_-_Grenade
---      ["Unlimited Attacks"] = "",
 --      ["Unlimited Attacks: Attacks don't end your turn"] = "", -- User_Mission_-_Diver, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree
 --      ["Unlucky Sods"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Unstoppable!"] = "",
@@ -2543,13 +2514,14 @@
 --      ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["User Challenge"] = "",
 --      ["!"] = "", -- User_Mission_-_Dangerous_Ducklings
+--      ["User Mission"] = "", -- HedgeEditor
 --      ["Use the attack key twice to change the flying saucer while being in air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the attack key twice to change the flying saucer while floating in mid-air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the bazooka and the flying saucer to get the freezer."] = "", -- A_Space_Adventure:ice01
 --      ["Use the flying saucer from the crate to fly to the moon."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly the other planets."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly to the other planets."] = "", -- A_Space_Adventure:cosmos
---      ["Use the parachute ([Space] while in air) to get the next crate"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Use the parachute to get the next crate."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Use the portal gun to get to the next crate, then use the new gun to get to the final destination!|"] = "", -- A_Classic_Fairytale:dragon
 --      ["Use the RC plane and destroy the all the targets."] = "", -- A_Space_Adventure:desert03
 --      ["Use the rope in order to catch the blue hedgehog"] = "", -- A_Space_Adventure:moon02
@@ -2583,7 +2555,6 @@
 --      ["Victory Condition: Collect"] = "", -- HedgeEditor
 --      ["Victory Condition: Destroy"] = "", -- HedgeEditor
 --      ["Victory for %s!"] = "", -- Capture_the_Flag
---      ["Victory for the "] = "", -- CTF_Blizzard, Capture_the_Flag
 --      ["Violence is not the answer to your problems!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos
 --      ["Vladimir"] = "", -- 
@@ -2602,9 +2573,6 @@
 --      ["Walls left: %d"] = "", -- WxW
 --      ["Wall to wall"] = "", -- WxW
 --      ["Waluigi"] = "", -- 
---      ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Wannabe Ropers"] = "", -- Basic_Training_-_Rope
---      ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Wario"] = "", -- 
 --      ["Warming Up"] = "", -- Basic_Training_-_Grenade
 --      ["Warning: Fire cake detected"] = "", -- ClimbHome
@@ -2633,7 +2601,6 @@
 --      ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion
 --      ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion
 --      ["Weapon specials: Some weapons have special modes (see weapon description)."] = "", -- Continental_supplies
---      ["Weapons Reset"] = "",
 --      ["Weapons reset: The weapons are reset after each turn."] = "", -- WxW
 --      ["We are indeed."] = "", -- A_Classic_Fairytale:backstab
 --      ["We can't defeat them!"] = "", -- A_Classic_Fairytale:shadow
@@ -2650,9 +2617,9 @@
 --      ["We have to hurry! Are you armed?"] = "", -- A_Space_Adventure:moon01
 --      ["We have to protect the village!"] = "", -- A_Classic_Fairytale:united
 --      ["We have to unite and defeat those cylergs!"] = "", -- A_Classic_Fairytale:enemy
---      ["Welcome Hog Solo, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome home! Please take a seat"] = "", -- ClimbHome
 --      ["Welcome, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey
+--      ["Welcome, %s, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome to the Death Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
@@ -2819,16 +2786,16 @@
 --      ["You can’t open a portal on the blue surface."] = "", -- portal
 --      ["You can use the other 2 hogs to assist you."] = "", -- A_Space_Adventure:fruit02
 --      ["You can use the rope to reach new places."] = "", -- Basic_Training_-_Rope
---      ["You choose well, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You choose well, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You completed the mission in %.3f seconds."] = "", -- A_Space_Adventure:ice02
 --      ["You completed the mission in %d rounds."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03
---      ["You couldn't have come to a worse time, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You couldn't have come to a worse time, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You couldn't possibly believe that after refusing my offer I'd just let you go!"] = "", -- A_Classic_Fairytale:journey
 --      ["You'd almost swear the water was rising!"] = "",
 --      ["You'd better watch your steps..."] = "", -- A_Classic_Fairytale:journey
 --      ["You defended yourself against Captain Lime."] = "", -- A_Space_Adventure:fruit02
---      ["You defended yourself against the Fruit Assassins."] = "", -- A_Space_Adventure:fruit02
---      ["You did great, Hog Solo! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
+--      ["You defended yourself against %s."] = "", -- A_Space_Adventure:fruit02
+--      ["You did great, %s! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
 --      ["You did not make it in time, try again!"] = "", -- Basic_Training_-_Rope
 --      ["You don't deserve my sacrifice!"] = "", -- A_Classic_Fairytale:queen
 --      ["You drove Professor Hogevil away."] = "", -- A_Space_Adventure:moon01
@@ -2844,12 +2811,12 @@
 --      ["You got me!"] = "", -- A_Space_Adventure:moon02
 --      ["You had %.1fs remaining on the clock (+%d points)."] = "", -- TargetPractice
 --      ["You had %.2fs remaining on the clock (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle
---      ["You had %d additional flying saucers left."] = "", -- A_Space_Adventure:ice02
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: you might want to use some mines..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: You might want to use some mines ..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01
 --      ["You have activated Switch Hedgehog!"] = "", -- Basic_Training_-_Movement
 --      ["You have beaten the challenge!"] = "", -- ClimbHome
+--      ["You have beaten the team record, congratulations!"] = "", -- Utils
 --      ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab
 --      ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united
 --      ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01
@@ -2868,7 +2835,6 @@
 --      ["You have eliminated all visible enemy hedgehogs!"] = "", -- A_Space_Adventure:fruit01
 --      ["You have eliminated Professor Hogevil."] = "", -- A_Space_Adventure:moon01
 --      ["You have eliminated the evil minions."] = "", -- A_Space_Adventure:moon01
---      ["You have eliminated the whole evil team. You're pretty tough!"] = "", -- A_Space_Adventure:moon01
 --      ["You have escaped successfully."] = "", -- A_Space_Adventure:desert02
 --      ["You have failed to complete your task, young one!"] = "", -- A_Classic_Fairytale:journey
 --      ["You have failed to save the tribe!"] = "", -- A_Classic_Fairytale:backstab
@@ -2922,6 +2888,7 @@
 --      ["You have to travel again"] = "", -- A_Space_Adventure:cosmos
 --      ["You have to try again!"] = "", -- A_Space_Adventure:cosmos
 --      ["You have triggered the secret Do-Not-Rope-to-the-Moon Defense System."] = "", -- A_Space_Adventure:cosmos
+--      ["You have unlocked the target radar!"] = "", -- TargetPractice
 --      ["You have used %d flying saucers."] = "", -- A_Space_Adventure:ice02
 --      ["You have used %d RC planes."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["You have used only 1 RC plane. Outstanding!"] = "", -- User_Mission_-_RCPlane_Challenge
@@ -2940,10 +2907,9 @@
 --      ["You'll have only 2 watermelon bombs during the game."] = "", -- A_Space_Adventure:fruit03
 --      ["You'll have only one RC plane at the start of the mission."] = "", -- A_Space_Adventure:desert03
 --      ["You'll have to eliminate Captain Lime at the end."] = "", -- A_Space_Adventure:fruit02
---      ["You'll have to eliminate the Fruit Assassins at the end."] = "", -- A_Space_Adventure:fruit02
+--      ["You'll have to eliminate %s at the end."] = "", -- A_Space_Adventure:fruit02
 --      ["You'll lose if you die or if your time is up."] = "", -- A_Space_Adventure:moon02
 --      ["You'll see what I mean!"] = "", -- A_Classic_Fairytale:enemy
---      ["You lose!"] = "", -- Basic_Training_-_Sniper_Rifle, Big_Armory, Basic_Training_-_Bazooka, TargetPractice, ClimbHome
 --      ["You lost your target, try again!"] = "", -- TargetPractice
 --      ["You may find it handy."] = "", -- A_Space_Adventure:cosmos
 --      ["You may only attack from a rope!"] = "", -- WxW
@@ -2965,8 +2931,7 @@
 --      ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice
 --      ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice
 --      ["Your ammo is limited this time."] = "", -- Basic_Training_-_Bazooka
---      ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy
---      ["Your deaths will be avenged, Natives!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Your deaths will be avenged, %s!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Your death will not be in vain, Dense Cloud!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You're a coward!"] = "", -- A_Classic_Fairytale:queen
 --      ["You're...alive!? But we saw you die!"] = "", -- A_Classic_Fairytale:backstab
@@ -2994,21 +2959,21 @@
 --      ["Your next task is to collect some crates by using the rope!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Your personal best time so far: %.3f seconds"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["Your rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["You saved %d of 8 Hapless Hogs."] = "", -- User_Mission_-_That_Sinking_Feeling
+--      ["Your rope is gone! Try again!"] = "", -- Basic_Training_-_Rope
+--      ["You saved %d of 8 hegehogs."] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen
 --      ["You see the wind strength at the bottom right corner."] = "", -- Basic_Training_-_Bazooka
+--      ["You see the wind strength at the top."] = "", -- Basic_Training_-_Bazooka
 --      ["You should have known that we don't rely on meatbags!"] = "", -- A_Classic_Fairytale:queen
 --      ["You should know this more than anyone, Leaks!"] = "", -- A_Classic_Fairytale:queen
 --      ["You speak great truth, Hannibal. Here, take a sip!"] = "", -- A_Classic_Fairytale:epil
 --      ["You've been assaulting us, we have been just defending ourselves!"] = "", -- A_Classic_Fairytale:enemy
---      ["You've failed. Try again."] = "",
 	["You've reached the goal!| |Time: "] = "Você alcançou o objetivo!| |Tempo: ",
 --      ["You will be avenged!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You will fail if you run out of ammo and there are still targets available."] = "", -- A_Space_Adventure:desert03
 --      ["You will gain some extra ammo from the crates the next time you play the \"Getting to the device\" mission."] = "", -- A_Space_Adventure:fruit03
 --      ["You will play every 3 turns."] = "", -- A_Space_Adventure:fruit01
 --      ["- You will recieve 2-4 weapons on each kill! (Even on own hogs)"] = "", -- Continental_supplies
---      ["You win!"] = "", -- Big_Armory
 --      ["You won't believe what happened to me!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Yuck! I bet they'll keep worshipping her even after I save the village!"] = "", -- A_Classic_Fairytale:family
 --      ["Yumme Gunpowder"] = "", -- 
@@ -3016,6 +2981,7 @@
 --      ["Zombie"] = "", -- 
 --      ["Zombi"] = "", -- portal
 	["'Zooka Team"] = "Bazuqueiros",
---      ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
+--      ["Zoom: [Pinch] with 2 fingers"] = "", -- Basic_Training_-_Movement
+--      ["Zoom: [Rotate mouse wheel]"] = "", -- Basic_Training_-_Movement
 --      ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen
 }
--- a/share/hedgewars/Data/Locale/pt_PT.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/pt_PT.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -26,7 +26,6 @@
 --      ["Above-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Accuracy Bonus! +15 points"] = "", -- Space_Invasion
 --      ["Accuracy bonus: +%d points"] = "", -- Basic_Training_-_Sniper_Rifle
-	["Ace"] = "Ás", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge
 --      ["Achievement gotten: %s"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_That_Sinking_Feeling, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, Basic_Training_-_Rope, Tumbler
 	["A Classic Fairytale"] = "Um Clássico Conto de Fadas", -- A_Classic_Fairytale:first_blood
 --      ["A crate critical to this mission has been destroyed."] = "", -- SimpleMission
@@ -46,7 +45,6 @@
 	["Again with the 'cannibals' thing!"] = "Outra vez com a cena dos 'canibais'!", -- A_Classic_Fairytale:enemy
 --      ["A Hedgewars minigame"] = "", -- Capture_the_Flag
 --      ["A Hedgewars mini-game"] = "", -- Racer, Space_Invasion, TechRacer, Tumbler
-	["a Hedgewars mini-game"] = "um mini-jogo Hedgewars", -- Space_Invasion, The_Specialists
 --      ["A Hedgewars tag game"] = "", -- Mutant
 --      ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome
 --      ["Aim at the ceiling and hold [Attack] pressed until the rope attaches."] = "", -- Basic_Training_-_Rope
@@ -141,13 +139,14 @@
 --      ["As you've seen, the dropped grenade roughly fell into your flying direction."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Athlete"] = "", -- Battalion
 --      ["Attack: Activate"] = "", -- Racer
---      ["Attack Captain Lime before he attacks back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack Captain Lime before he attacks back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack From Rope: %s"] = "", -- WxW
 --      ["Attack From Rope: You may only attack from a rope."] = "", -- WxW
 --      ["Attack rule: %s"] = "", -- WxW
 --      ["Attack: Select this continent"] = "", -- Continental_supplies
 --      ["Attack: [Space]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
---      ["Attack the assassins before they attack back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack: Tap the [Bomb]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
+--      ["Attack the assassins before they attack back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack: Throw ball"] = "", -- Knockball
 --      ["At the end of the game your health was %d."] = "", -- A_Space_Adventure:ice01
 --      ["At the start of the game each enemy hog has only the weapon that he is named after."] = "", -- A_Space_Adventure:death02
@@ -155,16 +154,18 @@
 --      ["Available weapon specials:"] = "", -- Continental_supplies
 --      ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion
---      ["Avoid the mines!"] = "", -- Basic_Training_-_Rope
 --      ["Axes"] = "", -- Bazooka_Battlefield
 --      ["Aye! Fellow! Let me exit this chamber of doom!"] = "", -- A_Classic_Fairytale:epil
 --      ["Back Breaker"] = "Parte Costas", -- A_Classic_Fairytale:backstab
 --      ["Back in the village, after telling the villagers about the threat..."] = "De volta à\Mais tarde na aldeia, depois de ter avisado os aldeões sobre a ameaça...", -- A_Classic_Fairytale:united
 --      ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil
 --      ["Back Jump: [Backspace] ×2"] = "", -- Basic_Training_-_Movement
+--      ["Back Jump: Double-tap the [Curvy Arrow]"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (1/2)"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (2/2)"] = "", -- Basic_Training_-_Movement
 --      ["Backstab"] = "", -- A_Classic_Fairytale:backstab
+--      ["Backwards jump: Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Backwards jump: Tap the [Curvy Arrow] twice"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Bacon"] = "", -- 
 --      ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Badmad"] = "", -- portal
@@ -197,7 +198,6 @@
 --      ["Bazooka Battlefield"] = "", -- Bazooka_Battlefield
 --      ["Bazooka Master"] = "", -- Basic_Training_-_Bazooka
 --      ["Bazookas are influenced by wind."] = "", -- Basic_Training_-_Bazooka
---      ["Bazooka Team"] = "", -- Basic_Training_-_Bazooka
 	["Bazooka Training"] = "Treino com Bazuca",
 --      ["Bearded Beast"] = "", -- 
 --      ["Be careful, the future of Hogera is in your hands!"] = "", -- A_Space_Adventure:cosmos
@@ -231,7 +231,6 @@
 --      ["Bloodpie"] = "", -- A_Classic_Fairytale:backstab
 --      ["Bloodrocutor"] = "", -- A_Classic_Fairytale:shadow
 --      ["Bloodsucker"] = "", -- A_Classic_Fairytale:shadow
---      ["Bloody Rookies"] = "", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 --      ["Blue"] = "", -- 
 --      ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Bob"] = "", -- A_Space_Adventure:cosmos
@@ -314,7 +313,9 @@
 --      ["Challenge objectives"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit03, A_Space_Adventure:moon02
 --      ["Challenge over!"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa, ClimbHome
+--      ["Change bounciness: Tap [B]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Content: [Left], [Right]"] = "", -- HedgeEditor
+--      ["Change detonation timer: Tap the [Clock]"] = "", -- Basic_Training_-_Grenade, A_Classic_Fairytale:shadow
 --      ["Change direction: [Left]/[Right]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Change Health: [Left], [Right]"] = "", -- HedgeEditor
@@ -334,6 +335,8 @@
 --      ["Chicken"] = "", -- 
 --      ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01
 --      ["Chikorita"] = "", -- 
+--      ["Choose location: Left click"] = "", -- A_Classic_Fairytale:shadow
+--      ["Choose location: Tap the [Target] button, then tap on the spot you want to choose"] = "", -- A_Classic_Fairytale:shadow
 --      ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Choose your continent wisely, as your decision will be permanent."] = "", -- Continental_supplies
 	["Choose your side! If you want to join the strange man, walk up to him.|Otherwise, walk away from him. If you decide to att...nevermind..."] = "Escolhe o teu lado! Se quiseres juntar-te ao homem estranho, aproxima-te dele! Caso contrario, afastate dele. Se decidires atac...esquece...", -- A_Classic_Fairytale:shadow
@@ -342,7 +345,6 @@
 --      ["Cleaver"] = "", -- Construction_Mode
 --      ["Cleaver Placement Mode"] = "", -- Construction_Mode
 --      ["CLEAVER PLACEMENT MODE"] = "", -- HedgeEditor
---      ["Climber"] = "", -- ClimbHome
 --      ["Climb Home"] = "", -- ClimbHome
 --      ["Closing in"] = "", -- A_Classic_Fairytale:queen
 --      ["Clown"] = "", -- HedgeEditor
@@ -352,11 +354,13 @@
 	["Cluster Bomb Training"] = "Treino com Bomba de Fragmentos!", -- Basic_Training_-_Cluster_Bomb
 	["Collateral Damage"] = "Dano Colateral", -- A_Classic_Fairytale:journey
 	["Collateral Damage II"] = "Dano Colateral II", -- A_Classic_Fairytale:journey
+--      ["- Collect all the blue crates"] = "", -- HedgeEditor
 --      ["Collect all the crates, but remember, our time in this life is limited!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect or destroy all the health crates."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Collect or destroy the final crate to finish the training."] = "", -- Basic_Training_-_Flying_Saucer
+--      ["- Collect the blue crate"] = "", -- HedgeEditor
 --      ["Collect the crate and attack!"] = "", -- WxW
---      ["Collect the crate on the right.|Hint: Select the rope, [Up] or [Down] to aim, [Space] to fire, directional keys to move.|Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Collect the crate on the right."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the crates within the time limit!|If you fail, you'll have to try again."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the first crate to begin!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Collect the freezer and get the device part from Thanta."] = "", -- A_Space_Adventure:ice01
@@ -424,7 +428,6 @@
 --      ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates per turn: %d"] = "", -- WxW
---      ["crate(s)"] = "", -- SpeedShoppa
 --      ["Crazy Gravity: Gravity randomly changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity
 --      ["Crazy Runner"] = "", -- A_Space_Adventure:moon02
 --      ["Cricket Time"] = "", -- Continental_supplies
@@ -457,11 +460,10 @@
 --      ["Deals 15 damage to all enemies in the circle."] = "", -- Continental_supplies
 --      ["Deer"] = "", -- 
 --      ["Defeat all enemies!"] = "", -- portal
+--      ["Defeat!"] = "", -- HedgeEditor
 --      ["Defeat Professor Hogevil!"] = "", -- A_Space_Adventure:death01
---      ["Defeat the cannibals"] = "", -- A_Classic_Fairytale:backstab
---      ["Defeat the cannibals!|"] = "", -- A_Classic_Fairytale:united
+--      ["Defeat the cannibals!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cannibals!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Defeat the cannibals!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cyborgs!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen
 --      ["Delete Waypoint"] = "", -- HedgeEditor
@@ -482,11 +484,11 @@
 --      ["Destroyer of planes"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Destroy him, Leaks A Lot! He is responsible for the deaths of many of us!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion
+--      ["- Destroy the enemy"] = "", -- HedgeEditor
+--      ["- Destroy the red target"] = "", -- HedgeEditor
+--      ["- Destroy the red targets"] = "", -- HedgeEditor
 --      ["Destroy the targets!"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
---      ["Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
---      ["Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"] = "", -- A_Classic_Fairytale:first_blood
 --      ["+%d flamer fuel!"] = "", -- Tumbler
---      ["%d Hapless Hogs left"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["+%d health"] = "", -- Mutant
 --      ["%d-Hit Combo! +%d points!"] = "", -- Space_Invasion
 	["Did anyone follow you?"] = "Foste seguido por alguém?", -- A_Classic_Fairytale:united
@@ -507,7 +509,6 @@
 --      ["Disguise as a Rockhopper Penguin"] = "", -- Continental_supplies
 --      ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies
 --      ["Displacer"] = "", -- 
---      ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Diver"] = "", -- User_Mission_-_Diver
 --      ["%d ms"] = "", -- HedgeEditor
 --      ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen
@@ -594,10 +595,8 @@
 --      ["Elderbot"] = "", -- A_Classic_Fairytale:family
 --      ["Elimate your captor."] = "Elimina o teu raptor.", -- User_Mission_-_The_Great_Escape
 	["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Destrói todos os alvos antes do tempo terminar.|Tens munições infinitas para esta missão.", --Bazooka, Shotgun, SniperRifle
---      ["Eliminate the Blue Team before the time runs out."] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Eliminate the enemy before the time runs out."] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 --      ["Eliminate the enemy hogs to win."] = "Elimina os ouriços inimigos para ganhar.",
---      ["Eliminate the enemy specialists."] = "Elimina os especialistas inimigos.",
 --      ["Eliminate the enemy."] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh
 --      ["Eliminate Unit 3378."] = "", -- User_Mission_-_Teamwork
 --      ["Eliminate WatchBot 4000."] = "", -- User_Mission_-_Teamwork_2
@@ -622,13 +621,14 @@
 --      ["Exactly, man! That was my dream."] = "Exactamente, homem! Esse era o meu sonho.", -- A_Classic_Fairytale:backstab
 --      ["Except me, of course! I just saved a whole planet!"] = "", -- A_Space_Adventure:final
 --      ["Experienced beginner"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Explore the tunnel with the other hedgehogs and search for the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Explore the tunnel with the other hedgehogs and search for the device."] = "", -- A_Space_Adventure:fruit02
 --      ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02
 --      ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey
 --      ["Fair Wind"] = "", -- 
 --      ["Fall Damage"] = "", -- Basic_Training_-_Movement
 --      ["Fallen Angel"] = "", -- Tentacle_Terror
 --      ["Family Reunion"] = "", -- A_Classic_Fairytale:family
+--      ["Fastest escape: %d turns"] = "", -- A_Space_Adventure:desert02
 --      ["Fastest lap: %.3fs by %s"] = "", -- TrophyRace
 	["Fastest lap: "] = "Volta mais rápida: ",
 --      ["Feeble Resistance"] = "",
@@ -648,11 +648,12 @@
 --      ["Final result"] = "", -- Mutant
 --      ["Final Targets"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
 --      ["Final team scores:"] = "", -- Space_Invasion
+--      ["Find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Find a way to detonate all the explosives and stay alive!"] = "", -- A_Space_Adventure:final
 	["Find your tribe!|Cross the lake!"] = "Encontra a tua tribo|Atravessa o lago!", -- A_Classic_Fairytale:dragon
 --      ["Finish this challenge as fast as possible to earn bonus points."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Finish waypoint placement"] = "", -- Racer
---      ["Finish your training|Hint: Animations can be skipped with the [Precise] key."] = "Acaba o teu treino|Ajuda: As animações podem ser saltadas com a tecla [Precisão].", -- A_Classic_Fairytale:first_blood
+--      ["Finish your training."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Finite Ropes"] = "", -- Basic_Training_-_Rope
 --      ["Fire a rocket with napalm."] = "", -- Continental_supplies
 --      ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler
@@ -680,6 +681,7 @@
 --      ["Flying Saucer Training"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Fly into space to fight off the invaders with barrels!"] = "", -- Space_Invasion
 --      ["Fly to the meteorite and detonate the explosives"] = "", -- A_Space_Adventure:cosmos
+--      ["Follow the path and destroy the next target."] = "", -- Basic_Training_-_Rope
 --      ["Forgetfulness: You will lose all your weapons each turn."] = "", -- Continental_supplies
 --      ["For the next crate, you have to do back jumps."] = "", -- Basic_Training_-_Movement
 --      ["Four Eyes"] = "", -- 
@@ -699,8 +701,6 @@
 --      ["“g=150”, where 150 is 150% of normal gravity."] = "", -- Gravity
 --      ["“g=50, g2=150, period=4000” for gravity changing|from 50 to 150 and back with period of 4000 ms."] = "", -- Gravity
 --      ["Galaxy Guardians"] = "", -- Big_Armory
-	["Game Modifiers: "] = "Modificadores de Jogo: ",
-	["GAME OVER!"] = "GAME OVER!",
 --      ["Game over!"] = "", -- Space_Invasion
 --      ["Game Started!"] = "",
 	["Game? Was this a game to you?!"] = "Jogo? Isto foi um jogo para ti?!", -- A_Classic_Fairytale:enemy
@@ -710,8 +710,6 @@
 --      ["Gasp! A smuggler!"] = "", -- A_Space_Adventure:desert01
 --      ["Gasp!"] = "", -- A_Space_Adventure:desert01
 --      ["Gathering fruits all day long."] = "", -- A_Classic_Fairytale:queen
---      ["Gear information hidden"] = "", -- HedgeEditor
---      ["Gear information shown"] = "", -- HedgeEditor
 --      ["Gear Placement Tool"] = "", -- HedgeEditor
 --      ["General information"] = "", -- Continental_supplies
 --      ["General information:"] = "", -- Continental_supplies
@@ -721,7 +719,7 @@
 --      ["Get Dense Cloud out of the pit!"] = "Tira o Nuvem Densa do precipicio(?)", -- A_Classic_Fairytale:journey
 --      ["Get him, Spike!"] = "", -- A_Space_Adventure:desert01
 	["Get on over there and take him out!"] = "Chega-te aqui e acaba com ele!",
---      ["Get on the head of the mole"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Get on the head of the mole."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Get past the flower."] = "", -- A_Classic_Fairytale:journey
 --      ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01
 --      ["Get that crate!"] = "Vai buscar aquela caixa!", -- A_Classic_Fairytale:first_blood
@@ -759,7 +757,6 @@
 	["GO! GO! GO!"] = "GO! GO! GO!",
 	["Good birdy......"] = "Lindo passarito......",
 --      ["Good bye!"] = "", -- Basic_Training_-_Flying_Saucer
-	["Good Dude"] = "Boa Bacano", -- User_Mission_-_The_Great_Escape
 	["Good idea, they'll never find us there!"] = "Boa ideia, eles nunca nos vão encontrar aqui!", -- A_Classic_Fairytale:united
 --      ["Good job!"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Good job! Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -770,7 +767,7 @@
 	["Good so far!"] = "Até agora tudo bem!",
 --      ["Good to go!"] = "Pronto para seguir!",
 --      ["Good! You now control Cappy."] = "", -- Basic_Training_-_Movement
-	["Go on top of the flower"] = "Vai para cima da flor", -- A_Classic_Fairytale:first_blood
+--      ["Go on top of the flower."] = "", -- A_Classic_Fairytale:first_blood
 	["Go, quick!"] = "Vai, rápido!", -- A_Classic_Fairytale:backstab
 --      ["Gorkij"] = "", -- A_Classic_Fairytale:journey
 --      ["Go surf!"] = "Vai 'surfar'!", -- WxW
@@ -793,7 +790,6 @@
 --      ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow
 --      ["Green"] = "", -- 
 --      ["Green Bananas"] = "", -- A_Space_Adventure:fruit01
---      ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Green double rings also give you a new flying saucer."] = "", -- A_Space_Adventure:ice02
 --      ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01
 --      ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01
@@ -803,11 +799,8 @@
 --      ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Greetings from the Navy, %s (%s), for being a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["Greetings, %s!"] = "", -- A_Classic_Fairytale:dragon
---      ["Greg"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
---      ["Grenade Group"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard
 --      ["Grenades explode after 1 to 5 seconds (you decide)."] = "", -- Basic_Training_-_Grenade
 --      ["Grenades with high bounciness bounce a lot and behave chaotic."] = "", -- Basic_Training_-_Grenade
---      ["Grenade Team"] = "", -- Basic_Training_-_Grenade
 --      ["Grenade Training"] = "Treino com Granadas", -- Basic_Training_-_Grenade
 --      ["Grenadiers"] = "", -- Basic_Training_-_Grenade
 --      ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor
@@ -848,7 +841,6 @@
 --      ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion
 --      ["Health Modification Mode"] = "", -- HedgeEditor
 --      ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor
---      ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
 --      ["Heavenly Defense"] = "", -- Tentacle_Terror
 --      ["Heavy"] = "",
 --      ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united
@@ -861,6 +853,7 @@
 --      ["Hedgehog Projectile"] = "", -- Continental_supplies
 --      ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies
 --      ["Hedgehogs can not be deleted."] = "", -- HedgeEditor
+--      ["Hedgehogs left: %d"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Hedgehogs will be revived after their death."] = "", -- Mutant
 --      ["Hedgehogs will start in the first waypoint."] = "", -- Racer
 --      ["Hedgibal Lecter"] = "Hedgibal Lecter", -- A_Classic_Fairytale:backstab
@@ -876,7 +869,6 @@
 --      ["Help Enabled"] = "", -- HedgeEditor
 --      ["Helpers: Each team starts with %d helper points"] = "", -- Battalion
 --      ["Helpers: Hogs will get 1 out of 2 helpers randomly each turn"] = "", -- Battalion
---      ["Help Hog Solo to find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 	["Help me, Leaks!"] = "Ajuda-me, Leaks!", -- A_Classic_Fairytale:journey
 	["Help me, please!!!"] = "Ajuda-me, por favor!!!", -- A_Classic_Fairytale:journey
 	["Help me, please!"] = "Ajuda-me, por favor!", -- A_Classic_Fairytale:journey
@@ -891,20 +883,20 @@
 --      ["Here you will find the current mission instructions."] = "", -- Basic_Training_-_Movement
 --      ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Heroic Wind"] = "", -- Continental_supplies
---      ["Hero Team"] = "Equipa Heroi", -- User_Mission_-_The_Great_Escape
 	["He's so brave..."] = "Ele é tão corajoso...", -- A_Classic_Fairytale:first_blood
 --      ["He was the lab assistant of Dr. Goodhogan, the inventor of the anti-gravity device."] = "", -- A_Space_Adventure:moon02
 --      ["He won't be selling us out anymore!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey, don't forget us! We still need to climb up!"] = "", -- A_Classic_Fairytale:family
 	["Hey, guys!"] = "Hey, pessoal!", -- A_Classic_Fairytale:backstab
 	["Hey guys!"] = "Hey pessoal!", -- A_Classic_Fairytale:united
---      ["Hey, Hog Solo! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey! I was supposed to collect it!"] = "", -- A_Space_Adventure:fruit02
+--      ["Hey, %s! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey, %s! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hey! This is cheating!"] = "Hey! Isto\Isso é batota!", -- A_Classic_Fairytale:journey
 --      ["Hidden"] = "", -- portal
 --      ["High Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["High Jump: [Backspace]"] = "", -- Basic_Training_-_Movement
+--      ["High Jump: Tap the [Curvy Arrow] shortly"] = "", -- Basic_Training_-_Movement
 --      ["--- Highland ---"] = "", -- Battalion
 --      ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander
 --      ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion
@@ -915,20 +907,24 @@
 --      ["Hill Guard"] = "", -- Bazooka_Battlefield
 --      ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01
 --      ["--- Hint ---"] = "", -- Battalion
---      ["Hint: Double Jump - Press [Backspace] twice"] = "Dica: Duplo Salto - Carrega [Retroceder] duas vezes", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
 --      ["Hint: Drilling holes should solve everything."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: Hold down [M] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: If this mission panel disappears, you can|see it again by hitting the Pause or Quit key."] = "", -- Basic_Training_-_Movement
 --      ["Hint: It might be a good idea to place a girder before starting to drill. Just saying."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: It might be easier if you vary the angle only slightly."] = "", -- Basic_Training_-_Bazooka
+--      ["Hint: Just select the parachute, it opens automatically when you fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion
 --      ["Hint: Launch the bazooka horizontally at full power."] = "", -- Basic_Training_-_Bazooka
---      ["Hint: Press [Esc] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Pause the game to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Select the blow torch, aim and press [Fire]. Press [Fire] again to stop."] = "", -- A_Classic_Fairytale:journey
 --      ["Hint: Select the low gravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey
+--      ["Hint: Select the rope, [Up] or [Down] to aim, [Attack] to fire, directional keys to move."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Select the Shoryuken and hit [Attack].|P.S.: You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: %s needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family
 --      ["Hint: The rope only bends around objects.|When it doesn't hit anything, it's always straight."] = "", -- Basic_Training_-_Rope
 --      ["Hint: To jump higher, wait a bit before you hit “High Jump” a second time."] = "", -- Basic_Training_-_Movement
+--      ["Hint: To place a girder, select it,|then use [Left] and [Right] to select angle and length,|then choose a location for the girder."] = "", -- A_Classic_Fairytale:shadow
 --      ["Hint: Use the quit key to see the team’s continent."] = "", -- Continental_supplies
 --      ["Hint: When you shorten the rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope
 --      ["Hint: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey
@@ -962,24 +958,11 @@
 --      ["Hogminator"] = "", -- A_Classic_Fairytale:family
 --      ["Hog nueve"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog octo"] = "", -- A_Space_Adventure:fruit03
---      ["Hogonauts"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Hog onze"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog Saturn"] = "", -- A_Space_Adventure:fruit03
 --      ["Hogs in sight!"] = "", -- Continental_supplies
 --      ["Hog Solo and GB"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hog Solo"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01, A_Space_Adventure:moon02
---      ["Hog Solo couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo escaped successfully!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo has to reach the last crates"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo has to refuel his saucer."] = "", -- A_Space_Adventure:moon01
---      ["Hog Solo lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
---      ["Hog Solo wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["- Hogs will be revived"] = "", -- Capture_the_Flag
 --      ["- Hogs will drop the flag when killed"] = "", -- Capture_the_Flag
 --      ["Hog two"] = "", -- A_Space_Adventure:fruit03
@@ -989,9 +972,7 @@
 --      ["Homing Bee"] = "", -- Construction_Mode
 --      ["Honda"] = "", -- 
 --      ["Honest Lee"] = "", -- A_Classic_Fairytale:enemy
---      ["Hook"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
 --      ["Hooks"] = "", -- 
-	["Hooray!"] = "Hurra!",
 --      ["Hooray! I actually did it! Hogera is safe!"] = "", -- A_Space_Adventure:final
 --      ["Hooray! I've found it, now I have to get back to Captain Lime!"] = "", -- A_Space_Adventure:fruit02
 --      ["Hooray! You are a champion!"] = "", -- A_Space_Adventure:ice02
@@ -1007,7 +988,7 @@
 --      ["However, if you fail to do so, she dies a most violent death, just like your friend! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, if you fail to do so, she dies a most violent death! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, my mates don't agree with me on letting you go..."] = "No entanto, os meus colegas não concordam com eu deixar-vos ir...", -- A_Classic_Fairytale:dragon
---      ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
+--      ["However, the army of %s is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
 --      ["How to Rope"] = "", -- Basic_Training_-_Rope
 --      ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen
 --      ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen
@@ -1027,7 +1008,6 @@
 	["I can't believe what I'm hearing!"] = "Não posso acreditar no que estou a ouvir!", -- A_Classic_Fairytale:backstab
 --      ["I can't let you go further because …"] = "", -- A_Classic_Fairytale:queen
 	["I can't wait any more, I have to save myself!"] = "Não tenho paciencia para esperar mais, tenho de me salvar a mim mesmo!", -- A_Classic_Fairytale:shadow
---      ["Ice"] = "", -- Basic_Training_-_Movement
 --      ["Ice Jake"] = "", -- A_Space_Adventure:ice01
 --      ["I could just teleport myself there..."] = "Podia simplesmente teletransportar-me para la...", -- A_Classic_Fairytale:family
 --      ["Icy Girder: [3]"] = "", -- HedgeEditor
@@ -1085,7 +1065,6 @@
 	["I just found out that they have captured your princess!"] = "Acabei de descobrir que eles capturaram a princesa!", -- A_Classic_Fairytale:family
 --      ["I just want the strange device you found!"] = "", -- A_Space_Adventure:ice01
 	["I just wonder where Ramon and Spiky disappeared..."] = "Só gostava de saber para onde o Ramom e o Spiky desapareceram...", -- A_Classic_Fairytale:journey
---      ["Ikeda"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["I know and I'm terribly sorry!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know, my hero!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know that your resources are low due to the battle but I'll send two of my best hogs to assist you."] = "", -- A_Space_Adventure:fruit02
@@ -1113,6 +1092,7 @@
 --      ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen
 	["I'm not sure about that!"] = "Não tenho a certeza quanto a isso!", -- A_Classic_Fairytale:united
 --      ["IMPORTANT: To see the mission panel again, hold the mission panel key."] = "", -- Basic_Training_-_Movement
+--      ["IMPORTANT: To see the mission panel again, pause the game."] = "", -- Basic_Training_-_Movement
 	["Impressive...you are still dry as the corpse of a hawk after a week in the desert..."] = "Impressionante...ainda estás seco tal e qual um cadáver de um falcão depois de uma semana no deserto...", -- A_Classic_Fairytale:first_blood
 --      ["%i ms"] = "", -- Gravity
 --      ["I'm so glad this is finally over!"] = "", -- A_Space_Adventure:final
@@ -1271,7 +1251,6 @@
 --      ["Kill the traitor, %s, or spare his life!"] = "", -- A_Classic_Fairytale:backstab
 --      ["--- King ---"] = "", -- Battalion
 --      ["King"] = "", -- Battalion
---      ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing
 --      ["--- King Mode ---"] = "", -- Battalion
 --      ["Knight"] = "", -- Battalion
 --      ["Knives"] = "", -- 
@@ -1290,7 +1269,7 @@
 --      ["Launch some bazookas to destroy the targets!"] = "", -- Basic_Training_-_Bazooka
 --      ["Leaderbot"] = "", -- A_Classic_Fairytale:queen
 --      ["Leader"] = "Lider", -- A_Classic_Fairytale:enemy
---      ["Lead the Green Bananas to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
+--      ["Lead your allies to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
 --      ["Leaks A Lot, depressed for killing his loved one, failed to save the village..."] = "O Leaks A Lot, deprimido por ter morto a sua amada, não conseguiu salvar a aldeia...", -- A_Classic_Fairytale:journey
 	["Leaks A Lot gave his life for his tribe! He should have survived!"] = "Leaks A Lot deu a sua vida pela tribo! Ele devia ter sobrevivido!", -- A_Classic_Fairytale:first_blood
 	["Leaks A Lot"] = "Leaks A Lot", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
@@ -1305,7 +1284,6 @@
 --      ["Left/right: Choose crate contents"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode
---      ["Left Tong"] = "", -- Bazooka_Battlefield
 --      ["Legs"] = "", -- 
 --      ["Less tools, more fun"] = "", -- Battalion
 --      ["Lestat"] = "", -- portal
@@ -1334,18 +1312,19 @@
 --      ["Lively Lifeguard"] = "",
 --      ["Lonely Cries"] = "", -- Continental_supplies
 --      ["Lonely Cries: [Rise the water if no hog is in the circle and deal 6 damage to all enemy hogs.]"] = "", -- Continental_supplies
---      ["Lonely Hog"] = "", -- ClimbHome
 --      ["Long Jump: [Enter]"] = "", -- Basic_Training_-_Movement
+--      ["Long Jump: Tap the [Curvy Arrow] button for long"] = "", -- Basic_Training_-_Movement, A_Classic_Fairytale:first_blood
 --      ["Long Live The Queen"] = "", -- A_Classic_Fairytale:queen
 --      ["Look around: [Mouse movement]"] = "", -- Basic_Training_-_Movement
+--      ["Look around: [Tap or swipe on the screen]"] = "", -- Basic_Training_-_Movement
 --      ["Look, boss! There is the target!"] = "", -- A_Space_Adventure:moon01
 	["Look, I had no choice!"] = "Olha, eu não tive escolha!", -- A_Classic_Fairytale:backstab
 --      ["Look out! There's more of them!"] = "Cuidado! Existem mais!", -- A_Classic_Fairytale:backstab
 --      ["Look out! We're surrounded by cannibals!"] = "Cuidado! Estamos rodeados de cabinais!", -- A_Classic_Fairytale:enemy
 --      ["Looks like the whole world is falling apart!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Look to the left and do a backwards jump towards the mushroom."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Loon"] = "", -- The_Specialists
 --      ["Loopy"] = "", -- 
---      ["Lord Evil"] = "", -- Tentacle_Terror
 --      ["Losing Condition: Destroy"] = "", -- HedgeEditor
 --      ["Low Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander
@@ -1365,7 +1344,6 @@
 --      ["Mario"] = "", -- 
 --      ["Mark gears for win/lose conditions"] = "", -- HedgeEditor
 --      ["Mark/unmark gear: [Left Click]"] = "", -- HedgeEditor
---      ["Mark"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
 --      ["- Massive weapon bonus on first turn"] = "", -- Continental_supplies
 --      ["Max Citrus"] = "", -- A_Space_Adventure:fruit01
 --      ["Maybe you should try an easier map next time."] = "", -- Racer
@@ -1380,7 +1358,6 @@
 --      ["Mega kill!"] = "", -- Mutant
 --      ["Meiwes"] = "", -- A_Classic_Fairytale:backstab
 --      ["mikade"] = "", -- 
---      ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer
 --      ["Mindy"] = "", -- A_Classic_Fairytale:united
 --      ["Mine Deployer"] = "",
 --      ["Mine Placement Mode"] = "", -- Construction_Mode
@@ -1399,12 +1376,12 @@
 --      ["Minion"] = "", -- A_Space_Adventure:moon01
 --      ["Minions"] = "", -- A_Space_Adventure:moon01
 --      ["Mission failed!"] = "", -- Big_Armory
-	["MISSION FAILED"] = "MISSÃO FALHADA", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Mission failure in %d s"] = "", -- Big_Armory
+--      ["Mission"] = "", -- HedgeEditor
 --      ["Mission lost!"] = "", -- Basic_Training_-_Grenade
 --      ["Mission Panel"] = "", -- Basic_Training_-_Movement
 --      ["Mission panel: [M]"] = "", -- Basic_Training_-_Movement
-	["MISSION SUCCESSFUL"] = "MISSÃO COMPLETA", -- User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+--      ["Mission succeeded!"] = "", -- portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, SimpleMission, HedgeEditor
 --      ["Mission won!"] = "", -- Basic_Training_-_Grenade
 --      ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02
 --      ["Mixed %d"] = "", -- WxW
@@ -1420,7 +1397,6 @@
 --      ["Monster kill!"] = "", -- Mutant
 --      ["Monsters"] = "", -- 
 --      ["Mooney"] = "", -- 
-	["More Natives"] = "Mais Nativos", -- A_Classic_Fairytale:epil
 --      ["Morris"] = "", -- 
 --      ["Most mines are not active."] = "", -- A_Space_Adventure:desert02
 --      ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01
@@ -1439,14 +1415,12 @@
 --      ["My flying saucer stopped working!"] = "", -- A_Space_Adventure:ice01
 --      ["Nade Boy"] = "", -- Basic_Training_-_Grenade
 --      ["Nah, probably everyone was just stupid."] = "", -- A_Space_Adventure:final
---      ["Nameless Heroes"] = "",
 	["Name"] = "Nome", -- A_Classic_Fairytale:queen
 --      ["Nancy Screw"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:queen
 --      ["Napalm"] = "", -- Construction_Mode
 --      ["Napalm Rocket"] = "", -- Continental_supplies
 --      ["Napalm rocket: [Fire a bomb with napalm!]"] = "", -- Continental_supplies
 --      ["Naranja Jed"] = "", -- A_Space_Adventure:fruit01
---      ["Natives"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Naughty Ninja"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Near a PAotH base on the moon ..."] = "", -- A_Space_Adventure:moon01
 --      ["Near Secret Base 17 of PAotH in the rural Hogland ..."] = "", -- A_Space_Adventure:cosmos
@@ -1541,11 +1515,8 @@
 --      ["Oh, my! I forgot something!"] = "", -- A_Classic_Fairytale:queen
 	["Oh, my! This is even more entertaining than I've expected!"] = "Uau! Isto é mais interessante do que eu esperava!", -- A_Classic_Fairytale:backstab
 	["Oh, my!"] = "Uau!", -- A_Classic_Fairytale:first_blood
-	["Oh no! Just try again!"] = "Oh não! Tenta novamente!", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Oh no, not %s!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
---      ["Oh no, the Green Bananas have betrayed Hog Solo and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
-	["Oh no! Time's up! Just try again."] = "Oh não! Terminou o tempo! Tenta novamente.", --Bazooka, Shotgun, SniperRifle
---      ["Oh no! You failed! Just try again."] = "", -- Basic_Training_-_Cluster_Bomb
+--      ["Oh no, the companions have betrayed %s and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
 --      ["Oh no! You have died. Try again!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Oh! Please spare me. You can take all my treasures!"] = "", -- A_Space_Adventure:ice01
 --      ["Oh, silly me! I forgot that I'm the shaman."] = "", -- A_Classic_Fairytale:backstab
@@ -1567,9 +1538,9 @@
 --      ["One shall not judge one by one's appearance!"] = "", -- A_Classic_Fairytale:epil
 --      ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oneye"] = "", -- portal
---      ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant
 --      ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant
+--      ["Only %s can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard
 --      ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01
@@ -1581,6 +1552,7 @@
 --      ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01
 --      ["Oops! You have selected the wrong hedgehog! Just try again."] = "", -- Basic_Training_-_Movement
 --      ["Open ammo menu: [Right click]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
+--      ["Open ammo menu: Tap the [Suitcase]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
 	["Open that crate and we will continue!"] = "Abre a caixa e podemos prosseguir!", -- A_Classic_Fairytale:first_blood
 	["Opposing Team: "] = "Equipa adversária",
 --      ["Orange"] = "", -- 
@@ -1600,15 +1572,14 @@
 --      ["PAotH has sent explosives but unfortunately the trigger mechanism seems to be faulty!"] = "", -- A_Space_Adventure:cosmos
 	["Parachute"] = "Pára-quedas", -- Continental_supplies
 --      ["Patches"] = "", -- 
---      ["Pathetic Resistance"] = "Pátetica Resistencia", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02
 --      ["Pause: [P]"] = "", -- Basic_Training_-_Movement
+--      ["Pause: Tap the [Pause] button"] = "", -- Basic_Training_-_Movement
 --      ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW
 --      ["Penguin Roar"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hog’s health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 	["Perfect! Now try to get the next crate without hurting yourself!"] = "Perfeito! Agora tenta obter a proxima caixa sem te aleijares!", -- A_Classic_Fairytale:first_blood
---      ["Per-Hog Ammo"] = "Armamento por-Ouriço",
 --      ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh
 --      ["Personal best: %.3f seconds"] = "", -- A_Space_Adventure:ice02
 --      ["Per team weapons"] = "", -- Continental_supplies
@@ -1617,7 +1588,6 @@
 --      ["Physicist"] = "", -- HedgeEditor
 --      ["Piano Strike"] = "", -- Construction_Mode
 --      ["Pikachu"] = "", -- 
---      ["Pincer Knights"] = "", -- Bazooka_Battlefield
 --      ["Pings left: %d"] = "", -- Space_Invasion
 --      ["Pink"] = "", -- 
 --      ["Pirates"] = "", -- 
@@ -1669,9 +1639,7 @@
 --      ["Please wait …"] = "", -- WxW
 --      ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion
 --      ["--- Points ---"] = "", -- Battalion
---      ["points"] = "", -- Control, Space_Invasion
 --      ["--- Points Mode ---"] = "", -- Battalion
---      ["point(s)"] = "", -- TargetPractice, Mutant
 --      ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02
 --      ["Poisonous, deals no damage."] = "", -- Continental_supplies
 	["Poison"] = "Poison",
@@ -1691,37 +1659,37 @@
 --      ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to fight"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos
-	["Prepare yourself"] = "Prepara-te!",
+--      ["Prepare yourself, %s!"] = "", -- The_Specialists
 --      ["Press [Attack] (space bar by default) to start,|repeadedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] (space bar by default) to start,|repeatedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] to begin."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Attack] to confirm."] = "", -- Continental_supplies
 --      ["Press [Attack] to select this continent!"] = "", -- Continental_supplies
 --      ["Press [Left] and [Right] to change the difficulty."] = "", -- A_Classic_Fairytale:first_blood
-	["Press [Left] or [Right] to move around, [Enter] to jump"] = "Pressiona [Esquerda] ou [Direita] para te moveres, [Enter] para saltar", -- A_Classic_Fairytale:first_blood
+--      ["Press [Left] or [Right] to move around, [Long Jump] to jump forwards."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW
 --      ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW
+--      ["Press [M] to see the mission texts"] = "", -- Basic_Training_-_Movement
 --      ["Press [Precise] to skip intro"] = "Pressiona [] para saltar a introdução",
 --      ["Press [Up] and [Down] to move between menu items.|Press [Attack], [Left], or [Right] to toggle."] = "", -- WxW
 --      ["Prestigious Pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Princess"] = "", -- A_Classic_Fairytale:family, A_Classic_Fairytale:journey
 --      ["Princess Peach"] = "", -- 
---      ["Private Nolak"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["Problems, dude? Chillax!"] = "", -- A_Classic_Fairytale:epil
 --      ["Professional pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professional stunt pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professor"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
 --      ["Professor Hogevil, then known as James Hogus, worked for PAotH back in my time."] = "", -- A_Space_Adventure:moon02
+--      ["Professor's Team"] = "", -- A_Space_Adventure:death01
 --      ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
---      ["Pro Killers"] = "", -- Big_Armory
 --      ["Protect the King: When the king dies, so does the team"] = "", -- Battalion
 --      ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Protect yourselves!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Purple"] = "", -- 
 --      ["Pyro"] = "", -- HedgeEditor, The_Specialists
 --      ["Pyromancer"] = "", -- Battalion
 --      ["Quit: [Esc]"] = "", -- Basic_Training_-_Movement
 --      ["Race complexity limit reached"] = "", -- Racer, TechRacer
+--      ["Race failed!"] = "", -- A_Space_Adventure:moon02
 --      ["Racer"] = "", -- Racer
 --      ["Racer tool"] = "", -- Racer
 --      ["Race"] = "", -- TrophyRace
@@ -1757,23 +1725,19 @@
 --      ["Replenishment: Weapons are restocked on turn start of a new hog"] = "", -- Highlander
 --      ["Repositioning Mode"] = "", -- HedgeEditor
 --      ["REPOSITIONING MODE"] = "", -- HedgeEditor
---      ["rescues"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Rescue the imprisoned PAotH team and get the fuel!"] = "", -- A_Space_Adventure:moon01
 --      ["Respawner"] = "", -- Construction_Mode
 --      ["Respawner: Resurrects dead hogs."] = "", -- Construction_Mode
 --      ["Resurrector"] = "", -- Construction_Mode
 --      ["Retract/Extend rope: [Up]/[Down]"] = "", -- Basic_Training_-_Rope
 --      ["- Return the enemy flag to your base to score"] = "", -- Capture_the_Flag
-	[" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = " - Traz a bandeira inimiga para tua base | - A primeira equipa a captura-la 3 vezes ganha | - Apenas podes marcar quando a tua bandeira está na tua base | - Os ouriços largam a bandeira se morrerem ou se afogarem | - As bandeiras abandonadas podem ser devolvidas ou recapturadas | - Os ouriços mortos ressuscitam",
 --      ["Return to Leaks A Lot!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Return to the mission menu by pressing the \"Go back\" button."] = "", -- A_Space_Adventure:cosmos
 --      ["Return to the Surface"] = "", -- A_Space_Adventure:fruit02
 --      ["Return to the training menu by pressing the “Go back” button."] = "", -- Basic_Training_-_Movement
---      ["Rhombus"] = "", -- Basic_Training_-_Movement
 --      ["Rider"] = "", -- portal
 --      ["Rifleman"] = "", -- Battalion
 --      ["Righteous Beard"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:queen, A_Classic_Fairytale:united
---      ["Right Tong"] = "", -- Bazooka_Battlefield
 --      ["Ripe"] = "", -- 
 --      ["Rise the water if nobody else is in the circle and deal 6 damage to all enemy hogs."] = "", -- Continental_supplies
 --      ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01
@@ -1782,8 +1746,8 @@
 --      ["Roof"] = "", -- WxW
 --      ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Rope Master"] = "", -- Basic_Training_-_Rope
---      ["Roper"] = "", -- SpeedShoppa
 --      ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
+--      ["Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Rope Team"] = "", -- Basic_Training_-_Rope
 --      ["Rope Training"] = "", -- Basic_Training_-_Rope
 --      ["Rope Weapons"] = "", -- Basic_Training_-_Rope
@@ -1797,7 +1761,6 @@
 --      ["Round limit:"] = "", -- TechRacer
 --      ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer
 --      ["Round's slowest lap: %.3fs by %s"] = "", -- TrophyRace
---      ["Rounds until Sudden Death: %d"] = "", -- Battalion
 --      ["RS1"] = "", -- A_Space_Adventure:fruit03
 --      ["RS2"] = "", -- A_Space_Adventure:fruit03
 --      ["Rubber"] = "", -- Construction_Mode, HedgeEditor
@@ -1823,10 +1786,17 @@
 --      ["Salvation was one step closer now..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Sam"] = "", -- A_Space_Adventure:cosmos
 --      ["Sandals?! I thought you left your ring!"] = "", -- A_Classic_Fairytale:queen
+--      ["%s and GB"] = "", -- A_Space_Adventure:fruit02
 --      ["%s and %s enter the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sandstorm"] = "", -- A_Space_Adventure:desert01
 --      ["Sandy"] = "", -- A_Space_Adventure:desert01
-	["Save as many hapless hogs as possible!"] = "Salva o máximo de ouriços desafortunados possível!",
+--      ["%s arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
+--      ["Save as many hogs as possible!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey
 --      ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow
 --      ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor
@@ -1838,9 +1808,9 @@
 --      ["Scallywag"] = "", -- 
 --      ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab
 --      ["Scenario"] = "", -- Big_Armory, portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape
---      ["Scenario failed!"] = "", -- SimpleMission
 --      ["Scientist"] = "", -- Battalion
 --      ["%s climbed home in %d seconds!"] = "", -- ClimbHome
+--      ["%s (contd.)"] = "", -- A_Classic_Fairytale:epil
 --      ["Score: %d"] = "", -- Space_Invasion
 --      ["Score goal: %d"] = "", -- Control
 --      ["Score graph"] = "", -- Mutant, Space_Invasion
@@ -1850,6 +1820,7 @@
 --      ["Scores"] = "", -- Mutant
 --      ["Scores:"] = "", -- Mutant
 --      ["Scoring: "] = "", -- Mutant
+--      ["%s couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
 --      ["Script parameter examples:"] = "", -- Gravity
 --      ["%s (+%d)"] = "", -- Battalion
 --      ["%s: %d"] = "", -- Capture_the_Flag, Control
@@ -1862,10 +1833,9 @@
 --      ["%s died … and lives again!"] = "", -- Construction_Mode
 --      ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome
 --      ["%s, %d sec"] = "", -- Continental_supplies
---      ["Search for the device with the help of the other hedgehogs "] = "", -- A_Space_Adventure:fruit02
+--      ["Search for the device with the help of the other hedgehogs."] = "", -- A_Space_Adventure:fruit02
 --      ["Searching in the dust"] = "", -- A_Space_Adventure:desert01
 --      ["Searching the stars!"] = "", -- A_Space_Adventure:cosmos
---      ["seconds"] = "", -- ClimbHome
 	["Seduction"] = "Sedução", -- Continental_supplies
 --      ["Seems like every time you take a \"walk\", the enemy finds us!"] = "", -- A_Classic_Fairytale:backstab
 --      ["See that crate farther on the right?"] = "", -- A_Classic_Fairytale:first_blood
@@ -1892,6 +1862,7 @@
 --      ["Select your continent with [Up]/[Down] or by selecting a representative weapon."] = "", -- Continental_supplies
 --      ["%s enters the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sergey"] = "", -- 
+--      ["%s escaped successfully!"] = "", -- A_Space_Adventure:fruit01
 --      ["Set bounciness: [Left Shift] + [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set detonation timer: [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set Health: [Left Click]"] = "", -- HedgeEditor
@@ -1915,10 +1886,12 @@
 --      ["%s has been killed before taking enough damage first."] = "", -- SimpleMission
 --      ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has been rescued from death"] = "", -- Construction_Mode
+--      ["%s has dropped the flag!"] = "", -- CTF_Blizzard
 --      ["%s has fallen victim to gravity."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has mutated! +2 points"] = "", -- Mutant
 --      ["%s has passed the best height of %s!"] = "", -- ClimbHome
 --      ["%s has scored!"] = "", -- Capture_the_Flag
+--      ["%s has to refuel the saucer."] = "", -- A_Space_Adventure:moon01
 --      ["%s hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil
 --      ["sheepluva"] = "", -- 
@@ -1935,8 +1908,6 @@
 --      ["Shinobi"] = "", -- 
 --      ["%s hit the ground."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Shoppa Love"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
---      ["Shoppa Union"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes, Challenge_-_Speed_Shoppa_-_ShoppaKing
---      ["Shoppers"] = "", -- SpeedShoppa
 	["Shotgun"] = "Caçadeira", -- Continental_supplies
 --      ["Sigh."] = "", -- A_Classic_Fairytale:epil
 --      ["Silly"] = "",
@@ -1949,11 +1920,11 @@
 --      ["%s is now as poor as a church mouse"] = "", -- Construction_Mode
 --      ["%s is now a zombie hedgehog"] = "", -- Construction_Mode
 --      ["%s is suddenly low on ammo"] = "", -- Construction_Mode
---      ["Skip your turn to try again."] = "", -- Basic_Training_-_Rope
 --      ["Skulls"] = "", -- Bazooka_Battlefield
 --      ["Slimer"] = "", -- 
 --      ["Slippery"] = "Escorregadio", -- A_Classic_Fairytale:journey
 --      ["%s lost all the weapons"] = "", -- Construction_Mode
+--      ["%s lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
 --      ["Slot %d: %s"] = "", -- Frenzy
 --      ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy
 --      ["Slowpoke"] = "", -- 
@@ -1967,6 +1938,7 @@
 --      ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smugglers"] = "", -- A_Space_Adventure:desert01
+--      ["%s must collect the final crates."] = "", -- A_Space_Adventure:fruit02
 --      ["%s must skip this turn for rule violation."] = "", -- WxW
 --      ["Sneaks"] = "", -- Bazooka_Battlefield
 --      ["%s never got the ninja diploma."] = "", -- ClimbHome
@@ -1975,10 +1947,8 @@
 --      ["Sniper"] = "", -- HedgeEditor, The_Specialists
 --      ["Sniper Rifle"] = "", -- Continental_supplies
 	["Sniper Training"] = "Treino com Sniper",
-	["Sniperz"] = "Sniperz",
 --      ["So, as promised I have brought you where I think that the device you are looking for is hidden."] = "", -- A_Space_Adventure:fruit02
 --      ["So far, you had infinite ropes, but in the|real world, ropes are usually limited."] = "", -- Basic_Training_-_Rope
---      ["So Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos
 	["So humiliating..."] = "Tão humilhante...", -- A_Classic_Fairytale:first_blood
 --      ["So, I believe that it's a good place to start."] = "", -- A_Space_Adventure:desert01
 --      ["So, I kindly ask for your help."] = "", -- A_Space_Adventure:fruit01
@@ -1988,11 +1958,12 @@
 --      ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03
 --      ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen
 --      ["Some weapons can be dropped from the rope."] = "", -- Basic_Training_-_Rope
---      ["Somewhere else on the planet of fruits, Captain Lime helps Hog Solo"] = "", -- A_Space_Adventure:fruit02
---      ["Somewhere else on the planet of fruits Hog Solo gets closer to the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, Captain Lime helps %s"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, %s gets closer to the device"] = "", -- A_Space_Adventure:fruit02
 --      ["Somewhere on the Planet of Fruits a terrible war is about to begin ..."] = "", -- A_Space_Adventure:fruit01
 --      ["Somewhere on the uninhabitable Death Planet ..."] = "", -- A_Space_Adventure:death01
 --      ["So, now I got the last part and I have your friends captured."] = "", -- A_Space_Adventure:death01
+--      ["So, %s, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So the princess was never heard of again ..."] = "", -- A_Classic_Fairytale:family
 --      ["So, uhmm, how did you manage to teleport them so far?"] = "", -- A_Classic_Fairytale:epil
 --      ["Sour"] = "", -- 
@@ -2093,8 +2064,6 @@
 --      ["Structure Placement Mode"] = "", -- Construction_Mode
 --      ["Structure Placer"] = "", -- Construction_Mode
 --      ["Stupid, stupid Hogerians!"] = "", -- A_Space_Adventure:final
---      ["Subject 1"] = "", -- portal
---      ["Subjects"] = "", -- portal
 --      ["Subtract %d"] = "", -- HedgeEditor
 --      ["--- Sudden Death ---"] = "", -- Battalion
 --      ["Summer Squash"] = "", -- A_Space_Adventure:fruit01
@@ -2111,7 +2080,7 @@
 --      ["Surfer! +15 points!"] = "", -- Space_Invasion
 --      ["Surfer!"] = "", -- WxW
 --      ["Surprise supplies: Get 1-3 random weapons each turn."] = "", -- Continental_supplies
---      ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:shadow
+--      ["Survive!"] = "", -- A_Classic_Fairytale:shadow
 --      ["%s violated the “All But Last” rule and will be penalized."] = "", -- WxW
 --      ["%s violated the “Kill The Leader” rule and will be penalized."] = "", -- WxW
 --      ["Swap place with a random enemy in the circle."] = "", -- Continental_supplies
@@ -2130,6 +2099,7 @@
 --      ["%s! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
 --      ["Swing, Leaks A Lot, on the wings of the wind!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Swing: [Left]/[Right]"] = "", -- Basic_Training_-_Rope
+--      ["%s wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome
 --      ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer
 --      ["switch"] = "", -- Continental_supplies
@@ -2143,6 +2113,7 @@
 --      ["Switch Hog"] = "", -- Construction_Mode
 --      ["Switch: Select weapon special"] = "", -- Continental_supplies
 --      ["Switch: Toggle crate radar"] = "", -- WxW
+--      ["%s won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Swords"] = "", -- Bazooka_Battlefield
 --      ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon
 --      ["%s, you may choose the rules."] = "", -- WxW
@@ -2151,6 +2122,8 @@
 --      ["Tails"] = "", -- 
 --      ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Tall Potato"] = "", -- A_Space_Adventure:fruit01
+--      ["Tap [Pause] to see the mission texts"] = "", -- Basic_Training_-_Movement
+--      ["Tap the “rotating arrow” button on the left|until you have selected Cappy, the hedgehog with the cap!"] = "", -- Basic_Training_-_Movement
 --      ["Target"] = "", -- HedgeEditor
 --      ["Target Placement Mode"] = "", -- Construction_Mode
 --      ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor
@@ -2166,15 +2139,18 @@
 --      ["Tatters"] = "", -- 
 	["Team %d: "] = "Equipa %d: ",
 --      ["Team %d"] = "", -- SimpleMission
+--      ["Team highscore: %d"] = "", -- Utils
 --      ["Team Identity Mode"] = "", -- HedgeEditor
 --      ["TEAM IDENTITY MODE"] = "", -- HedgeEditor
---      ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
+--      ["Team lowscore: %d"] = "", -- Utils
 --      ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion
+--      ["Team's best time: %.3fs"] = "", -- Utils
 --      ["Team Scores:"] = "", -- Control
 --      ["Team scores:"] = "", -- Space_Invasion
+--      ["Team's longest time: %.3fs"] = "", -- Utils
+--      ["Team's top accuracy: %d%"] = "", -- Utils
 --      ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2
 --      ["Teamwork"] = "", -- User_Mission_-_Teamwork
---      ["Team Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
 --      ["TechRacer"] = "", -- TechRacer
 --      ["Teleporation Node"] = "", -- Construction_Mode
 --      ["Teleportation Mode"] = "", -- Construction_Mode
@@ -2266,11 +2242,12 @@
 --      ["The forgotten continent"] = "", -- Continental_supplies
 --      ["The giant umbrella from the last crate should help break the fall."] = "O guarda-chuva gigante que estava na ultima caixa deve ajudar a amparar a tua queda.", -- A_Classic_Fairytale:first_blood
 --      ["The Great Escape"] = "", -- User_Mission_-_The_Great_Escape
---      ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01
+--      ["- The green target must survive"] = "", -- HedgeEditor
+--      ["- The green targets must survive"] = "", -- HedgeEditor
 --      ["The guardian"] = "O guardião", -- A_Classic_Fairytale:shadow
 --      ["The hardships of the war turned %s (%s) into a killing machine: %d invaders destroyed in one round!"] = "", -- Space_Invasion
+--      ["The health of your current hedgehog|is shown at the top right corner."] = "", -- Basic_Training_-_Movement
 --      ["The hedgehog with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant
---      ["The Hogies"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["The Hospital"] = "", -- 
 --      ["The Individualist"] = "O Individualista", -- A_Classic_Fairytale:shadow
 --      ["Their buildings were very primitive back then, even for an uncivilised island."] = "", -- A_Classic_Fairytale:united
@@ -2288,7 +2265,6 @@
 --      ["The Mutant has super-weapons and a lot of health."] = "", -- Mutant
 --      ["The Mutant loses health quickly, but gains health by killing."] = "", -- Mutant
 --      ["The Mutant loses health quickly if he doesn't keep scoring kills."] = "", -- Mutant
---      ["The Nameless One"] = "",
 --      ["The Navy greets %s for managing to get in a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["The next 4 times you play the \"The last encounter\" mission you'll get 20 more hit points and a laser sight."] = "", -- A_Space_Adventure:death02
 --      ["The next crate is an utility crate."] = "", -- Basic_Training_-_Movement
@@ -2302,6 +2278,7 @@
 --      ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil
 --      ["The oppression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
 --      ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
+--      ["The other hog has died, he should have survived!"] = "", -- A_Space_Adventure:moon02
 --      ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Police"] = "", -- 
 --      ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -2326,7 +2303,7 @@
 --      ["The Showdown"] = "", -- A_Classic_Fairytale:shadow
 --      ["The Slaughter"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:first_blood
 --      ["The Society of Perfectionists greets %s (%s): No misses and %d hits in its best round."] = "", -- Space_Invasion
-	["THE SPECIALISTS"] = "OS ESPECIALISTAS",
+--      ["The Specialists: Each hedgehog starts with its own weapon set"] = "", -- The_Specialists
 --      ["The spinning arrows above your hedgehog show|which hedgehog is selected right now."] = "", -- Basic_Training_-_Movement
 --      ["The spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
@@ -2374,7 +2351,6 @@
 --      ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["This also increases the effectiveness of Medicine."] = "", -- Continental_supplies
 --      ["This game wasn’t really exciting."] = "", -- Space_Invasion
---      ["This Hog Solo is so naive! When he returns I'll shoot him and keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This is a new personal best, congratulations!"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert02, A_Space_Adventure:fruit03
 --      ["This is a new personal best time, congratulations!"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["This is Cappy."] = "", -- Basic_Training_-_Movement
@@ -2392,6 +2368,7 @@
 	["This rain is really something..."] = "Esta chuva é mesmo qualquer coisa...",
 --      ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome
 --      ["This seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01
+--      ["This %s is so naive! I'm going to shoot this fool so I can keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This was an awesome performance! But this challenge can be finished with even just one RC plane. Can you figure out how?"] = "", -- User_Mission_-_RCPlane_Challenge
 	["This will be fun!"] = "Isto vai ser divertido!", -- A_Classic_Fairytale:enemy
 --      ["This will be useful when I need a new platform or if I want to rise."] = "", -- portal
@@ -2432,11 +2409,11 @@
 --      ["To begin with the training, hit the attack key!"] = "", -- Basic_Training_-_Movement
 --      ["To begin with the training, select the bazooka from the ammo menu!"] = "", -- Basic_Training_-_Bazooka
 --      ["To begin with the training, select the grenade from the ammo menu!"] = "", -- Basic_Training_-_Grenade
+--      ["To begin with the training, tap the attack button!"] = "", -- Basic_Training_-_Movement
 --      ["To finish hedgehog selection, just do anything|with him, like walking."] = "", -- Basic_Training_-_Movement
 --      ["To get over the next obstacles, keep some distance from the wall before you back jump."] = "", -- Basic_Training_-_Movement
 --      ["To get over the water, you have to do multiple|rope shots and swings."] = "", -- Basic_Training_-_Rope
 --      ["Toggle Editing Weapons and Tools: [Precise]+[2]"] = "", -- HedgeEditor
---      ["Toggle Gear Information: [Precise]+[3]"] = "", -- HedgeEditor
 --      ["Toggle Help: [Precise]+[1]"] = "", -- HedgeEditor
 --      ["Toggle Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Toggle Shield: [Long jump]"] = "", -- Space_Invasion
@@ -2446,14 +2423,14 @@
 --      ["Too bad! Then you should really leave!"] = "", -- A_Space_Adventure:fruit01
 --      ["Too slow! Try again ..."] = "", -- A_Space_Adventure:moon02
 --      ["Top-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"] = "", -- A_Classic_Fairytale:shadow
 --      ["To reach higher ground, walk to a ledge, look to the left, then do a back jump."] = "", -- Basic_Training_-_Movement
 --      ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey
 --      ["To the caves..."] = "", -- A_Classic_Fairytale:united
 --      ["Touch all waypoints as fast as you can!"] = "", -- Racer
---      ["To win the game, Hog Solo has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
+--      ["- Touch the sparkles near your base to teleport"] = "", -- CTF_Blizzard
+--      ["To win the game, %s has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
 --      ["To win the game you had to collect the 2 crates with no specific order."] = "", -- A_Space_Adventure:desert01
---      ["To win the game you have to eliminate all your enemies."] = "", -- A_Space_Adventure:death01
+--      ["To win the game you have to eliminate Professor Hogevil."] = "", -- A_Space_Adventure:death01
 --      ["To win the game you have to find the right crate."] = "", -- A_Space_Adventure:desert01
 --      ["To win the game you have to go next to Thanta."] = "", -- A_Space_Adventure:ice01
 --      ["To win the game you have to go to the surface."] = "", -- A_Space_Adventure:desert02
@@ -2461,14 +2438,11 @@
 --      ["To win the game you have to stand next to Thanta."] = "", -- A_Space_Adventure:ice01
 --      ["Toxic Team"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Track completed!"] = "", -- Racer, TechRacer
---      ["Trainee"] = "", -- TargetPractice
 --      ["Training"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Training complete!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Training Team"] = "", -- TargetPractice
 	["Traitores"] = "Traidores", -- A_Classic_Fairytale:epil
 --      ["Traitors"] = "", -- A_Classic_Fairytale:epil
 --      ["Traitors don't get to shout around here!"] = "", -- A_Classic_Fairytale:epil
---      ["Trapped"] = "", -- Basic_Training_-_Movement
 --      ["Trapper"] = "", -- HedgeEditor
 --      ["Travel carefully as your fuel is limited"] = "", -- A_Space_Adventure:cosmos
 --      ["Travel to all the neighbor planets and collect all the pieces"] = "", -- A_Space_Adventure:cosmos
@@ -2485,7 +2459,6 @@
 --      ["Try to land softly, as you can still take fall damage!"] = "", -- Basic_Training_-_Flying_Saucer
 	["Try to protect the chief! You won't lose if he dies, but it is advised that he survives."] = "Tenta protejer o chefe! Não perdes se ele morrer, mas é recomendado que ele sobreviva.", -- A_Classic_Fairytale:united
 --      ["Try to reach and destroy the next target quickly."] = "", -- Basic_Training_-_Rope
-	["T_T"] = "T_T",
 --      ["Tumbler"] = "", -- Tumbler
 --      ["Turn around: [Left Shift] + [Left]/[Right]"] = "", -- Basic_Training_-_Movement
 --      ["Turning Around"] = "", -- Basic_Training_-_Movement
@@ -2504,7 +2477,6 @@
 --      ["Uhmm...ok no."] = "Uhm...ok não.", -- A_Classic_Fairytale:enemy
 --      ["Ukemi"] = "", -- 
 --      ["Ultra kill!"] = "", -- Mutant
---      ["Ultrasoldier"] = "", -- Big_Armory
 --      ["unC0Rr"] = "", -- 
 	["Under Construction"] = "Em Construção", -- A_Classic_Fairytale:shadow
 --      ["Under normal circumstances we could easily defeat them but we have kindly sent most of our men to the Kingdom of Sand to help with the annual dusting of the king's palace."] = "", -- A_Space_Adventure:fruit01
@@ -2528,7 +2500,6 @@
 --      ["United We Stand"] = "", -- A_Classic_Fairytale:united
 	["Unit"] = "Unidade",
 --      ["Unlike bazookas, grenades are not influenced by wind."] = "", -- Basic_Training_-_Grenade
-	["Unlimited Attacks"] = "Ataques Ilimitados",
 --      ["Unlimited Attacks: Attacks don't end your turn"] = "", -- User_Mission_-_Diver, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree
 --      ["Unlucky Sods"] = "", -- User_Mission_-_Rope_Knock_Challenge
 	["Unstoppable!"] = "Imparável!",
@@ -2544,13 +2515,14 @@
 --      ["Use it with precaution!"] = "Usa com cuidado!", -- A_Classic_Fairytale:first_blood
 --      ["User Challenge"] = "",
 --      ["!"] = "", -- User_Mission_-_Dangerous_Ducklings
+--      ["User Mission"] = "", -- HedgeEditor
 --      ["Use the attack key twice to change the flying saucer while being in air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the attack key twice to change the flying saucer while floating in mid-air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the bazooka and the flying saucer to get the freezer."] = "", -- A_Space_Adventure:ice01
 --      ["Use the flying saucer from the crate to fly to the moon."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly the other planets."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly to the other planets."] = "", -- A_Space_Adventure:cosmos
---      ["Use the parachute ([Space] while in air) to get the next crate"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Use the parachute to get the next crate."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Use the portal gun to get to the next crate, then use the new gun to get to the final destination!|"] = "", -- A_Classic_Fairytale:dragon
 --      ["Use the RC plane and destroy the all the targets."] = "", -- A_Space_Adventure:desert03
 --      ["Use the rope in order to catch the blue hedgehog"] = "", -- A_Space_Adventure:moon02
@@ -2583,7 +2555,6 @@
 --      ["Victory Condition: Collect"] = "", -- HedgeEditor
 --      ["Victory Condition: Destroy"] = "", -- HedgeEditor
 --      ["Victory for %s!"] = "", -- Capture_the_Flag
-	["Victory for the "] = "Vitória para a", -- CTF_Blizzard, Capture_the_Flag
 	["Victory!"] = "Vitória!", -- Basic_Training_-_Rope
 	["Violence is not the answer to your problems!"] = "Violência não é a resposta para os teus problemas!", -- A_Classic_Fairytale:first_blood
 --      ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos
@@ -2603,9 +2574,6 @@
 --      ["Walls left: %d"] = "", -- WxW
 --      ["Wall to wall"] = "", -- WxW
 --      ["Waluigi"] = "", -- 
---      ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Wannabe Ropers"] = "", -- Basic_Training_-_Rope
---      ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Wario"] = "", -- 
 --      ["Warming Up"] = "", -- Basic_Training_-_Grenade
 --      ["Warning: Fire cake detected"] = "", -- ClimbHome
@@ -2634,7 +2602,6 @@
 --      ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion
 --      ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion
 --      ["Weapon specials: Some weapons have special modes (see weapon description)."] = "", -- Continental_supplies
---      ["Weapons Reset"] = "",
 --      ["Weapons reset: The weapons are reset after each turn."] = "", -- WxW
 	["We are indeed."] = "Somos mesmo.", -- A_Classic_Fairytale:backstab
 --      ["We can't defeat them!"] = "Não podemos\conseguimos derrotalos!", -- A_Classic_Fairytale:shadow
@@ -2651,9 +2618,9 @@
 --      ["We have to hurry! Are you armed?"] = "", -- A_Space_Adventure:moon01
 	["We have to protect the village!"] = "Temos de protejer a aldeia!", -- A_Classic_Fairytale:united
 --      ["We have to unite and defeat those cylergs!"] = "Temos de nos unir e derrotar estes ciber-pernudos!", -- A_Classic_Fairytale:enemy
---      ["Welcome Hog Solo, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome home! Please take a seat"] = "", -- ClimbHome
 	["Welcome, Leaks A Lot!"] = "Bem vindo, Leaks a Lot!", -- A_Classic_Fairytale:journey
+--      ["Welcome, %s, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome to the Death Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
@@ -2820,16 +2787,16 @@
 --      ["You can’t open a portal on the blue surface."] = "", -- portal
 --      ["You can use the other 2 hogs to assist you."] = "", -- A_Space_Adventure:fruit02
 --      ["You can use the rope to reach new places."] = "", -- Basic_Training_-_Rope
---      ["You choose well, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You choose well, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You completed the mission in %.3f seconds."] = "", -- A_Space_Adventure:ice02
 --      ["You completed the mission in %d rounds."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03
---      ["You couldn't have come to a worse time, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You couldn't have come to a worse time, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You couldn't possibly believe that after refusing my offer I'd just let you go!"] = "", -- A_Classic_Fairytale:journey
 	["You'd almost swear the water was rising!"] = "Quase eras capaz jurar que a água estava a subir!",
 --      ["You'd better watch your steps..."] = "É melhor teres cuidado onde pôes os pés...", -- A_Classic_Fairytale:journey
 --      ["You defended yourself against Captain Lime."] = "", -- A_Space_Adventure:fruit02
---      ["You defended yourself against the Fruit Assassins."] = "", -- A_Space_Adventure:fruit02
---      ["You did great, Hog Solo! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
+--      ["You defended yourself against %s."] = "", -- A_Space_Adventure:fruit02
+--      ["You did great, %s! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
 --      ["You did not make it in time, try again!"] = "Não chegaste a tempo, tenta novamente!", -- Basic_Training_-_Rope
 --      ["You don't deserve my sacrifice!"] = "", -- A_Classic_Fairytale:queen
 --      ["You drove Professor Hogevil away."] = "", -- A_Space_Adventure:moon01
@@ -2845,12 +2812,12 @@
 --      ["You got me!"] = "", -- A_Space_Adventure:moon02
 --      ["You had %.1fs remaining on the clock (+%d points)."] = "", -- TargetPractice
 --      ["You had %.2fs remaining on the clock (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle
---      ["You had %d additional flying saucers left."] = "", -- A_Space_Adventure:ice02
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: you might want to use some mines..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: You might want to use some mines ..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01
 --      ["You have activated Switch Hedgehog!"] = "", -- Basic_Training_-_Movement
 --      ["You have beaten the challenge!"] = "", -- ClimbHome
+--      ["You have beaten the team record, congratulations!"] = "", -- Utils
 --      ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab
 --      ["You have chosen the perfect moment to leave."] = "Escolheste o momento perfeito para ir embora\sair.", -- A_Classic_Fairytale:united
 --      ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01
@@ -2869,7 +2836,6 @@
 --      ["You have eliminated all visible enemy hedgehogs!"] = "", -- A_Space_Adventure:fruit01
 --      ["You have eliminated Professor Hogevil."] = "", -- A_Space_Adventure:moon01
 --      ["You have eliminated the evil minions."] = "", -- A_Space_Adventure:moon01
---      ["You have eliminated the whole evil team. You're pretty tough!"] = "", -- A_Space_Adventure:moon01
 --      ["You have escaped successfully."] = "", -- A_Space_Adventure:desert02
 --      ["You have failed to complete your task, young one!"] = "Não foste capaz de completar a tua tarefa, jovem!", -- A_Classic_Fairytale:journey
 --      ["You have failed to save the tribe!"] = "Não foste capaz de salvar a tribo!", -- A_Classic_Fairytale:backstab
@@ -2923,6 +2889,7 @@
 --      ["You have to travel again"] = "", -- A_Space_Adventure:cosmos
 --      ["You have to try again!"] = "", -- A_Space_Adventure:cosmos
 --      ["You have triggered the secret Do-Not-Rope-to-the-Moon Defense System."] = "", -- A_Space_Adventure:cosmos
+--      ["You have unlocked the target radar!"] = "", -- TargetPractice
 --      ["You have used %d flying saucers."] = "", -- A_Space_Adventure:ice02
 --      ["You have used %d RC planes."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["You have used only 1 RC plane. Outstanding!"] = "", -- User_Mission_-_RCPlane_Challenge
@@ -2941,10 +2908,9 @@
 --      ["You'll have only 2 watermelon bombs during the game."] = "", -- A_Space_Adventure:fruit03
 --      ["You'll have only one RC plane at the start of the mission."] = "", -- A_Space_Adventure:desert03
 --      ["You'll have to eliminate Captain Lime at the end."] = "", -- A_Space_Adventure:fruit02
---      ["You'll have to eliminate the Fruit Assassins at the end."] = "", -- A_Space_Adventure:fruit02
+--      ["You'll have to eliminate %s at the end."] = "", -- A_Space_Adventure:fruit02
 --      ["You'll lose if you die or if your time is up."] = "", -- A_Space_Adventure:moon02
 --      ["You'll see what I mean!"] = "Já vais perceber o que quero dizer!", -- A_Classic_Fairytale:enemy
---      ["You lose!"] = "", -- Basic_Training_-_Sniper_Rifle, Big_Armory, Basic_Training_-_Bazooka, TargetPractice, ClimbHome
 --      ["You lost your target, try again!"] = "", -- TargetPractice
 --      ["You may find it handy."] = "", -- A_Space_Adventure:cosmos
 	["You may only attack from a rope!"] = "Só podes atacar da corda!", -- WxW
@@ -2966,8 +2932,7 @@
 --      ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice
 --      ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice
 --      ["Your ammo is limited this time."] = "", -- Basic_Training_-_Bazooka
---      ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy
---      ["Your deaths will be avenged, Natives!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Your deaths will be avenged, %s!"] = "", -- A_Classic_Fairytale:enemy
 	["Your death will not be in vain, Dense Cloud!"] = "A tua morte não será em vão, Nuvem Densa!", -- A_Classic_Fairytale:shadow
 --      ["You're a coward!"] = "", -- A_Classic_Fairytale:queen
 	["You're...alive!? But we saw you die!"] = "Estás...vivo!? Mas nós vimos-te morrer!", -- A_Classic_Fairytale:backstab
@@ -2995,21 +2960,21 @@
 --      ["Your next task is to collect some crates by using the rope!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Your personal best time so far: %.3f seconds"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["Your rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["You saved %d of 8 Hapless Hogs."] = "", -- User_Mission_-_That_Sinking_Feeling
+--      ["Your rope is gone! Try again!"] = "", -- Basic_Training_-_Rope
+--      ["You saved %d of 8 hegehogs."] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen
 --      ["You see the wind strength at the bottom right corner."] = "", -- Basic_Training_-_Bazooka
+--      ["You see the wind strength at the top."] = "", -- Basic_Training_-_Bazooka
 --      ["You should have known that we don't rely on meatbags!"] = "", -- A_Classic_Fairytale:queen
 --      ["You should know this more than anyone, Leaks!"] = "", -- A_Classic_Fairytale:queen
 --      ["You speak great truth, Hannibal. Here, take a sip!"] = "", -- A_Classic_Fairytale:epil
 --      ["You've been assaulting us, we have been just defending ourselves!"] = "Voces têm-nos atacado, apenas nos estamos a defender!", -- A_Classic_Fairytale:enemy
-	["You've failed. Try again."] = "Falhaste. Tenta novamente.",
 	["You've reached the goal!| |Time: "] = "Chegaste ao fim!| |Tempo: ",
 	["You will be avenged!"] = "Serás vingado!", -- A_Classic_Fairytale:shadow
 --      ["You will fail if you run out of ammo and there are still targets available."] = "", -- A_Space_Adventure:desert03
 --      ["You will gain some extra ammo from the crates the next time you play the \"Getting to the device\" mission."] = "", -- A_Space_Adventure:fruit03
 --      ["You will play every 3 turns."] = "", -- A_Space_Adventure:fruit01
 --      ["- You will recieve 2-4 weapons on each kill! (Even on own hogs)"] = "", -- Continental_supplies
---      ["You win!"] = "", -- Big_Armory
 	["You won't believe what happened to me!"] = "Não vais acreditar no que se passou comigo!", -- A_Classic_Fairytale:backstab
 --      ["Yuck! I bet they'll keep worshipping her even after I save the village!"] = "Yuck! Aposto que eles vão continuar a venerala mesmo depois de eu ter salvo a aldeia deles~~~~~~", -- A_Classic_Fairytale:family
 --      ["Yumme Gunpowder"] = "", -- 
@@ -3017,6 +2982,7 @@
 --      ["Zombie"] = "", -- 
 --      ["Zombi"] = "", -- portal
 	["'Zooka Team"] = "Bazuqueiros",
---      ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
+--      ["Zoom: [Pinch] with 2 fingers"] = "", -- Basic_Training_-_Movement
+--      ["Zoom: [Rotate mouse wheel]"] = "", -- Basic_Training_-_Movement
 	["Zork"] = "Zork", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen
 }
--- a/share/hedgewars/Data/Locale/ru.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/ru.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -26,7 +26,6 @@
       ["Above-average pilot"] = "Пилот выше среднего", -- User_Mission_-_RCPlane_Challenge
 --      ["Accuracy Bonus! +15 points"] = "", -- Space_Invasion
       ["Accuracy bonus: +%d points"] = "Бонус за точность: +%d очков", -- Basic_Training_-_Sniper_Rifle
-      ["Ace"] = "Ас", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge
 --      ["Achievement gotten: %s"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_That_Sinking_Feeling, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, Basic_Training_-_Rope, Tumbler
 --      ["A Classic Fairytale"] = "", -- A_Classic_Fairytale:first_blood
 --      ["A crate critical to this mission has been destroyed."] = "", -- SimpleMission
@@ -46,7 +45,6 @@
 --      ["Again with the 'cannibals' thing!"] = "", -- A_Classic_Fairytale:enemy
 --      ["A Hedgewars minigame"] = "", -- Capture_the_Flag
 --      ["A Hedgewars mini-game"] = "", -- Racer, Space_Invasion, TechRacer, Tumbler
-      ["a Hedgewars mini-game"] = "Мини-игра в Hedgewars", -- Space_Invasion, The_Specialists
 --      ["A Hedgewars tag game"] = "", -- Mutant
 --      ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome
 --      ["Aim at the ceiling and hold [Attack] pressed until the rope attaches."] = "", -- Basic_Training_-_Rope
@@ -141,13 +139,14 @@
 --      ["As you've seen, the dropped grenade roughly fell into your flying direction."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Athlete"] = "", -- Battalion
 --      ["Attack: Activate"] = "", -- Racer
---      ["Attack Captain Lime before he attacks back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack Captain Lime before he attacks back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack From Rope: %s"] = "", -- WxW
 --      ["Attack From Rope: You may only attack from a rope."] = "", -- WxW
 --      ["Attack rule: %s"] = "", -- WxW
 --      ["Attack: Select this continent"] = "", -- Continental_supplies
 --      ["Attack: [Space]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
---      ["Attack the assassins before they attack back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack: Tap the [Bomb]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
+--      ["Attack the assassins before they attack back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack: Throw ball"] = "", -- Knockball
 --      ["At the end of the game your health was %d."] = "", -- A_Space_Adventure:ice01
 --      ["At the start of the game each enemy hog has only the weapon that he is named after."] = "", -- A_Space_Adventure:death02
@@ -155,16 +154,18 @@
 --      ["Available weapon specials:"] = "", -- Continental_supplies
       ["Average pilot"] = "Средний Пилот", -- User_Mission_-_RCPlane_Challenge
 --      ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion
---      ["Avoid the mines!"] = "", -- Basic_Training_-_Rope
 --      ["Axes"] = "", -- Bazooka_Battlefield
 --      ["Aye! Fellow! Let me exit this chamber of doom!"] = "", -- A_Classic_Fairytale:epil
 --      ["Back Breaker"] = "", -- A_Classic_Fairytale:backstab
 --      ["Back in the village, after telling the villagers about the threat..."] = "", -- A_Classic_Fairytale:united
 --      ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil
 --      ["Back Jump: [Backspace] ×2"] = "", -- Basic_Training_-_Movement
+--      ["Back Jump: Double-tap the [Curvy Arrow]"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (1/2)"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (2/2)"] = "", -- Basic_Training_-_Movement
 --      ["Backstab"] = "", -- A_Classic_Fairytale:backstab
+--      ["Backwards jump: Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Backwards jump: Tap the [Curvy Arrow] twice"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Bacon"] = "", -- 
       ["Bad Guy"] = "Плохой", -- User_Mission_-_The_Great_Escape
 --      ["Badmad"] = "", -- portal
@@ -197,7 +198,6 @@
 --      ["Bazooka Battlefield"] = "", -- Bazooka_Battlefield
 --      ["Bazooka Master"] = "", -- Basic_Training_-_Bazooka
 --      ["Bazookas are influenced by wind."] = "", -- Basic_Training_-_Bazooka
---      ["Bazooka Team"] = "", -- Basic_Training_-_Bazooka
       ["Bazooka Training"] = "Тренировка с базукой",
 --      ["Bearded Beast"] = "", -- 
 --      ["Be careful, the future of Hogera is in your hands!"] = "", -- A_Space_Adventure:cosmos
@@ -231,7 +231,6 @@
 --      ["Bloodpie"] = "", -- A_Classic_Fairytale:backstab
 --      ["Bloodrocutor"] = "", -- A_Classic_Fairytale:shadow
 --      ["Bloodsucker"] = "", -- A_Classic_Fairytale:shadow
-      ["Bloody Rookies"] = "Новобранцы", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 --      ["Blue"] = "", -- 
       ["Blue Team"] = "Синяя Команда", -- User_Mission_-_Dangerous_Ducklings
 --      ["Bob"] = "", -- A_Space_Adventure:cosmos
@@ -314,7 +313,9 @@
 --      ["Challenge objectives"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit03, A_Space_Adventure:moon02
 --      ["Challenge over!"] = "", -- User_Mission_-_Rope_Knock_Challenge
       ["Challenge"] = "Испытание", -- SpeedShoppa
+--      ["Change bounciness: Tap [B]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Content: [Left], [Right]"] = "", -- HedgeEditor
+--      ["Change detonation timer: Tap the [Clock]"] = "", -- Basic_Training_-_Grenade, A_Classic_Fairytale:shadow
 --      ["Change direction: [Left]/[Right]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Change Health: [Left], [Right]"] = "", -- HedgeEditor
@@ -334,6 +335,8 @@
 --      ["Chicken"] = "", -- 
 --      ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01
 --      ["Chikorita"] = "", -- 
+--      ["Choose location: Left click"] = "", -- A_Classic_Fairytale:shadow
+--      ["Choose location: Tap the [Target] button, then tap on the spot you want to choose"] = "", -- A_Classic_Fairytale:shadow
 --      ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
       ["Choose your continent wisely, as your decision will be permanent."] = "Выбирайте ваш континент ответственно, это решение нельзя будет изменить.", -- Continental_supplies
 --      ["Choose your side! If you want to join the strange man, walk up to him.|Otherwise, walk away from him. If you decide to att...nevermind..."] = "", -- A_Classic_Fairytale:shadow
@@ -342,21 +345,22 @@
 --      ["Cleaver Placement Mode"] = "", -- Construction_Mode
 --      ["CLEAVER PLACEMENT MODE"] = "", -- HedgeEditor
       ["Cleaver"] = "Секач", -- Construction_Mode
---      ["Climber"] = "", -- ClimbHome
 --      ["Climb Home"] = "", -- ClimbHome
 --      ["Closing in"] = "", -- A_Classic_Fairytale:queen
+      ["Clowns"] = "Клоуны", -- User_Mission_-_Nobody_Laugh
       ["Clown"] = "Клоун", -- HedgeEditor
-      ["Clowns"] = "Клоуны", -- User_Mission_-_Nobody_Laugh
 --      ["Cluck-cluck time: [Fire an egg ~ Sabotages and cures poison ~ Cannot be fired close to another hog]"] = "", -- Continental_supplies
       ["Clumsy"] = "Неуклюжий",
       ["Cluster Bomb Training"] = "Тренировка с Касcетной бомбой", -- Basic_Training_-_Cluster_Bomb
 --      ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey
 --      ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey
+--      ["- Collect all the blue crates"] = "", -- HedgeEditor
 --      ["Collect all the crates, but remember, our time in this life is limited!"] = "", -- A_Classic_Fairytale:first_blood
       ["Collect or destroy all the health crates."] = "Собери или уничтожь все аптечки.", -- User_Mission_-_RCPlane_Challenge
 --      ["Collect or destroy the final crate to finish the training."] = "", -- Basic_Training_-_Flying_Saucer
+--      ["- Collect the blue crate"] = "", -- HedgeEditor
 --      ["Collect the crate and attack!"] = "", -- WxW
---      ["Collect the crate on the right.|Hint: Select the rope, [Up] or [Down] to aim, [Space] to fire, directional keys to move.|Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Collect the crate on the right."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the crates within the time limit!|If you fail, you'll have to try again."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the first crate to begin!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Collect the freezer and get the device part from Thanta."] = "", -- A_Space_Adventure:ice01
@@ -423,7 +427,6 @@
 --      ["Crates: Crates drop randomly with chance of being empty"] = "", -- Battalion
       ["Crates left: %d"] = "Осталось ящиков: %d", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates per turn: %d"] = "", -- WxW
-      ["crate(s)"] = "ящиков", -- SpeedShoppa
 --      ["Crazy Gravity: Gravity randomly changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity
 --      ["Crazy Runner"] = "", -- A_Space_Adventure:moon02
 --      ["Cricket Time"] = "", -- Continental_supplies
@@ -456,11 +459,10 @@
 --      ["Deals 15 damage to all enemies in the circle."] = "", -- Continental_supplies
 --      ["Deer"] = "", -- 
 --      ["Defeat all enemies!"] = "", -- portal
+--      ["Defeat!"] = "", -- HedgeEditor
 --      ["Defeat Professor Hogevil!"] = "", -- A_Space_Adventure:death01
---      ["Defeat the cannibals"] = "", -- A_Classic_Fairytale:backstab
---      ["Defeat the cannibals!|"] = "", -- A_Classic_Fairytale:united
+--      ["Defeat the cannibals!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cannibals!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Defeat the cannibals!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cyborgs!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen
 --      ["Delete Waypoint"] = "", -- HedgeEditor
@@ -481,11 +483,11 @@
       ["Destroyer of planes"] = "Уничтожитель самолётов", -- User_Mission_-_RCPlane_Challenge
 --      ["Destroy him, Leaks A Lot! He is responsible for the deaths of many of us!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion
+--      ["- Destroy the enemy"] = "", -- HedgeEditor
+--      ["- Destroy the red target"] = "", -- HedgeEditor
+--      ["- Destroy the red targets"] = "", -- HedgeEditor
 --      ["Destroy the targets!"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
---      ["Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
---      ["Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"] = "", -- A_Classic_Fairytale:first_blood
 --      ["+%d flamer fuel!"] = "", -- Tumbler
-      ["%d Hapless Hogs left"] = "%d Несчастных Ёжиков осталось",
 --      ["+%d health"] = "", -- Mutant
 --      ["%d-Hit Combo! +%d points!"] = "", -- Space_Invasion
 --      ["Did anyone follow you?"] = "", -- A_Classic_Fairytale:united
@@ -506,7 +508,6 @@
 --      ["Disguise as a Rockhopper Penguin"] = "", -- Continental_supplies
 --      ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies
 --      ["Displacer"] = "", -- 
-      ["Disqualified!"] = "Дисквалификация!", -- User_Mission_-_That_Sinking_Feeling
 --      ["Diver"] = "", -- User_Mission_-_Diver
 --      ["%d ms"] = "", -- HedgeEditor
 --      ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen
@@ -593,10 +594,8 @@
 --      ["Elderbot"] = "", -- A_Classic_Fairytale:family
       ["Elimate your captor."] = "Уничтожь твоего похитителя.", -- User_Mission_-_The_Great_Escape
       ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Уничтожь все цели, пока время не вышло.|Для этой миссии доступен неограниченный боезапас.", --Bazooka, Shotgun, SniperRifle
---      ["Eliminate the Blue Team before the time runs out."] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Eliminate the enemy before the time runs out."] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 --      ["Eliminate the enemy hogs to win."] = "",
-      ["Eliminate the enemy specialists."] = "Уничтожьте вражеских специалистов.",
 --      ["Eliminate the enemy."] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh
 --      ["Eliminate Unit 3378."] = "", -- User_Mission_-_Teamwork
 --      ["Eliminate WatchBot 4000."] = "", -- User_Mission_-_Teamwork_2
@@ -621,13 +620,14 @@
 --      ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab
       ["Except me, of course! I just saved a whole planet!"] = "Кроме меня, конечно! Я только что спас целую планету!", -- A_Space_Adventure:final
       ["Experienced beginner"] = "Продвинутый новичок", -- User_Mission_-_RCPlane_Challenge
---      ["Explore the tunnel with the other hedgehogs and search for the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Explore the tunnel with the other hedgehogs and search for the device."] = "", -- A_Space_Adventure:fruit02
 --      ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02
 --      ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey
 --      ["Fair Wind"] = "", -- 
 --      ["Fall Damage"] = "", -- Basic_Training_-_Movement
 --      ["Fallen Angel"] = "", -- Tentacle_Terror
 --      ["Family Reunion"] = "", -- A_Classic_Fairytale:family
+--      ["Fastest escape: %d turns"] = "", -- A_Space_Adventure:desert02
       ["Fastest lap: %.3fs by %s"] = "Лучший результат: %.3fs от %s", -- TrophyRace
       ["Fastest lap: "] = "Лучший результат: ",
       ["Feeble Resistance"] = "Слабое Сопротивление",
@@ -647,11 +647,12 @@
 --      ["Final result"] = "", -- Mutant
 --      ["Final Targets"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
 --      ["Final team scores:"] = "", -- Space_Invasion
+--      ["Find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Find a way to detonate all the explosives and stay alive!"] = "", -- A_Space_Adventure:final
 --      ["Find your tribe!|Cross the lake!"] = "", -- A_Classic_Fairytale:dragon
 --      ["Finish this challenge as fast as possible to earn bonus points."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Finish waypoint placement"] = "", -- Racer
---      ["Finish your training|Hint: Animations can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Finish your training."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Finite Ropes"] = "", -- Basic_Training_-_Rope
 --      ["Fire a rocket with napalm."] = "", -- Continental_supplies
 --      ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler
@@ -679,6 +680,7 @@
 --      ["Flying Saucer Training"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Fly into space to fight off the invaders with barrels!"] = "", -- Space_Invasion
 --      ["Fly to the meteorite and detonate the explosives"] = "", -- A_Space_Adventure:cosmos
+--      ["Follow the path and destroy the next target."] = "", -- Basic_Training_-_Rope
 --      ["Forgetfulness: You will lose all your weapons each turn."] = "", -- Continental_supplies
 --      ["For the next crate, you have to do back jumps."] = "", -- Basic_Training_-_Movement
 --      ["Four Eyes"] = "", -- 
@@ -698,9 +700,7 @@
 --      ["“g=150”, where 150 is 150% of normal gravity."] = "", -- Gravity
 --      ["“g=50, g2=150, period=4000” for gravity changing|from 50 to 150 and back with period of 4000 ms."] = "", -- Gravity
 --      ["Galaxy Guardians"] = "", -- Big_Armory
-      ["Game Modifiers: "] = "Игровые Модификаторы: ",
 --      ["Game over!"] = "", -- Space_Invasion
-      ["GAME OVER!"] = "ИГРА ОКОНЧЕНА!",
       ["Game Started!"] = "Игра Началась!",
 --      ["Game? Was this a game to you?!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Gangsters"] = "", -- 
@@ -709,8 +709,6 @@
 --      ["Gasp! A smuggler!"] = "", -- A_Space_Adventure:desert01
 --      ["Gasp!"] = "", -- A_Space_Adventure:desert01
 --      ["Gathering fruits all day long."] = "", -- A_Classic_Fairytale:queen
---      ["Gear information hidden"] = "", -- HedgeEditor
---      ["Gear information shown"] = "", -- HedgeEditor
 --      ["Gear Placement Tool"] = "", -- HedgeEditor
 --      ["General information"] = "", -- Continental_supplies
 --      ["General information:"] = "", -- Continental_supplies
@@ -720,7 +718,7 @@
 --      ["Get Dense Cloud out of the pit!"] = "", -- A_Classic_Fairytale:journey
 --      ["Get him, Spike!"] = "", -- A_Space_Adventure:desert01
       ["Get on over there and take him out!"] = "Доберись туда и уничтожь его!",
---      ["Get on the head of the mole"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Get on the head of the mole."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Get past the flower."] = "", -- A_Classic_Fairytale:journey
 --      ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01
 --      ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood
@@ -758,7 +756,6 @@
       ["GO! GO! GO!"] = "ВПЕРЁД! ВПЕРЁД! ВПЕРЁД!",
       ["Good birdy......"] = "Хорошая птичка...",
 --      ["Good bye!"] = "", -- Basic_Training_-_Flying_Saucer
-      ["Good Dude"] = "Хороший", -- User_Mission_-_The_Great_Escape
 --      ["Good idea, they'll never find us there!"] = "", -- A_Classic_Fairytale:united
 --      ["Good job!"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Good job! Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -769,7 +766,7 @@
       ["Good so far!"] = "Пока хорошо!",
       ["Good to go!"] = "Пошёл!",
 --      ["Good! You now control Cappy."] = "", -- Basic_Training_-_Movement
---      ["Go on top of the flower"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Go on top of the flower."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Go, quick!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Gorkij"] = "", -- A_Classic_Fairytale:journey
       ["Go surf!"] = "Теперь сёрфить!", -- WxW
@@ -792,7 +789,6 @@
 --      ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow
 --      ["Green"] = "", -- 
 --      ["Green Bananas"] = "", -- A_Space_Adventure:fruit01
---      ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Green double rings also give you a new flying saucer."] = "", -- A_Space_Adventure:ice02
 --      ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01
 --      ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01
@@ -802,11 +798,8 @@
 --      ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Greetings from the Navy, %s (%s), for being a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["Greetings, %s!"] = "", -- A_Classic_Fairytale:dragon
---      ["Greg"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
-      ["Grenade Group"] = "Группа Гренадеров", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard
 --      ["Grenades explode after 1 to 5 seconds (you decide)."] = "", -- Basic_Training_-_Grenade
 --      ["Grenades with high bounciness bounce a lot and behave chaotic."] = "", -- Basic_Training_-_Grenade
---      ["Grenade Team"] = "", -- Basic_Training_-_Grenade
       ["Grenade Training"] = "Тренировка с Гранатой", -- Basic_Training_-_Grenade
       ["Grenadiers"] = "Гренадеры", -- Basic_Training_-_Grenade
       ["Grenadier"] = "Гренадер", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard
@@ -846,7 +839,6 @@
 --      ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion
 --      ["Health Modification Mode"] = "", -- HedgeEditor
 --      ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor
-      ["Heartful"] = "Сердечный", -- Challenge_-_Speed_Shoppa_-_Hedgelove
 --      ["Heavenly Defense"] = "", -- Tentacle_Terror
 --      ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united
       ["Heavy"] = "Тяжёлый",
@@ -859,6 +851,7 @@
 --      ["Hedgehog Projectile"] = "", -- Continental_supplies
 --      ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies
 --      ["Hedgehogs can not be deleted."] = "", -- HedgeEditor
+--      ["Hedgehogs left: %d"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Hedgehogs will be revived after their death."] = "", -- Mutant
 --      ["Hedgehogs will start in the first waypoint."] = "", -- Racer
 --      ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab
@@ -874,7 +867,6 @@
 --      ["Help Enabled"] = "", -- HedgeEditor
 --      ["Helpers: Each team starts with %d helper points"] = "", -- Battalion
 --      ["Helpers: Hogs will get 1 out of 2 helpers randomly each turn"] = "", -- Battalion
---      ["Help Hog Solo to find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Help me, Leaks!"] = "", -- A_Classic_Fairytale:journey
 --      ["Help me, please!!!"] = "", -- A_Classic_Fairytale:journey
 --      ["Help me, please!"] = "", -- A_Classic_Fairytale:journey
@@ -889,20 +881,20 @@
 --      ["Here you will find the current mission instructions."] = "", -- Basic_Training_-_Movement
 --      ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Heroic Wind"] = "", -- Continental_supplies
-      ["Hero Team"] = "Герои", -- User_Mission_-_The_Great_Escape
 --      ["He's so brave..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["He was the lab assistant of Dr. Goodhogan, the inventor of the anti-gravity device."] = "", -- A_Space_Adventure:moon02
 --      ["He won't be selling us out anymore!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey, don't forget us! We still need to climb up!"] = "", -- A_Classic_Fairytale:family
 --      ["Hey, guys!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey guys!"] = "", -- A_Classic_Fairytale:united
---      ["Hey, Hog Solo! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey! I was supposed to collect it!"] = "", -- A_Space_Adventure:fruit02
+--      ["Hey, %s! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey, %s! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey
 --      ["Hidden"] = "", -- portal
 --      ["High Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["High Jump: [Backspace]"] = "", -- Basic_Training_-_Movement
+--      ["High Jump: Tap the [Curvy Arrow] shortly"] = "", -- Basic_Training_-_Movement
 --      ["--- Highland ---"] = "", -- Battalion
 --      ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander
 --      ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion
@@ -913,20 +905,24 @@
 --      ["Hill Guard"] = "", -- Bazooka_Battlefield
 --      ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01
 --      ["--- Hint ---"] = "", -- Battalion
-      ["Hint: Double Jump - Press [Backspace] twice"] = "Подсказка: Двойной прыжок - нажмите [Backspace] дважды", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
 --      ["Hint: Drilling holes should solve everything."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: Hold down [M] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: If this mission panel disappears, you can|see it again by hitting the Pause or Quit key."] = "", -- Basic_Training_-_Movement
 --      ["Hint: It might be a good idea to place a girder before starting to drill. Just saying."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: It might be easier if you vary the angle only slightly."] = "", -- Basic_Training_-_Bazooka
+--      ["Hint: Just select the parachute, it opens automatically when you fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion
       ["Hint: Launch the bazooka horizontally at full power."] = "Подсказка: Выстрелите из базуки горизонтально на полной мощности.", -- Basic_Training_-_Bazooka
---      ["Hint: Press [Esc] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Pause the game to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Select the blow torch, aim and press [Fire]. Press [Fire] again to stop."] = "", -- A_Classic_Fairytale:journey
       ["Hint: Select the low gravity and press [Fire]."] = "Подсказка: Активируйте низкую гравитацию и нажмите [Огонь].", -- A_Classic_Fairytale:journey
+--      ["Hint: Select the rope, [Up] or [Down] to aim, [Attack] to fire, directional keys to move."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Select the Shoryuken and hit [Attack].|P.S.: You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: %s needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family
 --      ["Hint: The rope only bends around objects.|When it doesn't hit anything, it's always straight."] = "", -- Basic_Training_-_Rope
 --      ["Hint: To jump higher, wait a bit before you hit “High Jump” a second time."] = "", -- Basic_Training_-_Movement
+--      ["Hint: To place a girder, select it,|then use [Left] and [Right] to select angle and length,|then choose a location for the girder."] = "", -- A_Classic_Fairytale:shadow
 --      ["Hint: Use the quit key to see the team’s continent."] = "", -- Continental_supplies
 --      ["Hint: When you shorten the rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope
 --      ["Hint: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey
@@ -960,24 +956,11 @@
 --      ["Hogminator"] = "", -- A_Classic_Fairytale:family
 --      ["Hog nueve"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog octo"] = "", -- A_Space_Adventure:fruit03
---      ["Hogonauts"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Hog onze"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog Saturn"] = "", -- A_Space_Adventure:fruit03
 --      ["Hogs in sight!"] = "", -- Continental_supplies
 --      ["Hog Solo and GB"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hog Solo"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01, A_Space_Adventure:moon02
---      ["Hog Solo couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo escaped successfully!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo has to reach the last crates"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo has to refuel his saucer."] = "", -- A_Space_Adventure:moon01
---      ["Hog Solo lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
---      ["Hog Solo wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["- Hogs will be revived"] = "", -- Capture_the_Flag
 --      ["- Hogs will drop the flag when killed"] = "", -- Capture_the_Flag
 --      ["Hog two"] = "", -- A_Space_Adventure:fruit03
@@ -988,11 +971,9 @@
 --      ["Honda"] = "", -- 
 --      ["Honest Lee"] = "", -- A_Classic_Fairytale:enemy
 --      ["Hooks"] = "", -- 
-      ["Hook"] = "Крюк", -- Challenge_-_Speed_Shoppa_-_Ropes
 --      ["Hooray! I actually did it! Hogera is safe!"] = "", -- A_Space_Adventure:final
 --      ["Hooray! I've found it, now I have to get back to Captain Lime!"] = "", -- A_Space_Adventure:fruit02
 --      ["Hooray! You are a champion!"] = "", -- A_Space_Adventure:ice02
-      ["Hooray!"] = "Ура!",
       ["Hopeless case"] = "Безнадежный случай", -- User_Mission_-_RCPlane_Challenge
 --      ["Hop on top of the next flower and advance to the left coast."] = "", -- A_Classic_Fairytale:journey
 --      ["Horns"] = "", -- 
@@ -1005,7 +986,7 @@
 --      ["However, if you fail to do so, she dies a most violent death, just like your friend! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, if you fail to do so, she dies a most violent death! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, my mates don't agree with me on letting you go..."] = "", -- A_Classic_Fairytale:dragon
---      ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
+--      ["However, the army of %s is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
 --      ["How to Rope"] = "", -- Basic_Training_-_Rope
 --      ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen
 --      ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen
@@ -1025,7 +1006,6 @@
 --      ["I can't believe what I'm hearing!"] = "", -- A_Classic_Fairytale:backstab
 --      ["I can't let you go further because …"] = "", -- A_Classic_Fairytale:queen
 --      ["I can't wait any more, I have to save myself!"] = "", -- A_Classic_Fairytale:shadow
---      ["Ice"] = "", -- Basic_Training_-_Movement
 --      ["Ice Jake"] = "", -- A_Space_Adventure:ice01
 --      ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family
 --      ["Icy Girder: [3]"] = "", -- HedgeEditor
@@ -1083,7 +1063,6 @@
 --      ["I just found out that they have captured your princess!"] = "", -- A_Classic_Fairytale:family
 --      ["I just want the strange device you found!"] = "", -- A_Space_Adventure:ice01
 --      ["I just wonder where Ramon and Spiky disappeared..."] = "", -- A_Classic_Fairytale:journey
-      ["Ikeda"] = "Икэда", -- User_Mission_-_Bamboo_Thicket
       ["I know and I'm terribly sorry!"] = "Я знаю и мне ужасно жаль!", -- A_Classic_Fairytale:epil
 --      ["I know, my hero!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know that your resources are low due to the battle but I'll send two of my best hogs to assist you."] = "", -- A_Space_Adventure:fruit02
@@ -1111,6 +1090,7 @@
 --      ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen
       ["I'm not sure about that!"] = "Я не уверен насчёт этого!", -- A_Classic_Fairytale:united
 --      ["IMPORTANT: To see the mission panel again, hold the mission panel key."] = "", -- Basic_Training_-_Movement
+--      ["IMPORTANT: To see the mission panel again, pause the game."] = "", -- Basic_Training_-_Movement
 --      ["Impressive...you are still dry as the corpse of a hawk after a week in the desert..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["%i ms"] = "", -- Gravity
       ["I'm so glad this is finally over!"] = "Я так рад, что это наконец-то закончилось!", -- A_Space_Adventure:final
@@ -1269,7 +1249,6 @@
 --      ["Kill the traitor, %s, or spare his life!"] = "", -- A_Classic_Fairytale:backstab
 --      ["--- King ---"] = "", -- Battalion
 --      ["King"] = "", -- Battalion
-      ["King Customer"] = "Король Покупатель", -- Challenge_-_Speed_Shoppa_-_ShoppaKing
 --      ["--- King Mode ---"] = "", -- Battalion
 --      ["Knight"] = "", -- Battalion
 --      ["Knives"] = "", -- 
@@ -1288,7 +1267,7 @@
 --      ["Launch some bazookas to destroy the targets!"] = "", -- Basic_Training_-_Bazooka
 --      ["Leader"] = "", -- A_Classic_Fairytale:enemy
 --      ["Leaderbot"] = "", -- A_Classic_Fairytale:queen
---      ["Lead the Green Bananas to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
+--      ["Lead your allies to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
 --      ["Leaks A Lot"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Leaks A Lot, depressed for killing his loved one, failed to save the village..."] = "", -- A_Classic_Fairytale:journey
 --      ["Leaks A Lot gave his life for his tribe! He should have survived!"] = "", -- A_Classic_Fairytale:first_blood
@@ -1303,7 +1282,6 @@
 --      ["Left/right: Choose crate contents"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode
---      ["Left Tong"] = "", -- Bazooka_Battlefield
 --      ["Legs"] = "", -- 
 --      ["Less tools, more fun"] = "", -- Battalion
       ["Lestat"] = "Лестат", -- portal
@@ -1332,18 +1310,19 @@
 --      ["Lively Lifeguard"] = "",
 --      ["Lonely Cries"] = "", -- Continental_supplies
 --      ["Lonely Cries: [Rise the water if no hog is in the circle and deal 6 damage to all enemy hogs.]"] = "", -- Continental_supplies
---      ["Lonely Hog"] = "", -- ClimbHome
 --      ["Long Jump: [Enter]"] = "", -- Basic_Training_-_Movement
+--      ["Long Jump: Tap the [Curvy Arrow] button for long"] = "", -- Basic_Training_-_Movement, A_Classic_Fairytale:first_blood
 --      ["Long Live The Queen"] = "", -- A_Classic_Fairytale:queen
 --      ["Look around: [Mouse movement]"] = "", -- Basic_Training_-_Movement
+--      ["Look around: [Tap or swipe on the screen]"] = "", -- Basic_Training_-_Movement
 --      ["Look, boss! There is the target!"] = "", -- A_Space_Adventure:moon01
 --      ["Look, I had no choice!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! There's more of them!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! We're surrounded by cannibals!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Looks like the whole world is falling apart!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Look to the left and do a backwards jump towards the mushroom."] = "", -- A_Classic_Fairytale:first_blood
       ["Loon"] = "Псих", -- The_Specialists
 --      ["Loopy"] = "", -- 
---      ["Lord Evil"] = "", -- Tentacle_Terror
 --      ["Losing Condition: Destroy"] = "", -- HedgeEditor
 --      ["Low Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander
@@ -1363,7 +1342,6 @@
 --      ["Mario"] = "", -- 
 --      ["Mark gears for win/lose conditions"] = "", -- HedgeEditor
 --      ["Mark/unmark gear: [Left Click]"] = "", -- HedgeEditor
---      ["Mark"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
 --      ["- Massive weapon bonus on first turn"] = "", -- Continental_supplies
 --      ["Max Citrus"] = "", -- A_Space_Adventure:fruit01
 --      ["Maybe you should try an easier map next time."] = "", -- Racer
@@ -1378,7 +1356,6 @@
 --      ["Mega kill!"] = "", -- Mutant
 --      ["Meiwes"] = "", -- A_Classic_Fairytale:backstab
 --      ["mikade"] = "", -- 
-      ["milliseconds"] = "миллисекунд", -- SpeedShoppa
 --      ["Mindy"] = "", -- A_Classic_Fairytale:united
 --      ["Mine Deployer"] = "",
 --      ["MINE PLACEMENT MODE"] = "", -- HedgeEditor
@@ -1397,12 +1374,12 @@
 --      ["Minion"] = "", -- A_Space_Adventure:moon01
 --      ["Minions"] = "", -- A_Space_Adventure:moon01
 --      ["Mission failed!"] = "", -- Big_Armory
-      ["MISSION FAILED"] = "МИССИЯ ПРОВАЛЕНА", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Mission failure in %d s"] = "", -- Big_Armory
+--      ["Mission"] = "", -- HedgeEditor
       ["Mission lost!"] = "Миссия провалена!", -- Basic_Training_-_Grenade
 --      ["Mission Panel"] = "", -- Basic_Training_-_Movement
 --      ["Mission panel: [M]"] = "", -- Basic_Training_-_Movement
-      ["MISSION SUCCESSFUL"] = "МИССИЯ УСПЕШНА", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+--      ["Mission succeeded!"] = "", -- portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, SimpleMission, HedgeEditor
       ["Mission won!"] = "Миссия успешна!", -- Basic_Training_-_Grenade
 --      ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02
 --      ["Mixed %d"] = "", -- WxW
@@ -1418,7 +1395,6 @@
 --      ["Monster kill!"] = "", -- Mutant
 --      ["Monsters"] = "", -- 
 --      ["Mooney"] = "", -- 
---      ["More Natives"] = "", -- A_Classic_Fairytale:epil
 --      ["Morris"] = "", -- 
 --      ["Most mines are not active."] = "", -- A_Space_Adventure:desert02
 --      ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01
@@ -1438,13 +1414,11 @@
       ["Nade Boy"] = "Снайперок", -- Basic_Training_-_Grenade
 --      ["Nah, probably everyone was just stupid."] = "", -- A_Space_Adventure:final
 --      ["Name"] = "", -- A_Classic_Fairytale:queen
-      ["Nameless Heroes"] = "Герои Без Имен",
 --      ["Nancy Screw"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:queen
 --      ["Napalm"] = "", -- Construction_Mode
 --      ["Napalm Rocket"] = "", -- Continental_supplies
 --      ["Napalm rocket: [Fire a bomb with napalm!]"] = "", -- Continental_supplies
 --      ["Naranja Jed"] = "", -- A_Space_Adventure:fruit01
---      ["Natives"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
       ["Naughty Ninja"] = "Озорной ниндзя", -- User_Mission_-_Dangerous_Ducklings
 --      ["Near a PAotH base on the moon ..."] = "", -- A_Space_Adventure:moon01
 --      ["Near Secret Base 17 of PAotH in the rural Hogland ..."] = "", -- A_Space_Adventure:cosmos
@@ -1539,11 +1513,8 @@
 --      ["Oh, my!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oh, my! I forgot something!"] = "", -- A_Classic_Fairytale:queen
 --      ["Oh, my! This is even more entertaining than I've expected!"] = "", -- A_Classic_Fairytale:backstab
-      ["Oh no! Just try again!"] = "О, нет! Попробуй еще раз!", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Oh no, not %s!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
---      ["Oh no, the Green Bananas have betrayed Hog Solo and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
-      ["Oh no! Time's up! Just try again."] = "О, нет! Время вышло! Попробуй еще раз.", --Bazooka, Shotgun, SniperRifle
-      ["Oh no! You failed! Just try again."] = "О, нет! Ты проиграл! Попробуй еще раз.", -- Basic_Training_-_Cluster_Bomb
+--      ["Oh no, the companions have betrayed %s and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
 --      ["Oh no! You have died. Try again!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Oh! Please spare me. You can take all my treasures!"] = "", -- A_Space_Adventure:ice01
 --      ["Oh, silly me! I forgot that I'm the shaman."] = "", -- A_Classic_Fairytale:backstab
@@ -1565,9 +1536,9 @@
 --      ["One shall not judge one by one's appearance!"] = "", -- A_Classic_Fairytale:epil
 --      ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oneye"] = "", -- portal
---      ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant
 --      ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant
+--      ["Only %s can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard
 --      ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01
@@ -1579,6 +1550,7 @@
 --      ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01
 --      ["Oops! You have selected the wrong hedgehog! Just try again."] = "", -- Basic_Training_-_Movement
 --      ["Open ammo menu: [Right click]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
+--      ["Open ammo menu: Tap the [Suitcase]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
 --      ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood
       ["Opposing Team: "] = "Команда Соперника: ",
 --      ["Orange"] = "", -- 
@@ -1598,16 +1570,15 @@
 --      ["PAotH has sent explosives but unfortunately the trigger mechanism seems to be faulty!"] = "", -- A_Space_Adventure:cosmos
       ["Parachute"] = "Парашют", -- Continental_supplies
 --      ["Patches"] = "", -- 
-      ["Pathetic Resistance"] = "Жалкое Сопротивление", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02
 --      ["Pause: [P]"] = "", -- Basic_Training_-_Movement
+--      ["Pause: Tap the [Pause] button"] = "", -- Basic_Training_-_Movement
 --      ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW
 --      ["Penguin Roar"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hog’s health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Perfect! Now try to get the next crate without hurting yourself!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh
-      ["Per-Hog Ammo"] = "У каждого ёжика свое оружие",
 --      ["Personal best: %.3f seconds"] = "", -- A_Space_Adventure:ice02
 --      ["Per team weapons"] = "", -- Continental_supplies
 --      ["Pfew! That was close!"] = "", -- A_Classic_Fairytale:shadow
@@ -1615,7 +1586,6 @@
 --      ["Physicist"] = "", -- HedgeEditor
       ["Piano Strike"] = "Фортепьяновый удар", -- Construction_Mode
 --      ["Pikachu"] = "", -- 
---      ["Pincer Knights"] = "", -- Bazooka_Battlefield
 --      ["Pings left: %d"] = "", -- Space_Invasion
 --      ["Pink"] = "", -- 
 --      ["Pirates"] = "", -- 
@@ -1666,8 +1636,6 @@
 --      ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion
 --      ["--- Points ---"] = "", -- Battalion
 --      ["--- Points Mode ---"] = "", -- Battalion
---      ["point(s)"] = "", -- TargetPractice, Mutant
-      ["points"] = "очки", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
 --      ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02
 --      ["Poisonous, deals no damage."] = "", -- Continental_supplies
       ["Poison"] = "Яд",
@@ -1687,37 +1655,37 @@
 --      ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to fight"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos
-      ["Prepare yourself"] = "Готовься",
+--      ["Prepare yourself, %s!"] = "", -- The_Specialists
 --      ["Press [Attack] (space bar by default) to start,|repeadedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] (space bar by default) to start,|repeatedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] to begin."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Attack] to confirm."] = "", -- Continental_supplies
 --      ["Press [Attack] to select this continent!"] = "", -- Continental_supplies
 --      ["Press [Left] and [Right] to change the difficulty."] = "", -- A_Classic_Fairytale:first_blood
---      ["Press [Left] or [Right] to move around, [Enter] to jump"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Press [Left] or [Right] to move around, [Long Jump] to jump forwards."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW
 --      ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW
+--      ["Press [M] to see the mission texts"] = "", -- Basic_Training_-_Movement
 --      ["Press [Precise] to skip intro"] = "",
 --      ["Press [Up] and [Down] to move between menu items.|Press [Attack], [Left], or [Right] to toggle."] = "", -- WxW
       ["Prestigious Pilot"] = "Престижный Пилот", -- User_Mission_-_RCPlane_Challenge
 --      ["Princess"] = "", -- A_Classic_Fairytale:family, A_Classic_Fairytale:journey
 --      ["Princess Peach"] = "", -- 
-      ["Private Nolak"] = "Рядовой Нолак", -- Target_Practice_-_Cluster_Bomb
 --      ["Problems, dude? Chillax!"] = "", -- A_Classic_Fairytale:epil
       ["Professional pilot"] = "Профессиональный пилот", -- User_Mission_-_RCPlane_Challenge
       ["Professional stunt pilot"] = "Профессиональный пилот-трюкач", -- User_Mission_-_RCPlane_Challenge
 --      ["Professor"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
 --      ["Professor Hogevil, then known as James Hogus, worked for PAotH back in my time."] = "", -- A_Space_Adventure:moon02
+--      ["Professor's Team"] = "", -- A_Space_Adventure:death01
 --      ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
---      ["Pro Killers"] = "", -- Big_Armory
 --      ["Protect the King: When the king dies, so does the team"] = "", -- Battalion
 --      ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Protect yourselves!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Purple"] = "", -- 
 --      ["Pyromancer"] = "", -- Battalion
       ["Pyro"] = "Пироман", -- The_Specialists
 --      ["Quit: [Esc]"] = "", -- Basic_Training_-_Movement
 --      ["Race complexity limit reached"] = "", -- Racer, TechRacer
+--      ["Race failed!"] = "", -- A_Space_Adventure:moon02
 --      ["Racer"] = "", -- Racer
 --      ["Racer tool"] = "", -- Racer
       ["Race"] = "Гонка", -- TrophyRace
@@ -1753,23 +1721,19 @@
 --      ["Replenishment: Weapons are restocked on turn start of a new hog"] = "", -- Highlander
 --      ["Repositioning Mode"] = "", -- HedgeEditor
 --      ["REPOSITIONING MODE"] = "", -- HedgeEditor
-      ["rescues"] = "спасено", -- User_Mission_-_That_Sinking_Feeling
 --      ["Rescue the imprisoned PAotH team and get the fuel!"] = "", -- A_Space_Adventure:moon01
 --      ["Respawner: Resurrects dead hogs."] = "", -- Construction_Mode
       ["Respawner"] = "Воскреситель", -- Construction_Mode
 --      ["Resurrector"] = "", -- Construction_Mode
 --      ["Retract/Extend rope: [Up]/[Down]"] = "", -- Basic_Training_-_Rope
 --      ["- Return the enemy flag to your base to score"] = "", -- Capture_the_Flag
-      [" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = " - Доставьте вражеский флаг на вашу базу для получения очков | - Выигрывает команда с 3мя захватами флага | - Вы получаете очки только когда ваш флаг находится на базе | - Убитые/Утонувшие ёжики теряют флаг | - Брошенные флаги могут быть возвращены или захвачены повторно | - Убитые ёжики воскресают",
 --      ["Return to Leaks A Lot!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Return to the mission menu by pressing the \"Go back\" button."] = "", -- A_Space_Adventure:cosmos
 --      ["Return to the Surface"] = "", -- A_Space_Adventure:fruit02
 --      ["Return to the training menu by pressing the “Go back” button."] = "", -- Basic_Training_-_Movement
---      ["Rhombus"] = "", -- Basic_Training_-_Movement
       ["Rider"] = "Адский Всадник", -- portal
 --      ["Rifleman"] = "", -- Battalion
 --      ["Righteous Beard"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:queen, A_Classic_Fairytale:united
---      ["Right Tong"] = "", -- Bazooka_Battlefield
 --      ["Ripe"] = "", -- 
 --      ["Rise the water if nobody else is in the circle and deal 6 damage to all enemy hogs."] = "", -- Continental_supplies
 --      ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01
@@ -1778,8 +1742,8 @@
 --      ["Roof"] = "", -- WxW
 --      ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Rope Master"] = "", -- Basic_Training_-_Rope
-      ["Roper"] = "Верёвочник", -- SpeedShoppa
       ["Ropes and Crates"] = "Верёвки и Ящики", -- Challenge_-_Speed_Shoppa_-_Ropes
+--      ["Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
       ["Rope Team"] = "Верёвочники", -- Basic_Training_-_Rope
       ["Rope Training"] = "Тренировка с Верёвкой", -- Basic_Training_-_Rope
 --      ["Rope Weapons"] = "", -- Basic_Training_-_Rope
@@ -1793,7 +1757,6 @@
 --      ["Round limit:"] = "", -- TechRacer
 --      ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer
       ["Round's slowest lap: %.3fs by %s"] = "Самый медленный круг: %s за %.3fs", -- TrophyRace
---      ["Rounds until Sudden Death: %d"] = "", -- Battalion
 --      ["RS1"] = "", -- A_Space_Adventure:fruit03
 --      ["RS2"] = "", -- A_Space_Adventure:fruit03
 --      ["Rubber"] = "", -- Construction_Mode, HedgeEditor
@@ -1819,10 +1782,17 @@
 --      ["Salvation was one step closer now..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Sam"] = "", -- A_Space_Adventure:cosmos
 --      ["Sandals?! I thought you left your ring!"] = "", -- A_Classic_Fairytale:queen
+--      ["%s and GB"] = "", -- A_Space_Adventure:fruit02
 --      ["%s and %s enter the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sandstorm"] = "", -- A_Space_Adventure:desert01
 --      ["Sandy"] = "", -- A_Space_Adventure:desert01
-      ["Save as many hapless hogs as possible!"] = "Спасите как можно больше несчастных ёжиков!",
+--      ["%s arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
+--      ["Save as many hogs as possible!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey
 --      ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow
 --      ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor
@@ -1834,9 +1804,9 @@
 --      ["Scallywag"] = "", -- 
 --      ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab
 --      ["Scenario"] = "", -- Big_Armory, portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape
---      ["Scenario failed!"] = "", -- SimpleMission
 --      ["Scientist"] = "", -- Battalion
 --      ["%s climbed home in %d seconds!"] = "", -- ClimbHome
+--      ["%s (contd.)"] = "", -- A_Classic_Fairytale:epil
 --      ["Score: %d"] = "", -- Space_Invasion
 --      ["Score goal: %d"] = "", -- Control
 --      ["Score graph"] = "", -- Mutant, Space_Invasion
@@ -1846,6 +1816,7 @@
 --      ["Scores"] = "", -- Mutant
 --      ["Scores:"] = "", -- Mutant
 --      ["Scoring: "] = "", -- Mutant
+--      ["%s couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
 --      ["Script parameter examples:"] = "", -- Gravity
 --      ["%s (+%d)"] = "", -- Battalion
 --      ["%s: %d"] = "", -- Capture_the_Flag, Control
@@ -1858,10 +1829,9 @@
 --      ["%s died … and lives again!"] = "", -- Construction_Mode
 --      ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome
 --      ["%s, %d sec"] = "", -- Continental_supplies
---      ["Search for the device with the help of the other hedgehogs "] = "", -- A_Space_Adventure:fruit02
+--      ["Search for the device with the help of the other hedgehogs."] = "", -- A_Space_Adventure:fruit02
 --      ["Searching in the dust"] = "", -- A_Space_Adventure:desert01
 --      ["Searching the stars!"] = "", -- A_Space_Adventure:cosmos
---      ["seconds"] = "", -- ClimbHome
       ["Seduction"] = "Соблазнение", -- Continental_supplies
 --      ["Seems like every time you take a \"walk\", the enemy finds us!"] = "", -- A_Classic_Fairytale:backstab
 --      ["See that crate farther on the right?"] = "", -- A_Classic_Fairytale:first_blood
@@ -1888,6 +1858,7 @@
 --      ["Select your continent with [Up]/[Down] or by selecting a representative weapon."] = "", -- Continental_supplies
 --      ["%s enters the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sergey"] = "", -- 
+--      ["%s escaped successfully!"] = "", -- A_Space_Adventure:fruit01
 --      ["Set bounciness: [Left Shift] + [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set detonation timer: [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set Health: [Left Click]"] = "", -- HedgeEditor
@@ -1911,10 +1882,12 @@
 --      ["%s has been killed before taking enough damage first."] = "", -- SimpleMission
 --      ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has been rescued from death"] = "", -- Construction_Mode
+--      ["%s has dropped the flag!"] = "", -- CTF_Blizzard
 --      ["%s has fallen victim to gravity."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has mutated! +2 points"] = "", -- Mutant
 --      ["%s has passed the best height of %s!"] = "", -- ClimbHome
 --      ["%s has scored!"] = "", -- Capture_the_Flag
+--      ["%s has to refuel the saucer."] = "", -- A_Space_Adventure:moon01
 --      ["%s hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil
 --      ["sheepluva"] = "", -- 
@@ -1931,8 +1904,6 @@
 --      ["Shinobi"] = "", -- 
 --      ["%s hit the ground."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Shoppa Love"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
-      ["Shoppa Union"] = "Союз Шоппы", -- Challenge_-_Speed_Shoppa_-_Ropes, Challenge_-_Speed_Shoppa_-_ShoppaKing
-      ["Shoppers"] = "Шопперы", -- SpeedShoppa
       ["Shotgun"] = "Дробовик", -- Continental_supplies
 --      ["Sigh."] = "", -- A_Classic_Fairytale:epil
       ["Silly"] = "Глупый",
@@ -1945,11 +1916,11 @@
 --      ["%s is now as poor as a church mouse"] = "", -- Construction_Mode
 --      ["%s is now a zombie hedgehog"] = "", -- Construction_Mode
 --      ["%s is suddenly low on ammo"] = "", -- Construction_Mode
---      ["Skip your turn to try again."] = "", -- Basic_Training_-_Rope
 --      ["Skulls"] = "", -- Bazooka_Battlefield
 --      ["Slimer"] = "", -- 
 --      ["Slippery"] = "", -- A_Classic_Fairytale:journey
 --      ["%s lost all the weapons"] = "", -- Construction_Mode
+--      ["%s lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
 --      ["Slot %d: %s"] = "", -- Frenzy
 --      ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy
 --      ["Slowpoke"] = "", -- 
@@ -1963,6 +1934,7 @@
 --      ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smugglers"] = "", -- A_Space_Adventure:desert01
+--      ["%s must collect the final crates."] = "", -- A_Space_Adventure:fruit02
 --      ["%s must skip this turn for rule violation."] = "", -- WxW
 --      ["Sneaks"] = "", -- Bazooka_Battlefield
 --      ["%s never got the ninja diploma."] = "", -- ClimbHome
@@ -1970,11 +1942,9 @@
 --      ["Sniper! +8 points!"] = "", -- Space_Invasion
       ["Sniper Rifle"] = "Снайперская винтовка", -- Continental_supplies
       ["Sniper Training"] = "Тренировка снайпера",
-      ["Sniperz"] = "Снайперы",
       ["Sniper"] = "Снайпер", -- The_Specialists
 --      ["So, as promised I have brought you where I think that the device you are looking for is hidden."] = "", -- A_Space_Adventure:fruit02
 --      ["So far, you had infinite ropes, but in the|real world, ropes are usually limited."] = "", -- Basic_Training_-_Rope
---      ["So Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["So, I believe that it's a good place to start."] = "", -- A_Space_Adventure:desert01
 --      ["So, I kindly ask for your help."] = "", -- A_Space_Adventure:fruit01
@@ -1984,11 +1954,12 @@
 --      ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03
 --      ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen
 --      ["Some weapons can be dropped from the rope."] = "", -- Basic_Training_-_Rope
---      ["Somewhere else on the planet of fruits, Captain Lime helps Hog Solo"] = "", -- A_Space_Adventure:fruit02
---      ["Somewhere else on the planet of fruits Hog Solo gets closer to the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, Captain Lime helps %s"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, %s gets closer to the device"] = "", -- A_Space_Adventure:fruit02
 --      ["Somewhere on the Planet of Fruits a terrible war is about to begin ..."] = "", -- A_Space_Adventure:fruit01
 --      ["Somewhere on the uninhabitable Death Planet ..."] = "", -- A_Space_Adventure:death01
 --      ["So, now I got the last part and I have your friends captured."] = "", -- A_Space_Adventure:death01
+--      ["So, %s, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So the princess was never heard of again ..."] = "", -- A_Classic_Fairytale:family
 --      ["So, uhmm, how did you manage to teleport them so far?"] = "", -- A_Classic_Fairytale:epil
 --      ["Sour"] = "", -- 
@@ -2089,8 +2060,6 @@
       ["Structure Placement Mode"] = "Режим Размещения Сооружений", -- Construction_Mode
 --      ["Structure Placer"] = "", -- Construction_Mode
 --      ["Stupid, stupid Hogerians!"] = "", -- A_Space_Adventure:final
---      ["Subject 1"] = "", -- portal
---      ["Subjects"] = "", -- portal
 --      ["Subtract %d"] = "", -- HedgeEditor
 --      ["--- Sudden Death ---"] = "", -- Battalion
 --      ["Summer Squash"] = "", -- A_Space_Adventure:fruit01
@@ -2107,7 +2076,7 @@
 --      ["Surfer! +15 points!"] = "", -- Space_Invasion
 --      ["Surfer!"] = "", -- WxW
 --      ["Surprise supplies: Get 1-3 random weapons each turn."] = "", -- Continental_supplies
---      ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:shadow
+--      ["Survive!"] = "", -- A_Classic_Fairytale:shadow
 --      ["%s violated the “All But Last” rule and will be penalized."] = "", -- WxW
 --      ["%s violated the “Kill The Leader” rule and will be penalized."] = "", -- WxW
 --      ["Swap place with a random enemy in the circle."] = "", -- Continental_supplies
@@ -2126,6 +2095,7 @@
 --      ["%s! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
 --      ["Swing, Leaks A Lot, on the wings of the wind!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Swing: [Left]/[Right]"] = "", -- Basic_Training_-_Rope
+--      ["%s wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome
 --      ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer
 --      ["switch"] = "", -- Continental_supplies
@@ -2139,6 +2109,7 @@
 --      ["Switch Hog"] = "", -- Construction_Mode
 --      ["Switch: Select weapon special"] = "", -- Continental_supplies
 --      ["Switch: Toggle crate radar"] = "", -- WxW
+--      ["%s won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Swords"] = "", -- Bazooka_Battlefield
 --      ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon
 --      ["%s, you may choose the rules."] = "", -- WxW
@@ -2147,6 +2118,8 @@
 --      ["Tails"] = "", -- 
 --      ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Tall Potato"] = "", -- A_Space_Adventure:fruit01
+--      ["Tap [Pause] to see the mission texts"] = "", -- Basic_Training_-_Movement
+--      ["Tap the “rotating arrow” button on the left|until you have selected Cappy, the hedgehog with the cap!"] = "", -- Basic_Training_-_Movement
 --      ["Target"] = "", -- HedgeEditor
 --      ["Target Placement Mode"] = "", -- Construction_Mode
 --      ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor
@@ -2162,15 +2135,18 @@
 --      ["Tatters"] = "", -- 
 --      ["Team %d"] = "", -- SimpleMission
       ["Team %d: "] = "Команда %d: ",
+--      ["Team highscore: %d"] = "", -- Utils
 --      ["Team Identity Mode"] = "", -- HedgeEditor
 --      ["TEAM IDENTITY MODE"] = "", -- HedgeEditor
-      ["Team of Hearts"] = "Команда сердец", -- Challenge_-_Speed_Shoppa_-_Hedgelove
+--      ["Team lowscore: %d"] = "", -- Utils
 --      ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion
+--      ["Team's best time: %.3fs"] = "", -- Utils
 --      ["Team Scores:"] = "", -- Control
 --      ["Team scores:"] = "", -- Space_Invasion
+--      ["Team's longest time: %.3fs"] = "", -- Utils
+--      ["Team's top accuracy: %d%"] = "", -- Utils
 --      ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2
 --      ["Teamwork"] = "", -- User_Mission_-_Teamwork
-      ["Team Zook"] = "Команда Зуки", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
 --      ["TechRacer"] = "", -- TechRacer
       ["Teleportation Mode"] = "Режим Телепортации", -- Construction_Mode
 --      ["Teleportation Node: Allows teleportation|    between other nodes."] = "", -- Construction_Mode
@@ -2261,11 +2237,12 @@
 --      ["The forgotten continent"] = "", -- Continental_supplies
 --      ["The giant umbrella from the last crate should help break the fall."] = "", -- A_Classic_Fairytale:first_blood
       ["The Great Escape"] = "Великий Побег", -- User_Mission_-_The_Great_Escape
---      ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01
+--      ["- The green target must survive"] = "", -- HedgeEditor
+--      ["- The green targets must survive"] = "", -- HedgeEditor
 --      ["The guardian"] = "", -- A_Classic_Fairytale:shadow
 --      ["The hardships of the war turned %s (%s) into a killing machine: %d invaders destroyed in one round!"] = "", -- Space_Invasion
+--      ["The health of your current hedgehog|is shown at the top right corner."] = "", -- Basic_Training_-_Movement
 --      ["The hedgehog with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant
-      ["The Hogies"] = "Боевые Ежи", -- Target_Practice_-_Cluster_Bomb
 --      ["The Hospital"] = "", -- 
 --      ["The Individualist"] = "", -- A_Classic_Fairytale:shadow
 --      ["Their buildings were very primitive back then, even for an uncivilised island."] = "", -- A_Classic_Fairytale:united
@@ -2283,7 +2260,6 @@
       ["The Mutant has super-weapons and a lot of health."] = "У Мутанта есть супер-оружие и много здоровья.", -- Mutant
 --      ["The Mutant loses health quickly, but gains health by killing."] = "", -- Mutant
       ["The Mutant loses health quickly if he doesn't keep scoring kills."] = "Мутант быстро теряет здоровье, если не зарабатывает очки за убийства.", -- Mutant
-      ["The Nameless One"] = "Дед Мазай",
 --      ["The Navy greets %s for managing to get in a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["The next 4 times you play the \"The last encounter\" mission you'll get 20 more hit points and a laser sight."] = "", -- A_Space_Adventure:death02
 --      ["The next crate is an utility crate."] = "", -- Basic_Training_-_Movement
@@ -2297,6 +2273,7 @@
 --      ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil
 --      ["The oppression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
 --      ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
+--      ["The other hog has died, he should have survived!"] = "", -- A_Space_Adventure:moon02
 --      ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Police"] = "", -- 
 --      ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -2321,7 +2298,7 @@
 --      ["The Showdown"] = "", -- A_Classic_Fairytale:shadow
 --      ["The Slaughter"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:first_blood
 --      ["The Society of Perfectionists greets %s (%s): No misses and %d hits in its best round."] = "", -- Space_Invasion
-      ["THE SPECIALISTS"] = "СПЕЦИАЛИСТЫ",
+--      ["The Specialists: Each hedgehog starts with its own weapon set"] = "", -- The_Specialists
 --      ["The spinning arrows above your hedgehog show|which hedgehog is selected right now."] = "", -- Basic_Training_-_Movement
 --      ["The spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
@@ -2369,7 +2346,6 @@
 --      ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["This also increases the effectiveness of Medicine."] = "", -- Continental_supplies
 --      ["This game wasn’t really exciting."] = "", -- Space_Invasion
---      ["This Hog Solo is so naive! When he returns I'll shoot him and keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This is a new personal best, congratulations!"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert02, A_Space_Adventure:fruit03
 --      ["This is a new personal best time, congratulations!"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["This is Cappy."] = "", -- Basic_Training_-_Movement
@@ -2387,6 +2363,7 @@
       ["This rain is really something..."] = "Этот дождь нескончаем...",
 --      ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome
 --      ["This seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01
+--      ["This %s is so naive! I'm going to shoot this fool so I can keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
       ["This was an awesome performance! But this challenge can be finished with even just one RC plane. Can you figure out how?"] = "Потрясающее исполнение! Но это испытание можно пройти всего с одним самолётом. Знаете как?", -- User_Mission_-_RCPlane_Challenge
 --      ["This will be fun!"] = "", -- A_Classic_Fairytale:enemy
 --      ["This will be useful when I need a new platform or if I want to rise."] = "", -- portal
@@ -2427,11 +2404,11 @@
 --      ["To begin with the training, hit the attack key!"] = "", -- Basic_Training_-_Movement
 --      ["To begin with the training, select the bazooka from the ammo menu!"] = "", -- Basic_Training_-_Bazooka
 --      ["To begin with the training, select the grenade from the ammo menu!"] = "", -- Basic_Training_-_Grenade
+--      ["To begin with the training, tap the attack button!"] = "", -- Basic_Training_-_Movement
 --      ["To finish hedgehog selection, just do anything|with him, like walking."] = "", -- Basic_Training_-_Movement
 --      ["To get over the next obstacles, keep some distance from the wall before you back jump."] = "", -- Basic_Training_-_Movement
 --      ["To get over the water, you have to do multiple|rope shots and swings."] = "", -- Basic_Training_-_Rope
 --      ["Toggle Editing Weapons and Tools: [Precise]+[2]"] = "", -- HedgeEditor
---      ["Toggle Gear Information: [Precise]+[3]"] = "", -- HedgeEditor
 --      ["Toggle Help: [Precise]+[1]"] = "", -- HedgeEditor
 --      ["Toggle Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Toggle Shield: [Long jump]"] = "", -- Space_Invasion
@@ -2441,14 +2418,14 @@
 --      ["Too bad! Then you should really leave!"] = "", -- A_Space_Adventure:fruit01
 --      ["Too slow! Try again ..."] = "", -- A_Space_Adventure:moon02
       ["Top-class elite pilot"] = "Элитный пилот топ класса", -- User_Mission_-_RCPlane_Challenge
---      ["To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"] = "", -- A_Classic_Fairytale:shadow
 --      ["To reach higher ground, walk to a ledge, look to the left, then do a back jump."] = "", -- Basic_Training_-_Movement
 --      ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey
 --      ["To the caves..."] = "", -- A_Classic_Fairytale:united
 --      ["Touch all waypoints as fast as you can!"] = "", -- Racer
---      ["To win the game, Hog Solo has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
+--      ["- Touch the sparkles near your base to teleport"] = "", -- CTF_Blizzard
+--      ["To win the game, %s has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
 --      ["To win the game you had to collect the 2 crates with no specific order."] = "", -- A_Space_Adventure:desert01
---      ["To win the game you have to eliminate all your enemies."] = "", -- A_Space_Adventure:death01
+--      ["To win the game you have to eliminate Professor Hogevil."] = "", -- A_Space_Adventure:death01
 --      ["To win the game you have to find the right crate."] = "", -- A_Space_Adventure:desert01
 --      ["To win the game you have to go next to Thanta."] = "", -- A_Space_Adventure:ice01
 --      ["To win the game you have to go to the surface."] = "", -- A_Space_Adventure:desert02
@@ -2456,13 +2433,10 @@
 --      ["To win the game you have to stand next to Thanta."] = "", -- A_Space_Adventure:ice01
       ["Toxic Team"] = "Токсичные", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Track completed!"] = "", -- Racer, TechRacer
-      ["Trainee"] = "Ученик", -- TargetPractice
 --      ["Training"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Training complete!"] = "", -- Basic_Training_-_Flying_Saucer
-      ["Training Team"] = "Обучающиеся", -- TargetPractice
 --      ["Traitors"] = "", -- A_Classic_Fairytale:epil
 --      ["Traitors don't get to shout around here!"] = "", -- A_Classic_Fairytale:epil
---      ["Trapped"] = "", -- Basic_Training_-_Movement
 --      ["Trapper"] = "", -- HedgeEditor
 --      ["Travel carefully as your fuel is limited"] = "", -- A_Space_Adventure:cosmos
 --      ["Travel to all the neighbor planets and collect all the pieces"] = "", -- A_Space_Adventure:cosmos
@@ -2479,7 +2453,6 @@
 --      ["Try to land softly, as you can still take fall damage!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Try to protect the chief! You won't lose if he dies, but it is advised that he survives."] = "", -- A_Classic_Fairytale:united
 --      ["Try to reach and destroy the next target quickly."] = "", -- Basic_Training_-_Rope
---      ["T_T"] = "",
 --      ["Tumbler"] = "", -- Tumbler
 --      ["Turn around: [Left Shift] + [Left]/[Right]"] = "", -- Basic_Training_-_Movement
 --      ["Turning Around"] = "", -- Basic_Training_-_Movement
@@ -2498,7 +2471,6 @@
 --      ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy
 --      ["Ukemi"] = "", -- 
 --      ["Ultra kill!"] = "", -- Mutant
---      ["Ultrasoldier"] = "", -- Big_Armory
 --      ["unC0Rr"] = "", -- 
 --      ["Under Construction"] = "", -- A_Classic_Fairytale:shadow
 --      ["Under normal circumstances we could easily defeat them but we have kindly sent most of our men to the Kingdom of Sand to help with the annual dusting of the king's palace."] = "", -- A_Space_Adventure:fruit01
@@ -2523,7 +2495,6 @@
       ["Unit"] = "Юнит", -- User_Mission_-_Newton_and_the_Hammock
 --      ["Unlike bazookas, grenades are not influenced by wind."] = "", -- Basic_Training_-_Grenade
 --      ["Unlimited Attacks: Attacks don't end your turn"] = "", -- User_Mission_-_Diver, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree
-      ["Unlimited Attacks"] = "Бесконечные атаки",
       ["Unlucky Sods"] = "Неудачники", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Unstoppable!"] = "",
       ["Unsuspecting Louts"] = "Доверчивые хамы", -- User_Mission_-_Rope_Knock_Challenge
@@ -2538,13 +2509,14 @@
 --      ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood
       ["User Challenge"] = "Одиночная Миссия",
 --      ["!"] = "", -- User_Mission_-_Dangerous_Ducklings
+--      ["User Mission"] = "", -- HedgeEditor
 --      ["Use the attack key twice to change the flying saucer while being in air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the attack key twice to change the flying saucer while floating in mid-air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the bazooka and the flying saucer to get the freezer."] = "", -- A_Space_Adventure:ice01
 --      ["Use the flying saucer from the crate to fly to the moon."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly the other planets."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly to the other planets."] = "", -- A_Space_Adventure:cosmos
---      ["Use the parachute ([Space] while in air) to get the next crate"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Use the parachute to get the next crate."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Use the portal gun to get to the next crate, then use the new gun to get to the final destination!|"] = "", -- A_Classic_Fairytale:dragon
 --      ["Use the RC plane and destroy the all the targets."] = "", -- A_Space_Adventure:desert03
 --      ["Use the rope in order to catch the blue hedgehog"] = "", -- A_Space_Adventure:moon02
@@ -2577,7 +2549,6 @@
 --      ["Victory Condition: Collect"] = "", -- HedgeEditor
 --      ["Victory Condition: Destroy"] = "", -- HedgeEditor
 --      ["Victory for %s!"] = "", -- Capture_the_Flag
-      ["Victory for the "] = "Победа за ", -- CTF_Blizzard, Capture_the_Flag
       ["Victory!"] = "Победа!", -- Basic_Training_-_Rope
 --      ["Violence is not the answer to your problems!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos
@@ -2597,9 +2568,6 @@
 --      ["Walls left: %d"] = "", -- WxW
 --      ["Wall to wall"] = "", -- WxW
 --      ["Waluigi"] = "", -- 
-      ["Wannabe Flyboys"] = "Хочу быть Пилотом", -- User_Mission_-_RCPlane_Challenge
---      ["Wannabe Ropers"] = "", -- Basic_Training_-_Rope
-      ["Wannabe Shoppsta"] = "Хочу быть Шоппером", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Wario"] = "", -- 
 --      ["Warming Up"] = "", -- Basic_Training_-_Grenade
 --      ["Warning: Fire cake detected"] = "", -- ClimbHome
@@ -2629,7 +2597,6 @@
 --      ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion
 --      ["Weapon specials: Some weapons have special modes (see weapon description)."] = "", -- Continental_supplies
 --      ["Weapons reset: The weapons are reset after each turn."] = "", -- WxW
-      ["Weapons Reset"] = "Сброс оружия",
 --      ["We are indeed."] = "", -- A_Classic_Fairytale:backstab
 --      ["We can't defeat them!"] = "", -- A_Classic_Fairytale:shadow
 --      ["We can't hold them up much longer!"] = "", -- A_Classic_Fairytale:united
@@ -2645,9 +2612,9 @@
 --      ["We have to hurry! Are you armed?"] = "", -- A_Space_Adventure:moon01
 --      ["We have to protect the village!"] = "", -- A_Classic_Fairytale:united
 --      ["We have to unite and defeat those cylergs!"] = "", -- A_Classic_Fairytale:enemy
---      ["Welcome Hog Solo, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome home! Please take a seat"] = "", -- ClimbHome
 --      ["Welcome, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey
+--      ["Welcome, %s, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome to the Death Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
@@ -2814,16 +2781,16 @@
 --      ["You can’t open a portal on the blue surface."] = "", -- portal
 --      ["You can use the other 2 hogs to assist you."] = "", -- A_Space_Adventure:fruit02
 --      ["You can use the rope to reach new places."] = "", -- Basic_Training_-_Rope
---      ["You choose well, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You choose well, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You completed the mission in %.3f seconds."] = "", -- A_Space_Adventure:ice02
 --      ["You completed the mission in %d rounds."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03
---      ["You couldn't have come to a worse time, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You couldn't have come to a worse time, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You couldn't possibly believe that after refusing my offer I'd just let you go!"] = "", -- A_Classic_Fairytale:journey
       ["You'd almost swear the water was rising!"] = "Могу поклясться, что вода прибывает!",
 --      ["You'd better watch your steps..."] = "", -- A_Classic_Fairytale:journey
 --      ["You defended yourself against Captain Lime."] = "", -- A_Space_Adventure:fruit02
---      ["You defended yourself against the Fruit Assassins."] = "", -- A_Space_Adventure:fruit02
---      ["You did great, Hog Solo! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
+--      ["You defended yourself against %s."] = "", -- A_Space_Adventure:fruit02
+--      ["You did great, %s! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
       ["You did not make it in time, try again!"] = "Время вышло, попробуй еще раз!", -- Basic_Training_-_Rope
 --      ["You don't deserve my sacrifice!"] = "", -- A_Classic_Fairytale:queen
 --      ["You drove Professor Hogevil away."] = "", -- A_Space_Adventure:moon01
@@ -2839,12 +2806,12 @@
 --      ["You got me!"] = "", -- A_Space_Adventure:moon02
       ["You had %.1fs remaining on the clock (+%d points)."] = "У вас оставалось %.1f секунд на таймере (+%d очков).", -- TargetPractice      
       ["You had %.2fs remaining on the clock (+%d points)."] = "У вас оставалось %.2f секунд на таймере (+%d очков).", -- Basic_Training_-_Sniper_Rifle
---      ["You had %d additional flying saucers left."] = "", -- A_Space_Adventure:ice02
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: you might want to use some mines..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: You might want to use some mines ..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01
 --      ["You have activated Switch Hedgehog!"] = "", -- Basic_Training_-_Movement
 --      ["You have beaten the challenge!"] = "", -- ClimbHome
+--      ["You have beaten the team record, congratulations!"] = "", -- Utils
 --      ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab
 --      ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united
 --      ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01
@@ -2863,7 +2830,6 @@
 --      ["You have eliminated all visible enemy hedgehogs!"] = "", -- A_Space_Adventure:fruit01
 --      ["You have eliminated Professor Hogevil."] = "", -- A_Space_Adventure:moon01
 --      ["You have eliminated the evil minions."] = "", -- A_Space_Adventure:moon01
---      ["You have eliminated the whole evil team. You're pretty tough!"] = "", -- A_Space_Adventure:moon01
 --      ["You have escaped successfully."] = "", -- A_Space_Adventure:desert02
 --      ["You have failed to complete your task, young one!"] = "", -- A_Classic_Fairytale:journey
 --      ["You have failed to save the tribe!"] = "", -- A_Classic_Fairytale:backstab
@@ -2917,6 +2883,7 @@
 --      ["You have to travel again"] = "", -- A_Space_Adventure:cosmos
 --      ["You have to try again!"] = "", -- A_Space_Adventure:cosmos
 --      ["You have triggered the secret Do-Not-Rope-to-the-Moon Defense System."] = "", -- A_Space_Adventure:cosmos
+--      ["You have unlocked the target radar!"] = "", -- TargetPractice
 --      ["You have used %d flying saucers."] = "", -- A_Space_Adventure:ice02
       ["You have used %d RC planes."] = "Вы использовали %d самолётов.", -- User_Mission_-_RCPlane_Challenge
       ["You have used only 1 RC plane. Outstanding!"] = "Вы использовали всего 1 самолёт. Выдающееся достижение!", -- User_Mission_-_RCPlane_Challenge
@@ -2935,10 +2902,9 @@
 --      ["You'll have only 2 watermelon bombs during the game."] = "", -- A_Space_Adventure:fruit03
 --      ["You'll have only one RC plane at the start of the mission."] = "", -- A_Space_Adventure:desert03
 --      ["You'll have to eliminate Captain Lime at the end."] = "", -- A_Space_Adventure:fruit02
---      ["You'll have to eliminate the Fruit Assassins at the end."] = "", -- A_Space_Adventure:fruit02
+--      ["You'll have to eliminate %s at the end."] = "", -- A_Space_Adventure:fruit02
 --      ["You'll lose if you die or if your time is up."] = "", -- A_Space_Adventure:moon02
 --      ["You'll see what I mean!"] = "", -- A_Classic_Fairytale:enemy
-      ["You lose!"] = "Вы проиграли!", -- Basic_Training_-_Bazooka
 --      ["You lost your target, try again!"] = "", -- TargetPractice
 --      ["You may find it handy."] = "", -- A_Space_Adventure:cosmos
       ["You may only attack from a rope!"] = "Вы можете атаковать только с верёвки!", -- WxW
@@ -2960,8 +2926,7 @@
       ["Your accuracy was %.1f%% (+%d points)."] = "Ваша точность составила %.1f%% (+%d очков).", -- TargetPractice
       ["Your accuracy was %.1f%%."] = "Ваша точность составила %.1f%%.", -- Basic_Training_-_Bazooka
       ["Your ammo is limited this time."] = "В этот раз ваши боезапасы ограничены.", -- Basic_Training_-_Bazooka
---      ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy
---      ["Your deaths will be avenged, Natives!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Your deaths will be avenged, %s!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Your death will not be in vain, Dense Cloud!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You're a coward!"] = "", -- A_Classic_Fairytale:queen
 --      ["You're...alive!? But we saw you die!"] = "", -- A_Classic_Fairytale:backstab
@@ -2989,21 +2954,21 @@
 --      ["Your next task is to collect some crates by using the rope!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Your personal best time so far: %.3f seconds"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
       ["Your rank: %s"] = "Ваш ранк: %s", -- User_Mission_-_RCPlane_Challenge
-      ["You saved %d of 8 Hapless Hogs."] = "Вы спасли %d из 8 Несчастных Ёжиков", -- User_Mission_-_That_Sinking_Feeling
+--      ["Your rope is gone! Try again!"] = "", -- Basic_Training_-_Rope
+--      ["You saved %d of 8 hegehogs."] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen
 --      ["You see the wind strength at the bottom right corner."] = "", -- Basic_Training_-_Bazooka
+--      ["You see the wind strength at the top."] = "", -- Basic_Training_-_Bazooka
 --      ["You should have known that we don't rely on meatbags!"] = "", -- A_Classic_Fairytale:queen
 --      ["You should know this more than anyone, Leaks!"] = "", -- A_Classic_Fairytale:queen
 --      ["You speak great truth, Hannibal. Here, take a sip!"] = "", -- A_Classic_Fairytale:epil
 --      ["You've been assaulting us, we have been just defending ourselves!"] = "", -- A_Classic_Fairytale:enemy
-      ["You've failed. Try again."] = "Ты проиграл. Попробуй еще раз.",
       ["You've reached the goal!| |Time: "] = "Вы достигли цели!| |Время: ",
 --      ["You will be avenged!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You will fail if you run out of ammo and there are still targets available."] = "", -- A_Space_Adventure:desert03
 --      ["You will gain some extra ammo from the crates the next time you play the \"Getting to the device\" mission."] = "", -- A_Space_Adventure:fruit03
 --      ["You will play every 3 turns."] = "", -- A_Space_Adventure:fruit01
 --      ["- You will recieve 2-4 weapons on each kill! (Even on own hogs)"] = "", -- Continental_supplies
---      ["You win!"] = "", -- Big_Armory
 --      ["You won't believe what happened to me!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Yuck! I bet they'll keep worshipping her even after I save the village!"] = "", -- A_Classic_Fairytale:family
 --      ["Yumme Gunpowder"] = "", -- 
@@ -3011,6 +2976,7 @@
 --      ["Zombie"] = "", -- 
 --      ["Zombi"] = "", -- portal
       ["'Zooka Team"] = "Команда Зука",
-      ["Zook"] = "Зук", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
+--      ["Zoom: [Pinch] with 2 fingers"] = "", -- Basic_Training_-_Movement
+--      ["Zoom: [Rotate mouse wheel]"] = "", -- Basic_Training_-_Movement
 --      ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen
 }
--- a/share/hedgewars/Data/Locale/ru.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/ru.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -779,7 +779,7 @@
 04:40=Устрой пожар на каком-нибудь участке|поверхности с помощью этой бутылки,|заполненной горючей жидкостью.|Атака: Удерживай для более дальнего броска
 04:41=Очевидно, что живая природа может превзойти|летающую тарелку. Птичка может повсюду носить|твоего ёжика и сбрасывать протухшие яйца на твоих врагов!|Не тормози, потому что Птичка тратит твоё время|Атака: Запустить птичку и бросать яйца|Вверх/Влево/Вправо: Хлопать крыльями для движения в одном|направлении
 04:42=Это переносное портальное устройство способно|мгновенно переместить тебя, твоих врагов,|или твое вооружение между двумя точками на местности.|Используй его с умом и твоей кампании будет сопутствовать...|ОГРОМНЫЙ УСПЕХ!|Предупреждение: Не работает на батутах.|Атака: Выстрелить порталом|Переключение: Прокрутить цвет портала
-04:43=Обеспечь своему музыкальному дебюту взрывной успех!|Сбрось громадное фортепьяно с небес, которое|сомнёт всё на своём пути, но знай:|Твой ёжик должен играть на нем,|и это будет стоить тебе жизни!|Курсор: Выбрать область удара|F1-F9: Играть на фортепьяно
+04:43=Обеспечь своему музыкальному дебюту взрывной успех!|Сбрось громадное фортепьяно с небес, которое|сомнёт всё на своём пути, но знай\:|Твой ёжик должен играть на нем,|и это будет стоить тебе жизни!|Курсор: Выбрать область удара|F1-F9: Играть на фортепьяно
 04:44=Это не обычный сыр, это война с применением|биологического оружия! Сыр не причинит большого|урона сразу, как только таймер достигнет нуля.|Но он будет постоянно отравлять любого,|кто имел неудачу вдохнуть зловоние!|1-5: Установить таймер|Точность + 1-5: Установить силу отскока|Атака: Удерживай для более дальнего броска
 04:45=Все те уроки физики, что были, наконец окупились|запуском разрушительной Синус-волны,|которая выжигает всё на своём пути.|Будь осторожен, это оружие имеет большую отдачу.|Атака: Выстрелить
 04:46=Накрой своих врагов испепеляющим жидким|пламенем. С самыми теплыми чувствами!|Атака: Активировать|Вверх/Вниз: Продолжать прицельный полив|Влево/Вправо: Изменить силу (дальность) полива
--- a/share/hedgewars/Data/Locale/sk.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/sk.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -26,7 +26,6 @@
 --      ["Above-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Accuracy Bonus! +15 points"] = "", -- Space_Invasion
 --      ["Accuracy bonus: +%d points"] = "", -- Basic_Training_-_Sniper_Rifle
---      ["Ace"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge
 --      ["Achievement gotten: %s"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_That_Sinking_Feeling, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, Basic_Training_-_Rope, Tumbler
 --      ["A Classic Fairytale"] = "", -- A_Classic_Fairytale:first_blood
 --      ["A crate critical to this mission has been destroyed."] = "", -- SimpleMission
@@ -45,7 +44,6 @@
 --      ["After you left the moon, my other loyal minions came and resurrected me so I could complete my master plan."] = "", -- A_Space_Adventure:death01
 --      ["Again with the 'cannibals' thing!"] = "", -- A_Classic_Fairytale:enemy
 --      ["A Hedgewars minigame"] = "", -- Capture_the_Flag
-        ["a Hedgewars mini-game"] = "minihra Hedgewars", -- Space_Invasion, The_Specialists
 --      ["A Hedgewars mini-game"] = "", -- Racer, Space_Invasion, TechRacer, Tumbler
 --      ["A Hedgewars tag game"] = "", -- Mutant
 --      ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome
@@ -141,13 +139,14 @@
 --      ["As you've seen, the dropped grenade roughly fell into your flying direction."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Athlete"] = "", -- Battalion
 --      ["Attack: Activate"] = "", -- Racer
---      ["Attack Captain Lime before he attacks back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack Captain Lime before he attacks back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack From Rope: %s"] = "", -- WxW
 --      ["Attack From Rope: You may only attack from a rope."] = "", -- WxW
 --      ["Attack rule: %s"] = "", -- WxW
 --      ["Attack: Select this continent"] = "", -- Continental_supplies
 --      ["Attack: [Space]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
---      ["Attack the assassins before they attack back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack: Tap the [Bomb]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
+--      ["Attack the assassins before they attack back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack: Throw ball"] = "", -- Knockball
 --      ["At the end of the game your health was %d."] = "", -- A_Space_Adventure:ice01
 --      ["At the start of the game each enemy hog has only the weapon that he is named after."] = "", -- A_Space_Adventure:death02
@@ -155,16 +154,18 @@
 --      ["Available weapon specials:"] = "", -- Continental_supplies
 --      ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion
---      ["Avoid the mines!"] = "", -- Basic_Training_-_Rope
 --      ["Axes"] = "", -- Bazooka_Battlefield
 --      ["Aye! Fellow! Let me exit this chamber of doom!"] = "", -- A_Classic_Fairytale:epil
 --      ["Back Breaker"] = "", -- A_Classic_Fairytale:backstab
 --      ["Back in the village, after telling the villagers about the threat..."] = "", -- A_Classic_Fairytale:united
 --      ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil
 --      ["Back Jump: [Backspace] ×2"] = "", -- Basic_Training_-_Movement
+--      ["Back Jump: Double-tap the [Curvy Arrow]"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (1/2)"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (2/2)"] = "", -- Basic_Training_-_Movement
 --      ["Backstab"] = "", -- A_Classic_Fairytale:backstab
+--      ["Backwards jump: Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Backwards jump: Tap the [Curvy Arrow] twice"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Bacon"] = "", -- 
 --      ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Badmad"] = "", -- portal
@@ -197,7 +198,6 @@
 --      ["Bazooka Battlefield"] = "", -- Bazooka_Battlefield
 --      ["Bazooka Master"] = "", -- Basic_Training_-_Bazooka
 --      ["Bazookas are influenced by wind."] = "", -- Basic_Training_-_Bazooka
---      ["Bazooka Team"] = "", -- Basic_Training_-_Bazooka
 	["Bazooka Training"] = "Tréning s bazukou",
 --      ["Bearded Beast"] = "", -- 
 --      ["Be careful, the future of Hogera is in your hands!"] = "", -- A_Space_Adventure:cosmos
@@ -231,7 +231,6 @@
 --      ["Bloodpie"] = "", -- A_Classic_Fairytale:backstab
 --      ["Bloodrocutor"] = "", -- A_Classic_Fairytale:shadow
 --      ["Bloodsucker"] = "", -- A_Classic_Fairytale:shadow
-        ["Bloody Rookies"] = "Mizerní zelenáči", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 --      ["Blue"] = "", -- 
 --      ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Bob"] = "", -- A_Space_Adventure:cosmos
@@ -314,7 +313,9 @@
 --      ["Challenge objectives"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit03, A_Space_Adventure:moon02
 --      ["Challenge over!"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa, ClimbHome
+--      ["Change bounciness: Tap [B]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Content: [Left], [Right]"] = "", -- HedgeEditor
+--      ["Change detonation timer: Tap the [Clock]"] = "", -- Basic_Training_-_Grenade, A_Classic_Fairytale:shadow
 --      ["Change direction: [Left]/[Right]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Change Health: [Left], [Right]"] = "", -- HedgeEditor
@@ -334,6 +335,8 @@
 --      ["Chicken"] = "", -- 
 --      ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01
 --      ["Chikorita"] = "", -- 
+--      ["Choose location: Left click"] = "", -- A_Classic_Fairytale:shadow
+--      ["Choose location: Tap the [Target] button, then tap on the spot you want to choose"] = "", -- A_Classic_Fairytale:shadow
 --      ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Choose your continent wisely, as your decision will be permanent."] = "", -- Continental_supplies
 --      ["Choose your side! If you want to join the strange man, walk up to him.|Otherwise, walk away from him. If you decide to att...nevermind..."] = "", -- A_Classic_Fairytale:shadow
@@ -342,7 +345,6 @@
 --      ["Cleaver"] = "", -- Construction_Mode
 --      ["Cleaver Placement Mode"] = "", -- Construction_Mode
 --      ["CLEAVER PLACEMENT MODE"] = "", -- HedgeEditor
---      ["Climber"] = "", -- ClimbHome
 --      ["Climb Home"] = "", -- ClimbHome
 --      ["Closing in"] = "", -- A_Classic_Fairytale:queen
 --      ["Clown"] = "", -- HedgeEditor
@@ -352,11 +354,13 @@
 --      ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb
 --      ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey
 --      ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey
+--      ["- Collect all the blue crates"] = "", -- HedgeEditor
 --      ["Collect all the crates, but remember, our time in this life is limited!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect or destroy all the health crates."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Collect or destroy the final crate to finish the training."] = "", -- Basic_Training_-_Flying_Saucer
+--      ["- Collect the blue crate"] = "", -- HedgeEditor
 --      ["Collect the crate and attack!"] = "", -- WxW
---      ["Collect the crate on the right.|Hint: Select the rope, [Up] or [Down] to aim, [Space] to fire, directional keys to move.|Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Collect the crate on the right."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the crates within the time limit!|If you fail, you'll have to try again."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the first crate to begin!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Collect the freezer and get the device part from Thanta."] = "", -- A_Space_Adventure:ice01
@@ -424,7 +428,6 @@
 --      ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates per turn: %d"] = "", -- WxW
---      ["crate(s)"] = "", -- SpeedShoppa
 --      ["Crazy Gravity: Gravity randomly changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity
 --      ["Crazy Runner"] = "", -- A_Space_Adventure:moon02
 --      ["Cricket Time"] = "", -- Continental_supplies
@@ -457,11 +460,10 @@
 --      ["Deals 15 damage to all enemies in the circle."] = "", -- Continental_supplies
 --      ["Deer"] = "", -- 
 --      ["Defeat all enemies!"] = "", -- portal
+--      ["Defeat!"] = "", -- HedgeEditor
 --      ["Defeat Professor Hogevil!"] = "", -- A_Space_Adventure:death01
---      ["Defeat the cannibals"] = "", -- A_Classic_Fairytale:backstab
---      ["Defeat the cannibals!|"] = "", -- A_Classic_Fairytale:united
+--      ["Defeat the cannibals!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cannibals!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Defeat the cannibals!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cyborgs!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen
 --      ["Delete Waypoint"] = "", -- HedgeEditor
@@ -482,11 +484,11 @@
 --      ["Destroyer of planes"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Destroy him, Leaks A Lot! He is responsible for the deaths of many of us!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion
+--      ["- Destroy the enemy"] = "", -- HedgeEditor
+--      ["- Destroy the red target"] = "", -- HedgeEditor
+--      ["- Destroy the red targets"] = "", -- HedgeEditor
 --      ["Destroy the targets!"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
---      ["Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
---      ["Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"] = "", -- A_Classic_Fairytale:first_blood
 --      ["+%d flamer fuel!"] = "", -- Tumbler
---      ["%d Hapless Hogs left"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["+%d health"] = "", -- Mutant
 --      ["%d-Hit Combo! +%d points!"] = "", -- Space_Invasion
 --      ["Did anyone follow you?"] = "", -- A_Classic_Fairytale:united
@@ -507,7 +509,6 @@
 --      ["Disguise as a Rockhopper Penguin"] = "", -- Continental_supplies
 --      ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies
 --      ["Displacer"] = "", -- 
---      ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Diver"] = "", -- User_Mission_-_Diver
 --      ["%d ms"] = "", -- HedgeEditor
 --      ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen
@@ -594,10 +595,8 @@
 --      ["Elderbot"] = "", -- A_Classic_Fairytale:family
 --      ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape
 	["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Zneškodnite všetky ciele pred vypršaním času.|Na túto misiu máte neobmedzené množstvo streliva.", --Bazooka, Shotgun, SniperRifle
---      ["Eliminate the Blue Team before the time runs out."] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Eliminate the enemy before the time runs out."] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree
         ["Eliminate the enemy hogs to win."] = "Výhru si zaslúžite, ked zneškodníte  nepriateľských ježkov.",
-        ["Eliminate the enemy specialists."] = "Zneškodnite nepriateľských špecialistov.",
 --      ["Eliminate the enemy."] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh
 --      ["Eliminate Unit 3378."] = "", -- User_Mission_-_Teamwork
 --      ["Eliminate WatchBot 4000."] = "", -- User_Mission_-_Teamwork_2
@@ -622,13 +621,14 @@
 --      ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab
 --      ["Except me, of course! I just saved a whole planet!"] = "", -- A_Space_Adventure:final
 --      ["Experienced beginner"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Explore the tunnel with the other hedgehogs and search for the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Explore the tunnel with the other hedgehogs and search for the device."] = "", -- A_Space_Adventure:fruit02
 --      ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02
 --      ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey
 --      ["Fair Wind"] = "", -- 
 --      ["Fall Damage"] = "", -- Basic_Training_-_Movement
 --      ["Fallen Angel"] = "", -- Tentacle_Terror
 --      ["Family Reunion"] = "", -- A_Classic_Fairytale:family
+--      ["Fastest escape: %d turns"] = "", -- A_Space_Adventure:desert02
 --      ["Fastest lap: %.3fs by %s"] = "", -- TrophyRace
 	["Fastest lap: "] = "Najrýchlejšie kolo: ",
         ["Feeble Resistance"] = "Slabý odpor",
@@ -648,11 +648,12 @@
 --      ["Final result"] = "", -- Mutant
 --      ["Final Targets"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
 --      ["Final team scores:"] = "", -- Space_Invasion
+--      ["Find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Find a way to detonate all the explosives and stay alive!"] = "", -- A_Space_Adventure:final
 --      ["Find your tribe!|Cross the lake!"] = "", -- A_Classic_Fairytale:dragon
 --      ["Finish this challenge as fast as possible to earn bonus points."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Finish waypoint placement"] = "", -- Racer
---      ["Finish your training|Hint: Animations can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Finish your training."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Finite Ropes"] = "", -- Basic_Training_-_Rope
 --      ["Fire a rocket with napalm."] = "", -- Continental_supplies
 --      ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler
@@ -680,6 +681,7 @@
 --      ["Flying Saucer Training"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Fly into space to fight off the invaders with barrels!"] = "", -- Space_Invasion
 --      ["Fly to the meteorite and detonate the explosives"] = "", -- A_Space_Adventure:cosmos
+--      ["Follow the path and destroy the next target."] = "", -- Basic_Training_-_Rope
 --      ["Forgetfulness: You will lose all your weapons each turn."] = "", -- Continental_supplies
 --      ["For the next crate, you have to do back jumps."] = "", -- Basic_Training_-_Movement
 --      ["Four Eyes"] = "", -- 
@@ -699,8 +701,6 @@
 --      ["“g=150”, where 150 is 150% of normal gravity."] = "", -- Gravity
 --      ["“g=50, g2=150, period=4000” for gravity changing|from 50 to 150 and back with period of 4000 ms."] = "", -- Gravity
 --      ["Galaxy Guardians"] = "", -- Big_Armory
-        ["Game Modifiers: "] = "Modifikátory hry: ",
-        ["GAME OVER!"] = "KONIEC HRY!",
 --      ["Game over!"] = "", -- Space_Invasion
         ["Game Started!"] = "Hra začala!",
 --      ["Game? Was this a game to you?!"] = "", -- A_Classic_Fairytale:enemy
@@ -710,8 +710,6 @@
 --      ["Gasp! A smuggler!"] = "", -- A_Space_Adventure:desert01
 --      ["Gasp!"] = "", -- A_Space_Adventure:desert01
 --      ["Gathering fruits all day long."] = "", -- A_Classic_Fairytale:queen
---      ["Gear information hidden"] = "", -- HedgeEditor
---      ["Gear information shown"] = "", -- HedgeEditor
 --      ["Gear Placement Tool"] = "", -- HedgeEditor
 --      ["General information"] = "", -- Continental_supplies
 --      ["General information:"] = "", -- Continental_supplies
@@ -721,7 +719,7 @@
 --      ["Get Dense Cloud out of the pit!"] = "", -- A_Classic_Fairytale:journey
 --      ["Get him, Spike!"] = "", -- A_Space_Adventure:desert01
         ["Get on over there and take him out!"] = "Okamžite sa tam presuň a zneškodni ho!",
---      ["Get on the head of the mole"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Get on the head of the mole."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Get past the flower."] = "", -- A_Classic_Fairytale:journey
 --      ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01
 --      ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood
@@ -759,7 +757,6 @@
         ["GO! GO! GO!"] = "POHYB! POHYB! POHYB!",
         ["Good birdy......"] = "Dobrý vtáčik......",
 --      ["Good bye!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Good Dude"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Good idea, they'll never find us there!"] = "", -- A_Classic_Fairytale:united
 --      ["Good job!"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Good job! Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -770,7 +767,7 @@
 --      ["Good so far!"] = "", -- Basic_Training_-_Sniper_Rifle
 --      ["Good to go!"] = "", -- Racer, Tumbler
 --      ["Good! You now control Cappy."] = "", -- Basic_Training_-_Movement
---      ["Go on top of the flower"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Go on top of the flower."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Go, quick!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Gorkij"] = "", -- A_Classic_Fairytale:journey
 --      ["Go surf!"] = "", -- WxW
@@ -793,7 +790,6 @@
 --      ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow
 --      ["Green"] = "", -- 
 --      ["Green Bananas"] = "", -- A_Space_Adventure:fruit01
---      ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Green double rings also give you a new flying saucer."] = "", -- A_Space_Adventure:ice02
 --      ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01
 --      ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01
@@ -803,11 +799,8 @@
 --      ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Greetings from the Navy, %s (%s), for being a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["Greetings, %s!"] = "", -- A_Classic_Fairytale:dragon
---      ["Greg"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
---      ["Grenade Group"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard
 --      ["Grenades explode after 1 to 5 seconds (you decide)."] = "", -- Basic_Training_-_Grenade
 --      ["Grenades with high bounciness bounce a lot and behave chaotic."] = "", -- Basic_Training_-_Grenade
---      ["Grenade Team"] = "", -- Basic_Training_-_Grenade
 --      ["Grenade Training"] = "", -- Basic_Training_-_Grenade
 --      ["Grenadiers"] = "", -- Basic_Training_-_Grenade
 --      ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor
@@ -848,7 +841,6 @@
 --      ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion
 --      ["Health Modification Mode"] = "", -- HedgeEditor
 --      ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor
---      ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
 --      ["Heavenly Defense"] = "", -- Tentacle_Terror
 --      ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united
         ["Heavy"] = "Ťažký",
@@ -861,6 +853,7 @@
 --      ["Hedgehog Projectile"] = "", -- Continental_supplies
 --      ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies
 --      ["Hedgehogs can not be deleted."] = "", -- HedgeEditor
+--      ["Hedgehogs left: %d"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Hedgehogs will be revived after their death."] = "", -- Mutant
 --      ["Hedgehogs will start in the first waypoint."] = "", -- Racer
 --      ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab
@@ -876,7 +869,6 @@
 --      ["Help Enabled"] = "", -- HedgeEditor
 --      ["Helpers: Each team starts with %d helper points"] = "", -- Battalion
 --      ["Helpers: Hogs will get 1 out of 2 helpers randomly each turn"] = "", -- Battalion
---      ["Help Hog Solo to find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Help me, Leaks!"] = "", -- A_Classic_Fairytale:journey
 --      ["Help me, please!!!"] = "", -- A_Classic_Fairytale:journey
 --      ["Help me, please!"] = "", -- A_Classic_Fairytale:journey
@@ -891,20 +883,20 @@
 --      ["Here you will find the current mission instructions."] = "", -- Basic_Training_-_Movement
 --      ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Heroic Wind"] = "", -- Continental_supplies
---      ["Hero Team"] = "", -- User_Mission_-_The_Great_Escape
 --      ["He's so brave..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["He was the lab assistant of Dr. Goodhogan, the inventor of the anti-gravity device."] = "", -- A_Space_Adventure:moon02
 --      ["He won't be selling us out anymore!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey, don't forget us! We still need to climb up!"] = "", -- A_Classic_Fairytale:family
 --      ["Hey, guys!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey guys!"] = "", -- A_Classic_Fairytale:united
---      ["Hey, Hog Solo! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey! I was supposed to collect it!"] = "", -- A_Space_Adventure:fruit02
+--      ["Hey, %s! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey, %s! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey
 --      ["Hidden"] = "", -- portal
 --      ["High Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["High Jump: [Backspace]"] = "", -- Basic_Training_-_Movement
+--      ["High Jump: Tap the [Curvy Arrow] shortly"] = "", -- Basic_Training_-_Movement
 --      ["--- Highland ---"] = "", -- Battalion
 --      ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander
 --      ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion
@@ -915,20 +907,24 @@
 --      ["Hill Guard"] = "", -- Bazooka_Battlefield
 --      ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01
 --      ["--- Hint ---"] = "", -- Battalion
---      ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
 --      ["Hint: Drilling holes should solve everything."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: Hold down [M] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: If this mission panel disappears, you can|see it again by hitting the Pause or Quit key."] = "", -- Basic_Training_-_Movement
 --      ["Hint: It might be a good idea to place a girder before starting to drill. Just saying."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: It might be easier if you vary the angle only slightly."] = "", -- Basic_Training_-_Bazooka
+--      ["Hint: Just select the parachute, it opens automatically when you fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion
 --      ["Hint: Launch the bazooka horizontally at full power."] = "", -- Basic_Training_-_Bazooka
---      ["Hint: Press [Esc] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Pause the game to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Select the blow torch, aim and press [Fire]. Press [Fire] again to stop."] = "", -- A_Classic_Fairytale:journey
 --      ["Hint: Select the low gravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey
+--      ["Hint: Select the rope, [Up] or [Down] to aim, [Attack] to fire, directional keys to move."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Select the Shoryuken and hit [Attack].|P.S.: You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: %s needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family
 --      ["Hint: The rope only bends around objects.|When it doesn't hit anything, it's always straight."] = "", -- Basic_Training_-_Rope
 --      ["Hint: To jump higher, wait a bit before you hit “High Jump” a second time."] = "", -- Basic_Training_-_Movement
+--      ["Hint: To place a girder, select it,|then use [Left] and [Right] to select angle and length,|then choose a location for the girder."] = "", -- A_Classic_Fairytale:shadow
 --      ["Hint: Use the quit key to see the team’s continent."] = "", -- Continental_supplies
 --      ["Hint: When you shorten the rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope
 --      ["Hint: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey
@@ -962,24 +958,11 @@
 --      ["Hogminator"] = "", -- A_Classic_Fairytale:family
 --      ["Hog nueve"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog octo"] = "", -- A_Space_Adventure:fruit03
---      ["Hogonauts"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Hog onze"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog Saturn"] = "", -- A_Space_Adventure:fruit03
 --      ["Hogs in sight!"] = "", -- Continental_supplies
 --      ["Hog Solo and GB"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hog Solo"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01, A_Space_Adventure:moon02
---      ["Hog Solo couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo escaped successfully!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo has to reach the last crates"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo has to refuel his saucer."] = "", -- A_Space_Adventure:moon01
---      ["Hog Solo lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
---      ["Hog Solo wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["- Hogs will be revived"] = "", -- Capture_the_Flag
 --      ["- Hogs will drop the flag when killed"] = "", -- Capture_the_Flag
 --      ["Hog two"] = "", -- A_Space_Adventure:fruit03
@@ -989,9 +972,7 @@
 --      ["Homing Bee"] = "", -- Construction_Mode
 --      ["Honda"] = "", -- 
 --      ["Honest Lee"] = "", -- A_Classic_Fairytale:enemy
---      ["Hook"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
 --      ["Hooks"] = "", -- 
-        ["Hooray!"] = "Hurá!",
 --      ["Hooray! I actually did it! Hogera is safe!"] = "", -- A_Space_Adventure:final
 --      ["Hooray! I've found it, now I have to get back to Captain Lime!"] = "", -- A_Space_Adventure:fruit02
 --      ["Hooray! You are a champion!"] = "", -- A_Space_Adventure:ice02
@@ -1007,7 +988,7 @@
 --      ["However, if you fail to do so, she dies a most violent death, just like your friend! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, if you fail to do so, she dies a most violent death! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, my mates don't agree with me on letting you go..."] = "", -- A_Classic_Fairytale:dragon
---      ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
+--      ["However, the army of %s is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
 --      ["How to Rope"] = "", -- Basic_Training_-_Rope
 --      ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen
 --      ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen
@@ -1027,7 +1008,6 @@
 --      ["I can't believe what I'm hearing!"] = "", -- A_Classic_Fairytale:backstab
 --      ["I can't let you go further because …"] = "", -- A_Classic_Fairytale:queen
 --      ["I can't wait any more, I have to save myself!"] = "", -- A_Classic_Fairytale:shadow
---      ["Ice"] = "", -- Basic_Training_-_Movement
 --      ["Ice Jake"] = "", -- A_Space_Adventure:ice01
 --      ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family
 --      ["Icy Girder: [3]"] = "", -- HedgeEditor
@@ -1085,7 +1065,6 @@
 --      ["I just found out that they have captured your princess!"] = "", -- A_Classic_Fairytale:family
 --      ["I just want the strange device you found!"] = "", -- A_Space_Adventure:ice01
 --      ["I just wonder where Ramon and Spiky disappeared..."] = "", -- A_Classic_Fairytale:journey
---      ["Ikeda"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["I know and I'm terribly sorry!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know, my hero!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know that your resources are low due to the battle but I'll send two of my best hogs to assist you."] = "", -- A_Space_Adventure:fruit02
@@ -1113,6 +1092,7 @@
 --      ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen
 --      ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united
 --      ["IMPORTANT: To see the mission panel again, hold the mission panel key."] = "", -- Basic_Training_-_Movement
+--      ["IMPORTANT: To see the mission panel again, pause the game."] = "", -- Basic_Training_-_Movement
 --      ["Impressive...you are still dry as the corpse of a hawk after a week in the desert..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["%i ms"] = "", -- Gravity
 --      ["I'm so glad this is finally over!"] = "", -- A_Space_Adventure:final
@@ -1271,7 +1251,6 @@
 --      ["Kill the traitor, %s, or spare his life!"] = "", -- A_Classic_Fairytale:backstab
 --      ["--- King ---"] = "", -- Battalion
 --      ["King"] = "", -- Battalion
---      ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing
 --      ["--- King Mode ---"] = "", -- Battalion
 --      ["Knight"] = "", -- Battalion
 --      ["Knives"] = "", -- 
@@ -1290,7 +1269,7 @@
 --      ["Launch some bazookas to destroy the targets!"] = "", -- Basic_Training_-_Bazooka
 --      ["Leader"] = "", -- A_Classic_Fairytale:enemy
 --      ["Leaderbot"] = "", -- A_Classic_Fairytale:queen
---      ["Lead the Green Bananas to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
+--      ["Lead your allies to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
 --      ["Leaks A Lot"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Leaks A Lot, depressed for killing his loved one, failed to save the village..."] = "", -- A_Classic_Fairytale:journey
 --      ["Leaks A Lot gave his life for his tribe! He should have survived!"] = "", -- A_Classic_Fairytale:first_blood
@@ -1305,7 +1284,6 @@
 --      ["Left/right: Choose crate contents"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode
---      ["Left Tong"] = "", -- Bazooka_Battlefield
 --      ["Legs"] = "", -- 
 --      ["Less tools, more fun"] = "", -- Battalion
 --      ["Lestat"] = "", -- portal
@@ -1334,18 +1312,19 @@
 --      ["Lively Lifeguard"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Lonely Cries"] = "", -- Continental_supplies
 --      ["Lonely Cries: [Rise the water if no hog is in the circle and deal 6 damage to all enemy hogs.]"] = "", -- Continental_supplies
---      ["Lonely Hog"] = "", -- ClimbHome
 --      ["Long Jump: [Enter]"] = "", -- Basic_Training_-_Movement
+--      ["Long Jump: Tap the [Curvy Arrow] button for long"] = "", -- Basic_Training_-_Movement, A_Classic_Fairytale:first_blood
 --      ["Long Live The Queen"] = "", -- A_Classic_Fairytale:queen
 --      ["Look around: [Mouse movement]"] = "", -- Basic_Training_-_Movement
+--      ["Look around: [Tap or swipe on the screen]"] = "", -- Basic_Training_-_Movement
 --      ["Look, boss! There is the target!"] = "", -- A_Space_Adventure:moon01
 --      ["Look, I had no choice!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! There's more of them!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! We're surrounded by cannibals!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Looks like the whole world is falling apart!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Look to the left and do a backwards jump towards the mushroom."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Loon"] = "", -- The_Specialists
 --      ["Loopy"] = "", -- 
---      ["Lord Evil"] = "", -- Tentacle_Terror
 --      ["Losing Condition: Destroy"] = "", -- HedgeEditor
 --      ["Low Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander
@@ -1365,7 +1344,6 @@
 --      ["Mario"] = "", -- 
 --      ["Mark gears for win/lose conditions"] = "", -- HedgeEditor
 --      ["Mark/unmark gear: [Left Click]"] = "", -- HedgeEditor
---      ["Mark"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
 --      ["- Massive weapon bonus on first turn"] = "", -- Continental_supplies
 --      ["Max Citrus"] = "", -- A_Space_Adventure:fruit01
 --      ["Maybe you should try an easier map next time."] = "", -- Racer
@@ -1380,7 +1358,6 @@
 --      ["Mega kill!"] = "", -- Mutant
 --      ["Meiwes"] = "", -- A_Classic_Fairytale:backstab
 --      ["mikade"] = "", -- 
---      ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer
 --      ["Mindy"] = "", -- A_Classic_Fairytale:united
 --      ["Mine Deployer"] = "", -- Space_Invasion, Tumbler
 --      ["Mine Placement Mode"] = "", -- Construction_Mode
@@ -1399,12 +1376,12 @@
 --      ["Minion"] = "", -- A_Space_Adventure:moon01
 --      ["Minions"] = "", -- A_Space_Adventure:moon01
 --      ["Mission failed!"] = "", -- Big_Armory
-        ["MISSION FAILED"] = "MISIA NEÚSPEŠNÁ", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Mission failure in %d s"] = "", -- Big_Armory
+--      ["Mission"] = "", -- HedgeEditor
 --      ["Mission lost!"] = "", -- Basic_Training_-_Grenade
 --      ["Mission Panel"] = "", -- Basic_Training_-_Movement
 --      ["Mission panel: [M]"] = "", -- Basic_Training_-_Movement
-        ["MISSION SUCCESSFUL"] = "MISIA ÚSPEŠNÁ", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+--      ["Mission succeeded!"] = "", -- portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, SimpleMission, HedgeEditor
 --      ["Mission won!"] = "", -- Basic_Training_-_Grenade
 --      ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02
 --      ["Mixed %d"] = "", -- WxW
@@ -1420,7 +1397,6 @@
 --      ["Monster kill!"] = "", -- Mutant
 --      ["Monsters"] = "", -- 
 --      ["Mooney"] = "", -- 
---      ["More Natives"] = "", -- A_Classic_Fairytale:epil
 --      ["Morris"] = "", -- 
 --      ["Most mines are not active."] = "", -- A_Space_Adventure:desert02
 --      ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01
@@ -1440,13 +1416,11 @@
 --      ["Nade Boy"] = "", -- Basic_Training_-_Grenade
 --      ["Nah, probably everyone was just stupid."] = "", -- A_Space_Adventure:final
 --      ["Name"] = "", -- A_Classic_Fairytale:queen
-        ["Nameless Heroes"] = "Hrdinovia bez mena",
 --      ["Nancy Screw"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:queen
 --      ["Napalm"] = "", -- Construction_Mode
 --      ["Napalm Rocket"] = "", -- Continental_supplies
 --      ["Napalm rocket: [Fire a bomb with napalm!]"] = "", -- Continental_supplies
 --      ["Naranja Jed"] = "", -- A_Space_Adventure:fruit01
---      ["Natives"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Naughty Ninja"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Near a PAotH base on the moon ..."] = "", -- A_Space_Adventure:moon01
 --      ["Near Secret Base 17 of PAotH in the rural Hogland ..."] = "", -- A_Space_Adventure:cosmos
@@ -1541,11 +1515,8 @@
 --      ["Oh, my!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oh, my! I forgot something!"] = "", -- A_Classic_Fairytale:queen
 --      ["Oh, my! This is even more entertaining than I've expected!"] = "", -- A_Classic_Fairytale:backstab
-        ["Oh no! Just try again!"] = "Áále nie! Tak to skúste znovu!", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Oh no, not %s!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
---      ["Oh no, the Green Bananas have betrayed Hog Solo and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
-	["Oh no! Time's up! Just try again."] = "Áále nie! Čas vypršal! Tak to skúste znovu.", --Bazooka, Shotgun, SniperRifle
---      ["Oh no! You failed! Just try again."] = "", -- Basic_Training_-_Cluster_Bomb
+--      ["Oh no, the companions have betrayed %s and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
 --      ["Oh no! You have died. Try again!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Oh! Please spare me. You can take all my treasures!"] = "", -- A_Space_Adventure:ice01
 --      ["Oh, silly me! I forgot that I'm the shaman."] = "", -- A_Classic_Fairytale:backstab
@@ -1567,9 +1538,9 @@
 --      ["One shall not judge one by one's appearance!"] = "", -- A_Classic_Fairytale:epil
 --      ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oneye"] = "", -- portal
---      ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant
 --      ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant
+--      ["Only %s can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard
 --      ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01
@@ -1581,6 +1552,7 @@
 --      ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01
 --      ["Oops! You have selected the wrong hedgehog! Just try again."] = "", -- Basic_Training_-_Movement
 --      ["Open ammo menu: [Right click]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
+--      ["Open ammo menu: Tap the [Suitcase]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
 --      ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood
         ["Opposing Team: "] = "Nepriateľský tím",
 --      ["Orange"] = "", -- 
@@ -1600,15 +1572,14 @@
 --      ["PAotH has sent explosives but unfortunately the trigger mechanism seems to be faulty!"] = "", -- A_Space_Adventure:cosmos
 --      ["Parachute"] = "", -- Continental_supplies
 --      ["Patches"] = "", -- 
---      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02
 --      ["Pause: [P]"] = "", -- Basic_Training_-_Movement
+--      ["Pause: Tap the [Pause] button"] = "", -- Basic_Training_-_Movement
 --      ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW
 --      ["Penguin Roar"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hog’s health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Perfect! Now try to get the next crate without hurting yourself!"] = "", -- A_Classic_Fairytale:first_blood
-        ["Per-Hog Ammo"] = "Samostatná munícia pre ježkov",
 --      ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh
 --      ["Personal best: %.3f seconds"] = "", -- A_Space_Adventure:ice02
 --      ["Per team weapons"] = "", -- Continental_supplies
@@ -1617,7 +1588,6 @@
 --      ["Physicist"] = "", -- HedgeEditor
 --      ["Piano Strike"] = "", -- Construction_Mode
 --      ["Pikachu"] = "", -- 
---      ["Pincer Knights"] = "", -- Bazooka_Battlefield
 --      ["Pings left: %d"] = "", -- Space_Invasion
 --      ["Pink"] = "", -- 
 --      ["Pirates"] = "", -- 
@@ -1669,9 +1639,7 @@
 --      ["Please wait …"] = "", -- WxW
 --      ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion
 --      ["--- Points ---"] = "", -- Battalion
-        ["points"] = "body", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
 --      ["--- Points Mode ---"] = "", -- Battalion
---      ["point(s)"] = "", -- TargetPractice, Mutant
 --      ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02
 --      ["Poisonous, deals no damage."] = "", -- Continental_supplies
         ["Poison"] = "Poison",
@@ -1691,37 +1659,37 @@
 --      ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to fight"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos
---      ["Prepare yourself"] = "", -- The_Specialists
+--      ["Prepare yourself, %s!"] = "", -- The_Specialists
 --      ["Press [Attack] (space bar by default) to start,|repeadedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] (space bar by default) to start,|repeatedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] to begin."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Attack] to confirm."] = "", -- Continental_supplies
 --      ["Press [Attack] to select this continent!"] = "", -- Continental_supplies
 --      ["Press [Left] and [Right] to change the difficulty."] = "", -- A_Classic_Fairytale:first_blood
---      ["Press [Left] or [Right] to move around, [Enter] to jump"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Press [Left] or [Right] to move around, [Long Jump] to jump forwards."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW
 --      ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW
+--      ["Press [M] to see the mission texts"] = "", -- Basic_Training_-_Movement
         ["Press [Precise] to skip intro"] = "Stlačte [Presnejšie mierenie] pre preskočenie intra",
 --      ["Press [Up] and [Down] to move between menu items.|Press [Attack], [Left], or [Right] to toggle."] = "", -- WxW
 --      ["Prestigious Pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Princess"] = "", -- A_Classic_Fairytale:family, A_Classic_Fairytale:journey
 --      ["Princess Peach"] = "", -- 
---      ["Private Nolak"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["Problems, dude? Chillax!"] = "", -- A_Classic_Fairytale:epil
 --      ["Professional pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professional stunt pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professor"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
 --      ["Professor Hogevil, then known as James Hogus, worked for PAotH back in my time."] = "", -- A_Space_Adventure:moon02
+--      ["Professor's Team"] = "", -- A_Space_Adventure:death01
 --      ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
---      ["Pro Killers"] = "", -- Big_Armory
 --      ["Protect the King: When the king dies, so does the team"] = "", -- Battalion
 --      ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Protect yourselves!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Purple"] = "", -- 
 --      ["Pyro"] = "", -- HedgeEditor, The_Specialists
 --      ["Pyromancer"] = "", -- Battalion
 --      ["Quit: [Esc]"] = "", -- Basic_Training_-_Movement
 --      ["Race complexity limit reached"] = "", -- Racer, TechRacer
+--      ["Race failed!"] = "", -- A_Space_Adventure:moon02
 --      ["Racer"] = "", -- Racer
 --      ["Racer tool"] = "", -- Racer
 --      ["Race"] = "", -- TrophyRace
@@ -1757,23 +1725,19 @@
 --      ["Replenishment: Weapons are restocked on turn start of a new hog"] = "", -- Highlander
 --      ["Repositioning Mode"] = "", -- HedgeEditor
 --      ["REPOSITIONING MODE"] = "", -- HedgeEditor
---      ["rescues"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Rescue the imprisoned PAotH team and get the fuel!"] = "", -- A_Space_Adventure:moon01
 --      ["Respawner"] = "", -- Construction_Mode
 --      ["Respawner: Resurrects dead hogs."] = "", -- Construction_Mode
 --      ["Resurrector"] = "", -- Construction_Mode
 --      ["Retract/Extend rope: [Up]/[Down]"] = "", -- Basic_Training_-_Rope
 --      ["- Return the enemy flag to your base to score"] = "", -- Capture_the_Flag
-        [" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = " - Skórujete prinesením nepriateľskej vlajky do vašej základne | -  Prvý tím, ktorý dosiahne 3 body, vyhráva | - Skórujete len vtedy, keď je máte svoju vlajku v základni | - Spadnuté vlajky môžu byť vrátené na základňu alebo sa ich môže zmocniť súpere | - Ježkovia po smrti ožiujú",
 --      ["Return to Leaks A Lot!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Return to the mission menu by pressing the \"Go back\" button."] = "", -- A_Space_Adventure:cosmos
 --      ["Return to the Surface"] = "", -- A_Space_Adventure:fruit02
 --      ["Return to the training menu by pressing the “Go back” button."] = "", -- Basic_Training_-_Movement
---      ["Rhombus"] = "", -- Basic_Training_-_Movement
 --      ["Rider"] = "", -- portal
 --      ["Rifleman"] = "", -- Battalion
 --      ["Righteous Beard"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:queen, A_Classic_Fairytale:united
---      ["Right Tong"] = "", -- Bazooka_Battlefield
 --      ["Ripe"] = "", -- 
 --      ["Rise the water if nobody else is in the circle and deal 6 damage to all enemy hogs."] = "", -- Continental_supplies
 --      ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01
@@ -1782,8 +1746,8 @@
 --      ["Roof"] = "", -- WxW
 --      ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Rope Master"] = "", -- Basic_Training_-_Rope
---      ["Roper"] = "", -- SpeedShoppa
 --      ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
+--      ["Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Rope Team"] = "", -- Basic_Training_-_Rope
 --      ["Rope Training"] = "", -- Basic_Training_-_Rope
 --      ["Rope Weapons"] = "", -- Basic_Training_-_Rope
@@ -1797,7 +1761,6 @@
 --      ["Round limit:"] = "", -- TechRacer
 --      ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer
 --      ["Round's slowest lap: %.3fs by %s"] = "", -- TrophyRace
---      ["Rounds until Sudden Death: %d"] = "", -- Battalion
 --      ["RS1"] = "", -- A_Space_Adventure:fruit03
 --      ["RS2"] = "", -- A_Space_Adventure:fruit03
 --      ["Rubber"] = "", -- Construction_Mode, HedgeEditor
@@ -1823,10 +1786,17 @@
 --      ["Salvation was one step closer now..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Sam"] = "", -- A_Space_Adventure:cosmos
 --      ["Sandals?! I thought you left your ring!"] = "", -- A_Classic_Fairytale:queen
+--      ["%s and GB"] = "", -- A_Space_Adventure:fruit02
 --      ["%s and %s enter the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sandstorm"] = "", -- A_Space_Adventure:desert01
 --      ["Sandy"] = "", -- A_Space_Adventure:desert01
-        ["Save as many hapless hogs as possible!"] = "Zachráňte toľko bezmocných ježkov, koľko len viete!",
+--      ["%s arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
+--      ["Save as many hogs as possible!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey
 --      ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow
 --      ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor
@@ -1838,9 +1808,9 @@
 --      ["Scallywag"] = "", -- 
 --      ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab
 --      ["Scenario"] = "", -- Big_Armory, portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape
---      ["Scenario failed!"] = "", -- SimpleMission
 --      ["Scientist"] = "", -- Battalion
 --      ["%s climbed home in %d seconds!"] = "", -- ClimbHome
+--      ["%s (contd.)"] = "", -- A_Classic_Fairytale:epil
 --      ["Score: %d"] = "", -- Space_Invasion
 --      ["Score goal: %d"] = "", -- Control
 --      ["Score graph"] = "", -- Mutant, Space_Invasion
@@ -1850,6 +1820,7 @@
 --      ["Scores"] = "", -- Mutant
 --      ["Scores:"] = "", -- Mutant
 --      ["Scoring: "] = "", -- Mutant
+--      ["%s couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
 --      ["Script parameter examples:"] = "", -- Gravity
 --      ["%s (+%d)"] = "", -- Battalion
 --      ["%s: %d"] = "", -- Capture_the_Flag, Control
@@ -1862,10 +1833,9 @@
 --      ["%s died … and lives again!"] = "", -- Construction_Mode
 --      ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome
 --      ["%s, %d sec"] = "", -- Continental_supplies
---      ["Search for the device with the help of the other hedgehogs "] = "", -- A_Space_Adventure:fruit02
+--      ["Search for the device with the help of the other hedgehogs."] = "", -- A_Space_Adventure:fruit02
 --      ["Searching in the dust"] = "", -- A_Space_Adventure:desert01
 --      ["Searching the stars!"] = "", -- A_Space_Adventure:cosmos
---      ["seconds"] = "", -- ClimbHome
 --      ["Seduction"] = "", -- Continental_supplies
 --      ["Seems like every time you take a \"walk\", the enemy finds us!"] = "", -- A_Classic_Fairytale:backstab
 --      ["See that crate farther on the right?"] = "", -- A_Classic_Fairytale:first_blood
@@ -1892,6 +1862,7 @@
 --      ["Select your continent with [Up]/[Down] or by selecting a representative weapon."] = "", -- Continental_supplies
 --      ["%s enters the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sergey"] = "", -- 
+--      ["%s escaped successfully!"] = "", -- A_Space_Adventure:fruit01
 --      ["Set bounciness: [Left Shift] + [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set detonation timer: [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set Health: [Left Click]"] = "", -- HedgeEditor
@@ -1915,10 +1886,12 @@
 --      ["%s has been killed before taking enough damage first."] = "", -- SimpleMission
 --      ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has been rescued from death"] = "", -- Construction_Mode
+--      ["%s has dropped the flag!"] = "", -- CTF_Blizzard
 --      ["%s has fallen victim to gravity."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has mutated! +2 points"] = "", -- Mutant
 --      ["%s has passed the best height of %s!"] = "", -- ClimbHome
 --      ["%s has scored!"] = "", -- Capture_the_Flag
+--      ["%s has to refuel the saucer."] = "", -- A_Space_Adventure:moon01
 --      ["%s hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil
 --      ["sheepluva"] = "", -- 
@@ -1935,8 +1908,6 @@
 --      ["Shinobi"] = "", -- 
 --      ["%s hit the ground."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Shoppa Love"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
---      ["Shoppa Union"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes, Challenge_-_Speed_Shoppa_-_ShoppaKing
---      ["Shoppers"] = "", -- SpeedShoppa
 --      ["Shotgun"] = "", -- Continental_supplies
         ["Shots Left: "] = "Zostáva striel: ", -- GaudyRacer, Tumbler
 --      ["Sigh."] = "", -- A_Classic_Fairytale:epil
@@ -1950,11 +1921,11 @@
 --      ["%s is now as poor as a church mouse"] = "", -- Construction_Mode
 --      ["%s is now a zombie hedgehog"] = "", -- Construction_Mode
 --      ["%s is suddenly low on ammo"] = "", -- Construction_Mode
---      ["Skip your turn to try again."] = "", -- Basic_Training_-_Rope
 --      ["Skulls"] = "", -- Bazooka_Battlefield
 --      ["Slimer"] = "", -- 
 --      ["Slippery"] = "", -- A_Classic_Fairytale:journey
 --      ["%s lost all the weapons"] = "", -- Construction_Mode
+--      ["%s lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
 --      ["Slot %d: %s"] = "", -- Frenzy
 --      ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy
 --      ["Slowpoke"] = "", -- 
@@ -1968,6 +1939,7 @@
 --      ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smugglers"] = "", -- A_Space_Adventure:desert01
+--      ["%s must collect the final crates."] = "", -- A_Space_Adventure:fruit02
 --      ["%s must skip this turn for rule violation."] = "", -- WxW
 --      ["Sneaks"] = "", -- Bazooka_Battlefield
 --      ["%s never got the ninja diploma."] = "", -- ClimbHome
@@ -1976,10 +1948,8 @@
 --      ["Sniper"] = "", -- HedgeEditor, The_Specialists
 --      ["Sniper Rifle"] = "", -- Continental_supplies
 	["Sniper Training"] = "Tréning pre ostreľovačov",
-	["Sniperz"] = "Ostreľovači",
 --      ["So, as promised I have brought you where I think that the device you are looking for is hidden."] = "", -- A_Space_Adventure:fruit02
 --      ["So far, you had infinite ropes, but in the|real world, ropes are usually limited."] = "", -- Basic_Training_-_Rope
---      ["So Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["So, I believe that it's a good place to start."] = "", -- A_Space_Adventure:desert01
 --      ["So, I kindly ask for your help."] = "", -- A_Space_Adventure:fruit01
@@ -1989,11 +1959,12 @@
 --      ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03
 --      ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen
 --      ["Some weapons can be dropped from the rope."] = "", -- Basic_Training_-_Rope
---      ["Somewhere else on the planet of fruits, Captain Lime helps Hog Solo"] = "", -- A_Space_Adventure:fruit02
---      ["Somewhere else on the planet of fruits Hog Solo gets closer to the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, Captain Lime helps %s"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, %s gets closer to the device"] = "", -- A_Space_Adventure:fruit02
 --      ["Somewhere on the Planet of Fruits a terrible war is about to begin ..."] = "", -- A_Space_Adventure:fruit01
 --      ["Somewhere on the uninhabitable Death Planet ..."] = "", -- A_Space_Adventure:death01
 --      ["So, now I got the last part and I have your friends captured."] = "", -- A_Space_Adventure:death01
+--      ["So, %s, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So the princess was never heard of again ..."] = "", -- A_Classic_Fairytale:family
 --      ["So, uhmm, how did you manage to teleport them so far?"] = "", -- A_Classic_Fairytale:epil
 --      ["Sour"] = "", -- 
@@ -2094,8 +2065,6 @@
 --      ["Structure Placement Mode"] = "", -- Construction_Mode
 --      ["Structure Placer"] = "", -- Construction_Mode
 --      ["Stupid, stupid Hogerians!"] = "", -- A_Space_Adventure:final
---      ["Subject 1"] = "", -- portal
---      ["Subjects"] = "", -- portal
 --      ["Subtract %d"] = "", -- HedgeEditor
 --      ["--- Sudden Death ---"] = "", -- Battalion
 --      ["Summer Squash"] = "", -- A_Space_Adventure:fruit01
@@ -2112,7 +2081,7 @@
 --      ["Surfer! +15 points!"] = "", -- Space_Invasion
 --      ["Surfer!"] = "", -- WxW
 --      ["Surprise supplies: Get 1-3 random weapons each turn."] = "", -- Continental_supplies
---      ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:shadow
+--      ["Survive!"] = "", -- A_Classic_Fairytale:shadow
 --      ["%s violated the “All But Last” rule and will be penalized."] = "", -- WxW
 --      ["%s violated the “Kill The Leader” rule and will be penalized."] = "", -- WxW
 --      ["Swap place with a random enemy in the circle."] = "", -- Continental_supplies
@@ -2131,6 +2100,7 @@
 --      ["%s! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
 --      ["Swing, Leaks A Lot, on the wings of the wind!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Swing: [Left]/[Right]"] = "", -- Basic_Training_-_Rope
+--      ["%s wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome
 --      ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer
 --      ["switch"] = "", -- Continental_supplies
@@ -2144,6 +2114,7 @@
 --      ["Switch Hog"] = "", -- Construction_Mode
 --      ["Switch: Select weapon special"] = "", -- Continental_supplies
 --      ["Switch: Toggle crate radar"] = "", -- WxW
+--      ["%s won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Swords"] = "", -- Bazooka_Battlefield
 --      ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon
 --      ["%s, you may choose the rules."] = "", -- WxW
@@ -2152,6 +2123,8 @@
 --      ["Tails"] = "", -- 
 --      ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Tall Potato"] = "", -- A_Space_Adventure:fruit01
+--      ["Tap [Pause] to see the mission texts"] = "", -- Basic_Training_-_Movement
+--      ["Tap the “rotating arrow” button on the left|until you have selected Cappy, the hedgehog with the cap!"] = "", -- Basic_Training_-_Movement
 --      ["Target"] = "", -- HedgeEditor
 --      ["Target Placement Mode"] = "", -- Construction_Mode
 --      ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor
@@ -2167,15 +2140,18 @@
 --      ["Tatters"] = "", -- 
 --      ["Team %d"] = "", -- SimpleMission
 	["Team %d: "] = "Tím %d: ",
+--      ["Team highscore: %d"] = "", -- Utils
 --      ["Team Identity Mode"] = "", -- HedgeEditor
 --      ["TEAM IDENTITY MODE"] = "", -- HedgeEditor
---      ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
+--      ["Team lowscore: %d"] = "", -- Utils
 --      ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion
+--      ["Team's best time: %.3fs"] = "", -- Utils
 --      ["Team Scores:"] = "", -- Control
 --      ["Team scores:"] = "", -- Space_Invasion
+--      ["Team's longest time: %.3fs"] = "", -- Utils
+--      ["Team's top accuracy: %d%"] = "", -- Utils
 --      ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2
 --      ["Teamwork"] = "", -- User_Mission_-_Teamwork
---      ["Team Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
 --      ["TechRacer"] = "", -- TechRacer
 --      ["Teleporation Node"] = "", -- Construction_Mode
 --      ["Teleportation Mode"] = "", -- Construction_Mode
@@ -2267,11 +2243,12 @@
 --      ["The forgotten continent"] = "", -- Continental_supplies
 --      ["The giant umbrella from the last crate should help break the fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Great Escape"] = "", -- User_Mission_-_The_Great_Escape
---      ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01
+--      ["- The green target must survive"] = "", -- HedgeEditor
+--      ["- The green targets must survive"] = "", -- HedgeEditor
 --      ["The guardian"] = "", -- A_Classic_Fairytale:shadow
 --      ["The hardships of the war turned %s (%s) into a killing machine: %d invaders destroyed in one round!"] = "", -- Space_Invasion
+--      ["The health of your current hedgehog|is shown at the top right corner."] = "", -- Basic_Training_-_Movement
 --      ["The hedgehog with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant
---      ["The Hogies"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["The Hospital"] = "", -- 
 --      ["The Individualist"] = "", -- A_Classic_Fairytale:shadow
 --      ["Their buildings were very primitive back then, even for an uncivilised island."] = "", -- A_Classic_Fairytale:united
@@ -2289,7 +2266,6 @@
 --      ["The Mutant has super-weapons and a lot of health."] = "", -- Mutant
 --      ["The Mutant loses health quickly, but gains health by killing."] = "", -- Mutant
 --      ["The Mutant loses health quickly if he doesn't keep scoring kills."] = "", -- Mutant
-        ["The Nameless One"] = "Bez mena",
 --      ["The Navy greets %s for managing to get in a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["The next 4 times you play the \"The last encounter\" mission you'll get 20 more hit points and a laser sight."] = "", -- A_Space_Adventure:death02
 --      ["The next crate is an utility crate."] = "", -- Basic_Training_-_Movement
@@ -2303,6 +2279,7 @@
 --      ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil
 --      ["The oppression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
 --      ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
+--      ["The other hog has died, he should have survived!"] = "", -- A_Space_Adventure:moon02
 --      ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Police"] = "", -- 
 --      ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -2327,7 +2304,7 @@
 --      ["The Showdown"] = "", -- A_Classic_Fairytale:shadow
 --      ["The Slaughter"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:first_blood
 --      ["The Society of Perfectionists greets %s (%s): No misses and %d hits in its best round."] = "", -- Space_Invasion
-        ["THE SPECIALISTS"] = "ŠPECIALISTI",
+--      ["The Specialists: Each hedgehog starts with its own weapon set"] = "", -- The_Specialists
 --      ["The spinning arrows above your hedgehog show|which hedgehog is selected right now."] = "", -- Basic_Training_-_Movement
 --      ["The spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
@@ -2375,7 +2352,6 @@
 --      ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["This also increases the effectiveness of Medicine."] = "", -- Continental_supplies
 --      ["This game wasn’t really exciting."] = "", -- Space_Invasion
---      ["This Hog Solo is so naive! When he returns I'll shoot him and keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This is a new personal best, congratulations!"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert02, A_Space_Adventure:fruit03
 --      ["This is a new personal best time, congratulations!"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["This is Cappy."] = "", -- Basic_Training_-_Movement
@@ -2393,6 +2369,7 @@
         ["This rain is really something..."] = "Ten dážď naozaj stojí za to...",
 --      ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome
 --      ["This seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01
+--      ["This %s is so naive! I'm going to shoot this fool so I can keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This was an awesome performance! But this challenge can be finished with even just one RC plane. Can you figure out how?"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["This will be fun!"] = "", -- A_Classic_Fairytale:enemy
 --      ["This will be useful when I need a new platform or if I want to rise."] = "", -- portal
@@ -2434,11 +2411,11 @@
 --      ["To begin with the training, hit the attack key!"] = "", -- Basic_Training_-_Movement
 --      ["To begin with the training, select the bazooka from the ammo menu!"] = "", -- Basic_Training_-_Bazooka
 --      ["To begin with the training, select the grenade from the ammo menu!"] = "", -- Basic_Training_-_Grenade
+--      ["To begin with the training, tap the attack button!"] = "", -- Basic_Training_-_Movement
 --      ["To finish hedgehog selection, just do anything|with him, like walking."] = "", -- Basic_Training_-_Movement
 --      ["To get over the next obstacles, keep some distance from the wall before you back jump."] = "", -- Basic_Training_-_Movement
 --      ["To get over the water, you have to do multiple|rope shots and swings."] = "", -- Basic_Training_-_Rope
 --      ["Toggle Editing Weapons and Tools: [Precise]+[2]"] = "", -- HedgeEditor
---      ["Toggle Gear Information: [Precise]+[3]"] = "", -- HedgeEditor
 --      ["Toggle Help: [Precise]+[1]"] = "", -- HedgeEditor
 --      ["Toggle Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Toggle Shield: [Long jump]"] = "", -- Space_Invasion
@@ -2448,14 +2425,14 @@
 --      ["Too bad! Then you should really leave!"] = "", -- A_Space_Adventure:fruit01
 --      ["Too slow! Try again ..."] = "", -- A_Space_Adventure:moon02
 --      ["Top-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"] = "", -- A_Classic_Fairytale:shadow
 --      ["To reach higher ground, walk to a ledge, look to the left, then do a back jump."] = "", -- Basic_Training_-_Movement
 --      ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey
 --      ["To the caves..."] = "", -- A_Classic_Fairytale:united
 --      ["Touch all waypoints as fast as you can!"] = "", -- Racer
---      ["To win the game, Hog Solo has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
+--      ["- Touch the sparkles near your base to teleport"] = "", -- CTF_Blizzard
+--      ["To win the game, %s has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
 --      ["To win the game you had to collect the 2 crates with no specific order."] = "", -- A_Space_Adventure:desert01
---      ["To win the game you have to eliminate all your enemies."] = "", -- A_Space_Adventure:death01
+--      ["To win the game you have to eliminate Professor Hogevil."] = "", -- A_Space_Adventure:death01
 --      ["To win the game you have to find the right crate."] = "", -- A_Space_Adventure:desert01
 --      ["To win the game you have to go next to Thanta."] = "", -- A_Space_Adventure:ice01
 --      ["To win the game you have to go to the surface."] = "", -- A_Space_Adventure:desert02
@@ -2464,13 +2441,10 @@
         ["Toxic Team"] = "Toxic tím", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Track completed!"] = "", -- Racer, TechRacer
         ["Track Time: "] = "Čas: ",
---      ["Trainee"] = "", -- TargetPractice
 --      ["Training"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Training complete!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Training Team"] = "", -- TargetPractice
 --      ["Traitors"] = "", -- A_Classic_Fairytale:epil
 --      ["Traitors don't get to shout around here!"] = "", -- A_Classic_Fairytale:epil
---      ["Trapped"] = "", -- Basic_Training_-_Movement
 --      ["Trapper"] = "", -- HedgeEditor
 --      ["Travel carefully as your fuel is limited"] = "", -- A_Space_Adventure:cosmos
 --      ["Travel to all the neighbor planets and collect all the pieces"] = "", -- A_Space_Adventure:cosmos
@@ -2487,7 +2461,6 @@
 --      ["Try to land softly, as you can still take fall damage!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Try to protect the chief! You won't lose if he dies, but it is advised that he survives."] = "", -- A_Classic_Fairytale:united
 --      ["Try to reach and destroy the next target quickly."] = "", -- Basic_Training_-_Rope
-        ["T_T"] = "T_T",
 --      ["Tumbler"] = "", -- Tumbler
 --      ["Turn around: [Left Shift] + [Left]/[Right]"] = "", -- Basic_Training_-_Movement
 --      ["Turning Around"] = "", -- Basic_Training_-_Movement
@@ -2506,7 +2479,6 @@
 --      ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy
 --      ["Ukemi"] = "", -- 
 --      ["Ultra kill!"] = "", -- Mutant
---      ["Ultrasoldier"] = "", -- Big_Armory
 --      ["unC0Rr"] = "", -- 
 --      ["Under Construction"] = "", -- A_Classic_Fairytale:shadow
 --      ["Under normal circumstances we could easily defeat them but we have kindly sent most of our men to the Kingdom of Sand to help with the annual dusting of the king's palace."] = "", -- A_Space_Adventure:fruit01
@@ -2531,7 +2503,6 @@
         ["Unit"] = "Jednotka",
 --      ["Unlike bazookas, grenades are not influenced by wind."] = "", -- Basic_Training_-_Grenade
 --      ["Unlimited Attacks: Attacks don't end your turn"] = "", -- User_Mission_-_Diver, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree
-        ["Unlimited Attacks"] = "Neobmedzené útoky",
 --      ["Unlucky Sods"] = "", -- User_Mission_-_Rope_Knock_Challenge
         ["Unstoppable!"] = "Nezastaviteľný!",
 --      ["Unsuspecting Louts"] = "", -- User_Mission_-_Rope_Knock_Challenge
@@ -2546,13 +2517,14 @@
 --      ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood
         ["User Challenge"] = "Výzva",
 --      ["!"] = "", -- User_Mission_-_Dangerous_Ducklings
+--      ["User Mission"] = "", -- HedgeEditor
 --      ["Use the attack key twice to change the flying saucer while being in air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the attack key twice to change the flying saucer while floating in mid-air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the bazooka and the flying saucer to get the freezer."] = "", -- A_Space_Adventure:ice01
 --      ["Use the flying saucer from the crate to fly to the moon."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly the other planets."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly to the other planets."] = "", -- A_Space_Adventure:cosmos
---      ["Use the parachute ([Space] while in air) to get the next crate"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Use the parachute to get the next crate."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Use the portal gun to get to the next crate, then use the new gun to get to the final destination!|"] = "", -- A_Classic_Fairytale:dragon
 --      ["Use the RC plane and destroy the all the targets."] = "", -- A_Space_Adventure:desert03
 --      ["Use the rope in order to catch the blue hedgehog"] = "", -- A_Space_Adventure:moon02
@@ -2587,7 +2559,6 @@
 --      ["Victory Condition: Collect"] = "", -- HedgeEditor
 --      ["Victory Condition: Destroy"] = "", -- HedgeEditor
 --      ["Victory for %s!"] = "", -- Capture_the_Flag
-        ["Victory for the "] = "Víťazstvo pre", -- CTF_Blizzard, Capture_the_Flag
 --      ["Violence is not the answer to your problems!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos
 --      ["Vladimir"] = "", -- 
@@ -2606,9 +2577,6 @@
 --      ["Walls left: %d"] = "", -- WxW
 --      ["Wall to wall"] = "", -- WxW
 --      ["Waluigi"] = "", -- 
---      ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Wannabe Ropers"] = "", -- Basic_Training_-_Rope
---      ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Wario"] = "", -- 
 --      ["Warming Up"] = "", -- Basic_Training_-_Grenade
 --      ["Warning: Fire cake detected"] = "", -- ClimbHome
@@ -2637,7 +2605,6 @@
 --      ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion
 --      ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion
 --      ["Weapon specials: Some weapons have special modes (see weapon description)."] = "", -- Continental_supplies
-        ["Weapons Reset"] = "Reset zbraní",
 --      ["Weapons reset: The weapons are reset after each turn."] = "", -- WxW
 --      ["We are indeed."] = "", -- A_Classic_Fairytale:backstab
 --      ["We can't defeat them!"] = "", -- A_Classic_Fairytale:shadow
@@ -2654,9 +2621,9 @@
 --      ["We have to hurry! Are you armed?"] = "", -- A_Space_Adventure:moon01
 --      ["We have to protect the village!"] = "", -- A_Classic_Fairytale:united
 --      ["We have to unite and defeat those cylergs!"] = "", -- A_Classic_Fairytale:enemy
---      ["Welcome Hog Solo, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome home! Please take a seat"] = "", -- ClimbHome
 --      ["Welcome, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey
+--      ["Welcome, %s, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome to the Death Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
@@ -2823,16 +2790,16 @@
 --      ["You can’t open a portal on the blue surface."] = "", -- portal
 --      ["You can use the other 2 hogs to assist you."] = "", -- A_Space_Adventure:fruit02
 --      ["You can use the rope to reach new places."] = "", -- Basic_Training_-_Rope
---      ["You choose well, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You choose well, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You completed the mission in %.3f seconds."] = "", -- A_Space_Adventure:ice02
 --      ["You completed the mission in %d rounds."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03
---      ["You couldn't have come to a worse time, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You couldn't have come to a worse time, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You couldn't possibly believe that after refusing my offer I'd just let you go!"] = "", -- A_Classic_Fairytale:journey
         ["You'd almost swear the water was rising!"] = "Prisahal by si, že voda stúpa!",
 --      ["You'd better watch your steps..."] = "", -- A_Classic_Fairytale:journey
 --      ["You defended yourself against Captain Lime."] = "", -- A_Space_Adventure:fruit02
---      ["You defended yourself against the Fruit Assassins."] = "", -- A_Space_Adventure:fruit02
---      ["You did great, Hog Solo! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
+--      ["You defended yourself against %s."] = "", -- A_Space_Adventure:fruit02
+--      ["You did great, %s! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
 --      ["You did not make it in time, try again!"] = "", -- Basic_Training_-_Rope
 --      ["You don't deserve my sacrifice!"] = "", -- A_Classic_Fairytale:queen
 --      ["You drove Professor Hogevil away."] = "", -- A_Space_Adventure:moon01
@@ -2848,12 +2815,12 @@
 --      ["You got me!"] = "", -- A_Space_Adventure:moon02
 --      ["You had %.1fs remaining on the clock (+%d points)."] = "", -- TargetPractice
 --      ["You had %.2fs remaining on the clock (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle
---      ["You had %d additional flying saucers left."] = "", -- A_Space_Adventure:ice02
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: you might want to use some mines..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: You might want to use some mines ..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01
 --      ["You have activated Switch Hedgehog!"] = "", -- Basic_Training_-_Movement
 --      ["You have beaten the challenge!"] = "", -- ClimbHome
+--      ["You have beaten the team record, congratulations!"] = "", -- Utils
 --      ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab
 --      ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united
 --      ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01
@@ -2872,7 +2839,6 @@
 --      ["You have eliminated all visible enemy hedgehogs!"] = "", -- A_Space_Adventure:fruit01
 --      ["You have eliminated Professor Hogevil."] = "", -- A_Space_Adventure:moon01
 --      ["You have eliminated the evil minions."] = "", -- A_Space_Adventure:moon01
---      ["You have eliminated the whole evil team. You're pretty tough!"] = "", -- A_Space_Adventure:moon01
 --      ["You have escaped successfully."] = "", -- A_Space_Adventure:desert02
 --      ["You have failed to complete your task, young one!"] = "", -- A_Classic_Fairytale:journey
 --      ["You have failed to save the tribe!"] = "", -- A_Classic_Fairytale:backstab
@@ -2926,6 +2892,7 @@
 --      ["You have to travel again"] = "", -- A_Space_Adventure:cosmos
 --      ["You have to try again!"] = "", -- A_Space_Adventure:cosmos
 --      ["You have triggered the secret Do-Not-Rope-to-the-Moon Defense System."] = "", -- A_Space_Adventure:cosmos
+--      ["You have unlocked the target radar!"] = "", -- TargetPractice
 --      ["You have used %d flying saucers."] = "", -- A_Space_Adventure:ice02
 --      ["You have used %d RC planes."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["You have used only 1 RC plane. Outstanding!"] = "", -- User_Mission_-_RCPlane_Challenge
@@ -2944,10 +2911,9 @@
 --      ["You'll have only 2 watermelon bombs during the game."] = "", -- A_Space_Adventure:fruit03
 --      ["You'll have only one RC plane at the start of the mission."] = "", -- A_Space_Adventure:desert03
 --      ["You'll have to eliminate Captain Lime at the end."] = "", -- A_Space_Adventure:fruit02
---      ["You'll have to eliminate the Fruit Assassins at the end."] = "", -- A_Space_Adventure:fruit02
+--      ["You'll have to eliminate %s at the end."] = "", -- A_Space_Adventure:fruit02
 --      ["You'll lose if you die or if your time is up."] = "", -- A_Space_Adventure:moon02
 --      ["You'll see what I mean!"] = "", -- A_Classic_Fairytale:enemy
---      ["You lose!"] = "", -- Basic_Training_-_Sniper_Rifle, Big_Armory, Basic_Training_-_Bazooka, TargetPractice, ClimbHome
 --      ["You lost your target, try again!"] = "", -- TargetPractice
 --      ["You may find it handy."] = "", -- A_Space_Adventure:cosmos
 --      ["You may only attack from a rope!"] = "", -- WxW
@@ -2969,8 +2935,7 @@
 --      ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice
 --      ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice
 --      ["Your ammo is limited this time."] = "", -- Basic_Training_-_Bazooka
---      ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy
---      ["Your deaths will be avenged, Natives!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Your deaths will be avenged, %s!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Your death will not be in vain, Dense Cloud!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You're a coward!"] = "", -- A_Classic_Fairytale:queen
 --      ["You're...alive!? But we saw you die!"] = "", -- A_Classic_Fairytale:backstab
@@ -2998,21 +2963,21 @@
 --      ["Your next task is to collect some crates by using the rope!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Your personal best time so far: %.3f seconds"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["Your rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["You saved %d of 8 Hapless Hogs."] = "", -- User_Mission_-_That_Sinking_Feeling
+--      ["Your rope is gone! Try again!"] = "", -- Basic_Training_-_Rope
+--      ["You saved %d of 8 hegehogs."] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen
 --      ["You see the wind strength at the bottom right corner."] = "", -- Basic_Training_-_Bazooka
+--      ["You see the wind strength at the top."] = "", -- Basic_Training_-_Bazooka
 --      ["You should have known that we don't rely on meatbags!"] = "", -- A_Classic_Fairytale:queen
 --      ["You should know this more than anyone, Leaks!"] = "", -- A_Classic_Fairytale:queen
 --      ["You speak great truth, Hannibal. Here, take a sip!"] = "", -- A_Classic_Fairytale:epil
 --      ["You've been assaulting us, we have been just defending ourselves!"] = "", -- A_Classic_Fairytale:enemy
-        ["You've failed. Try again."] = "Neuspeli ste. Skúste to znova.",
 	["You've reached the goal!| |Time: "] = "Dosiahli ste cieľ!| |Čas: ",
 --      ["You will be avenged!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You will fail if you run out of ammo and there are still targets available."] = "", -- A_Space_Adventure:desert03
 --      ["You will gain some extra ammo from the crates the next time you play the \"Getting to the device\" mission."] = "", -- A_Space_Adventure:fruit03
 --      ["You will play every 3 turns."] = "", -- A_Space_Adventure:fruit01
 --      ["- You will recieve 2-4 weapons on each kill! (Even on own hogs)"] = "", -- Continental_supplies
---      ["You win!"] = "", -- Big_Armory
 --      ["You won't believe what happened to me!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Yuck! I bet they'll keep worshipping her even after I save the village!"] = "", -- A_Classic_Fairytale:family
 --      ["Yumme Gunpowder"] = "", -- 
@@ -3020,6 +2985,7 @@
 --      ["Zombie"] = "", -- 
 --      ["Zombi"] = "", -- portal
 	["'Zooka Team"] = "Bazuka tím",
---      ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
+--      ["Zoom: [Pinch] with 2 fingers"] = "", -- Basic_Training_-_Movement
+--      ["Zoom: [Rotate mouse wheel]"] = "", -- Basic_Training_-_Movement
 --      ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen
 }
--- a/share/hedgewars/Data/Locale/stub.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/stub.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -23,7 +23,6 @@
 --      ["Above-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Accuracy Bonus! +15 points"] = "", -- Space_Invasion
 --      ["Accuracy bonus: +%d points"] = "", -- Basic_Training_-_Sniper_Rifle
---      ["Ace"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge
 --      ["Achievement gotten: %s"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_That_Sinking_Feeling, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, Basic_Training_-_Rope, Tumbler
 --      ["A Classic Fairytale"] = "", -- A_Classic_Fairytale:first_blood
 --      ["A crate critical to this mission has been destroyed."] = "", -- SimpleMission
@@ -43,7 +42,6 @@
 --      ["Again with the 'cannibals' thing!"] = "", -- A_Classic_Fairytale:enemy
 --      ["A Hedgewars minigame"] = "", -- Capture_the_Flag
 --      ["A Hedgewars mini-game"] = "", -- Racer, Space_Invasion, TechRacer, Tumbler
---      ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
 --      ["A Hedgewars tag game"] = "", -- Mutant
 --      ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome
 --      ["Aim at the ceiling and hold [Attack] pressed until the rope attaches."] = "", -- Basic_Training_-_Rope
@@ -134,13 +132,14 @@
 --      ["As you've seen, the dropped grenade roughly fell into your flying direction."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Athlete"] = "", -- Battalion
 --      ["Attack: Activate"] = "", -- Racer
---      ["Attack Captain Lime before he attacks back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack Captain Lime before he attacks back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack From Rope: %s"] = "", -- WxW
 --      ["Attack From Rope: You may only attack from a rope."] = "", -- WxW
 --      ["Attack rule: %s"] = "", -- WxW
 --      ["Attack: Select this continent"] = "", -- Continental_supplies
 --      ["Attack: [Space]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
---      ["Attack the assassins before they attack back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack: Tap the [Bomb]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
+--      ["Attack the assassins before they attack back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack: Throw ball"] = "", -- Knockball
 --      ["At the end of the game your health was %d."] = "", -- A_Space_Adventure:ice01
 --      ["At the start of the game each enemy hog has only the weapon that he is named after."] = "", -- A_Space_Adventure:death02
@@ -148,16 +147,18 @@
 --      ["Available weapon specials:"] = "", -- Continental_supplies
 --      ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion
---      ["Avoid the mines!"] = "", -- Basic_Training_-_Rope
 --      ["Axes"] = "", -- Bazooka_Battlefield
 --      ["Aye! Fellow! Let me exit this chamber of doom!"] = "", -- A_Classic_Fairytale:epil
 --      ["Back Breaker"] = "", -- A_Classic_Fairytale:backstab
 --      ["Back in the village, after telling the villagers about the threat..."] = "", -- A_Classic_Fairytale:united
 --      ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil
 --      ["Back Jump: [Backspace] ×2"] = "", -- Basic_Training_-_Movement
+--      ["Back Jump: Double-tap the [Curvy Arrow]"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (1/2)"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (2/2)"] = "", -- Basic_Training_-_Movement
 --      ["Backstab"] = "", -- A_Classic_Fairytale:backstab
+--      ["Backwards jump: Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Backwards jump: Tap the [Curvy Arrow] twice"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Bacon"] = "", -- 
 --      ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Badmad"] = "", -- portal
@@ -189,7 +190,6 @@
 --      ["Bazooka Battlefield"] = "", -- Bazooka_Battlefield
 --      ["Bazooka Master"] = "", -- Basic_Training_-_Bazooka
 --      ["Bazookas are influenced by wind."] = "", -- Basic_Training_-_Bazooka
---      ["Bazooka Team"] = "", -- Basic_Training_-_Bazooka
 --      ["Bearded Beast"] = "", -- 
 --      ["Be careful, the future of Hogera is in your hands!"] = "", -- A_Space_Adventure:cosmos
 --      ["Be careful, your fuel is limited from now on!"] = "", -- Basic_Training_-_Flying_Saucer
@@ -221,7 +221,6 @@
 --      ["Bloodpie"] = "", -- A_Classic_Fairytale:backstab
 --      ["Bloodrocutor"] = "", -- A_Classic_Fairytale:shadow
 --      ["Bloodsucker"] = "", -- A_Classic_Fairytale:shadow
---      ["Bloody Rookies"] = "", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 --      ["Blue"] = "", -- 
 --      ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Bob"] = "", -- A_Space_Adventure:cosmos
@@ -303,7 +302,9 @@
 --      ["Challenge objectives"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit03, A_Space_Adventure:moon02
 --      ["Challenge over!"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Challenge"] = "", -- SpeedShoppa
+--      ["Change bounciness: Tap [B]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Content: [Left], [Right]"] = "", -- HedgeEditor
+--      ["Change detonation timer: Tap the [Clock]"] = "", -- Basic_Training_-_Grenade, A_Classic_Fairytale:shadow
 --      ["Change direction: [Left]/[Right]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Change Health: [Left], [Right]"] = "", -- HedgeEditor
@@ -323,6 +324,8 @@
 --      ["Chicken"] = "", -- 
 --      ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01
 --      ["Chikorita"] = "", -- 
+--      ["Choose location: Left click"] = "", -- A_Classic_Fairytale:shadow
+--      ["Choose location: Tap the [Target] button, then tap on the spot you want to choose"] = "", -- A_Classic_Fairytale:shadow
 --      ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Choose your continent wisely, as your decision will be permanent."] = "", -- Continental_supplies
 --      ["Choose your side! If you want to join the strange man, walk up to him.|Otherwise, walk away from him. If you decide to att...nevermind..."] = "", -- A_Classic_Fairytale:shadow
@@ -331,7 +334,6 @@
 --      ["Cleaver"] = "", -- Construction_Mode
 --      ["Cleaver Placement Mode"] = "", -- Construction_Mode
 --      ["CLEAVER PLACEMENT MODE"] = "", -- HedgeEditor
---      ["Climber"] = "", -- ClimbHome
 --      ["Climb Home"] = "", -- ClimbHome
 --      ["Closing in"] = "", -- A_Classic_Fairytale:queen
 --      ["Clown"] = "", -- HedgeEditor
@@ -340,11 +342,13 @@
 --      ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb
 --      ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey
 --      ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey
+--      ["- Collect all the blue crates"] = "", -- HedgeEditor
 --      ["Collect all the crates, but remember, our time in this life is limited!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect or destroy all the health crates."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Collect or destroy the final crate to finish the training."] = "", -- Basic_Training_-_Flying_Saucer
+--      ["- Collect the blue crate"] = "", -- HedgeEditor
 --      ["Collect the crate and attack!"] = "", -- WxW
---      ["Collect the crate on the right.|Hint: Select the rope, [Up] or [Down] to aim, [Space] to fire, directional keys to move.|Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Collect the crate on the right."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the crates within the time limit!|If you fail, you'll have to try again."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the first crate to begin!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Collect the freezer and get the device part from Thanta."] = "", -- A_Space_Adventure:ice01
@@ -406,7 +410,6 @@
 --      ["Crates: Crates drop randomly with chance of being empty"] = "", -- Battalion
 --      ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates per turn: %d"] = "", -- WxW
---      ["crate(s)"] = "", -- SpeedShoppa
 --      ["Crazy Gravity: Gravity randomly changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity
 --      ["Crazy Runner"] = "", -- A_Space_Adventure:moon02
 --      ["Cricket Time"] = "", -- Continental_supplies
@@ -435,10 +438,9 @@
 --      ["Deals 15 damage to all enemies in the circle."] = "", -- Continental_supplies
 --      ["Deer"] = "", -- 
 --      ["Defeat all enemies!"] = "", -- portal
+--      ["Defeat!"] = "", -- HedgeEditor
 --      ["Defeat Professor Hogevil!"] = "", -- A_Space_Adventure:death01
---      ["Defeat the cannibals"] = "", -- A_Classic_Fairytale:backstab
---      ["Defeat the cannibals!|"] = "", -- A_Classic_Fairytale:united
---      ["Defeat the cannibals!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
+--      ["Defeat the cannibals!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cyborgs!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen
 --      ["Delete Waypoint"] = "", -- HedgeEditor
@@ -457,11 +459,11 @@
 --      ["Destroyer of planes"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Destroy him, Leaks A Lot! He is responsible for the deaths of many of us!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion
+--      ["- Destroy the enemy"] = "", -- HedgeEditor
+--      ["- Destroy the red target"] = "", -- HedgeEditor
+--      ["- Destroy the red targets"] = "", -- HedgeEditor
 --      ["Destroy the targets!"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
---      ["Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
---      ["Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"] = "", -- A_Classic_Fairytale:first_blood
 --      ["+%d flamer fuel!"] = "", -- Tumbler
---      ["%d Hapless Hogs left"] = "",
 --      ["%d-Hit Combo! +%d points!"] = "", -- Space_Invasion
 --      ["Did anyone follow you?"] = "", -- A_Classic_Fairytale:united
 --      ["Did I miss something?"] = "", -- Space_Invasion
@@ -479,7 +481,6 @@
 --      ["Disabled"] = "", -- WxW
 --      ["Disguise as a Rockhopper Penguin"] = "", -- Continental_supplies
 --      ["Displacer"] = "", -- 
---      ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Diver"] = "", -- User_Mission_-_Diver
 --      ["%d ms"] = "", -- HedgeEditor
 --      ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen
@@ -558,10 +559,8 @@
 --      ["Ehm, okay ..."] = "", -- A_Space_Adventure:moon01
 --      ["Elderbot"] = "", -- A_Classic_Fairytale:family
 --      ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "", --Bazooka, Shotgun, SniperRifle
---      ["Eliminate the Blue Team before the time runs out."] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Eliminate the enemy before the time runs out."] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 --      ["Eliminate the enemy hogs to win."] = "",
---      ["Eliminate the enemy specialists."] = "",
 --      ["Eliminate the enemy."] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh
 --      ["Eliminate Unit 3378."] = "", -- User_Mission_-_Teamwork
 --      ["Eliminate WatchBot 4000."] = "", -- User_Mission_-_Teamwork_2
@@ -584,13 +583,14 @@
 --      ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab
 --      ["Except me, of course! I just saved a whole planet!"] = "", -- A_Space_Adventure:final
 --      ["Experienced beginner"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Explore the tunnel with the other hedgehogs and search for the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Explore the tunnel with the other hedgehogs and search for the device."] = "", -- A_Space_Adventure:fruit02
 --      ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02
 --      ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey
 --      ["Fair Wind"] = "", -- 
 --      ["Fall Damage"] = "", -- Basic_Training_-_Movement
 --      ["Fallen Angel"] = "", -- Tentacle_Terror
 --      ["Family Reunion"] = "", -- A_Classic_Fairytale:family
+--      ["Fastest escape: %d turns"] = "", -- A_Space_Adventure:desert02
 --      ["Fastest lap: %.3fs by %s"] = "", -- TrophyRace
 --      ["Feeble Resistance"] = "",
 --      ["Fell From Grace"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen
@@ -609,11 +609,12 @@
 --      ["Final result"] = "", -- Mutant
 --      ["Final Targets"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
 --      ["Final team scores:"] = "", -- Space_Invasion
+--      ["Find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Find a way to detonate all the explosives and stay alive!"] = "", -- A_Space_Adventure:final
 --      ["Find your tribe!|Cross the lake!"] = "", -- A_Classic_Fairytale:dragon
 --      ["Finish this challenge as fast as possible to earn bonus points."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Finish waypoint placement"] = "", -- Racer
---      ["Finish your training|Hint: Animations can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Finish your training."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Finite Ropes"] = "", -- Basic_Training_-_Rope
 --      ["Fire a rocket with napalm."] = "", -- Continental_supplies
 --      ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler
@@ -639,6 +640,7 @@
 --      ["Flying Saucer Training"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Fly into space to fight off the invaders with barrels!"] = "", -- Space_Invasion
 --      ["Fly to the meteorite and detonate the explosives"] = "", -- A_Space_Adventure:cosmos
+--      ["Follow the path and destroy the next target."] = "", -- Basic_Training_-_Rope
 --      ["Forgetfulness: You will lose all your weapons each turn."] = "", -- Continental_supplies
 --      ["For the next crate, you have to do back jumps."] = "", -- Basic_Training_-_Movement
 --      ["Four Eyes"] = "", -- 
@@ -658,8 +660,6 @@
 --      ["“g=150”, where 150 is 150% of normal gravity."] = "", -- Gravity
 --      ["“g=50, g2=150, period=4000” for gravity changing|from 50 to 150 and back with period of 4000 ms."] = "", -- Gravity
 --      ["Galaxy Guardians"] = "", -- Big_Armory
---      ["Game Modifiers: "] = "",
---      ["GAME OVER!"] = "",
 --      ["Game over!"] = "", -- Space_Invasion
 --      ["Game Started!"] = "",
 --      ["Game? Was this a game to you?!"] = "", -- A_Classic_Fairytale:enemy
@@ -668,8 +668,6 @@
 --      ["Gasp! A smuggler!"] = "", -- A_Space_Adventure:desert01
 --      ["Gasp!"] = "", -- A_Space_Adventure:desert01
 --      ["Gathering fruits all day long."] = "", -- A_Classic_Fairytale:queen
---      ["Gear information hidden"] = "", -- HedgeEditor
---      ["Gear information shown"] = "", -- HedgeEditor
 --      ["Gear Placement Tool"] = "", -- HedgeEditor
 --      ["General information:"] = "", -- Continental_supplies
 --      ["General Lemon"] = "", -- A_Space_Adventure:fruit01
@@ -678,7 +676,7 @@
 --      ["Get Dense Cloud out of the pit!"] = "", -- A_Classic_Fairytale:journey
 --      ["Get him, Spike!"] = "", -- A_Space_Adventure:desert01
 --      ["Get on over there and take him out!"] = "",
---      ["Get on the head of the mole"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Get on the head of the mole."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Get past the flower."] = "", -- A_Classic_Fairytale:journey
 --      ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01
 --      ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood
@@ -713,7 +711,6 @@
 --      ["GO! GO! GO!"] = "",
 --      ["Good birdy......"] = "",
 --      ["Good bye!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Good Dude"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Good idea, they'll never find us there!"] = "", -- A_Classic_Fairytale:united
 --      ["Good job!"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Good job! Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -724,7 +721,7 @@
 --      ["Good so far!"] = "",
 --      ["Good to go!"] = "",
 --      ["Good! You now control Cappy."] = "", -- Basic_Training_-_Movement
---      ["Go on top of the flower"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Go on top of the flower."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Go, quick!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Gorkij"] = "", -- A_Classic_Fairytale:journey
 --      ["Go surf!"] = "", -- WxW
@@ -746,7 +743,6 @@
 --      ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow
 --      ["Green"] = "", -- 
 --      ["Green Bananas"] = "", -- A_Space_Adventure:fruit01
---      ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Green double rings also give you a new flying saucer."] = "", -- A_Space_Adventure:ice02
 --      ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01
 --      ["Greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge
@@ -754,11 +750,8 @@
 --      ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Greetings from the Navy, %s (%s), for being a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["Greetings, %s!"] = "", -- A_Classic_Fairytale:dragon
---      ["Greg"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
---      ["Grenade Group"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard
 --      ["Grenades explode after 1 to 5 seconds (you decide)."] = "", -- Basic_Training_-_Grenade
 --      ["Grenades with high bounciness bounce a lot and behave chaotic."] = "", -- Basic_Training_-_Grenade
---      ["Grenade Team"] = "", -- Basic_Training_-_Grenade
 --      ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard
 --      ["Grey"] = "", -- 
 --      ["Guards"] = "", -- A_Space_Adventure:cosmos
@@ -793,7 +786,6 @@
 --      ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion
 --      ["Health Modification Mode"] = "", -- HedgeEditor
 --      ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor
---      ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
 --      ["Heavenly Defense"] = "", -- Tentacle_Terror
 --      ["Heavy"] = "",
 --      ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united
@@ -805,6 +797,7 @@
 --      ["Hedgehog"] = "", -- 
 --      ["Hedgehog Projectile"] = "", -- Continental_supplies
 --      ["Hedgehogs can not be deleted."] = "", -- HedgeEditor
+--      ["Hedgehogs left: %d"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Hedgehogs will be revived after their death."] = "", -- Mutant
 --      ["Hedgehogs will start in the first waypoint."] = "", -- Racer
 --      ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab
@@ -820,7 +813,6 @@
 --      ["Help Enabled"] = "", -- HedgeEditor
 --      ["Helpers: Each team starts with %d helper points"] = "", -- Battalion
 --      ["Helpers: Hogs will get 1 out of 2 helpers randomly each turn"] = "", -- Battalion
---      ["Help Hog Solo to find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Help me, Leaks!"] = "", -- A_Classic_Fairytale:journey
 --      ["Help me, please!"] = "", -- A_Classic_Fairytale:journey
 --      ["He moves like an eagle in the sky."] = "", -- A_Classic_Fairytale:first_blood
@@ -834,20 +826,20 @@
 --      ["Here you will find the current mission instructions."] = "", -- Basic_Training_-_Movement
 --      ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Heroic Wind"] = "", -- Continental_supplies
---      ["Hero Team"] = "", -- User_Mission_-_The_Great_Escape
 --      ["He's so brave..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["He was the lab assistant of Dr. Goodhogan, the inventor of the anti-gravity device."] = "", -- A_Space_Adventure:moon02
 --      ["He won't be selling us out anymore!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey, don't forget us! We still need to climb up!"] = "", -- A_Classic_Fairytale:family
 --      ["Hey, guys!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey guys!"] = "", -- A_Classic_Fairytale:united
---      ["Hey, Hog Solo! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey! I was supposed to collect it!"] = "", -- A_Space_Adventure:fruit02
+--      ["Hey, %s! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey, %s! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey
 --      ["Hidden"] = "", -- portal
 --      ["High Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["High Jump: [Backspace]"] = "", -- Basic_Training_-_Movement
+--      ["High Jump: Tap the [Curvy Arrow] shortly"] = "", -- Basic_Training_-_Movement
 --      ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander
 --      ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion
 --      ["--- Highland Mode ---"] = "", -- Battalion
@@ -857,19 +849,23 @@
 --      ["Hill Guard"] = "", -- Bazooka_Battlefield
 --      ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01
 --      ["--- Hint ---"] = "", -- Battalion
---      ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
 --      ["Hint: Drilling holes should solve everything."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: Hold down [M] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: It might be a good idea to place a girder before starting to drill. Just saying."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: It might be easier if you vary the angle only slightly."] = "", -- Basic_Training_-_Bazooka
+--      ["Hint: Just select the parachute, it opens automatically when you fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion
 --      ["Hint: Launch the bazooka horizontally at full power."] = "", -- Basic_Training_-_Bazooka
---      ["Hint: Press [Esc] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Pause the game to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Select the blow torch, aim and press [Fire]. Press [Fire] again to stop."] = "", -- A_Classic_Fairytale:journey
 --      ["Hint: Select the low gravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey
+--      ["Hint: Select the rope, [Up] or [Down] to aim, [Attack] to fire, directional keys to move."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Select the Shoryuken and hit [Attack].|P.S.: You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: %s needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family
 --      ["Hint: The rope only bends around objects.|When it doesn't hit anything, it's always straight."] = "", -- Basic_Training_-_Rope
 --      ["Hint: To jump higher, wait a bit before you hit “High Jump” a second time."] = "", -- Basic_Training_-_Movement
+--      ["Hint: To place a girder, select it,|then use [Left] and [Right] to select angle and length,|then choose a location for the girder."] = "", -- A_Classic_Fairytale:shadow
 --      ["Hint: Use the quit key to see the team’s continent."] = "", -- Continental_supplies
 --      ["Hint: When you shorten the rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope
 --      ["Hint: You might want to stay out of sight and take all the crates ..."] = "", -- A_Classic_Fairytale:journey
@@ -901,24 +897,11 @@
 --      ["Hogminator"] = "", -- A_Classic_Fairytale:family
 --      ["Hog nueve"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog octo"] = "", -- A_Space_Adventure:fruit03
---      ["Hogonauts"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Hog onze"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog Saturn"] = "", -- A_Space_Adventure:fruit03
 --      ["Hogs in sight!"] = "", -- Continental_supplies
 --      ["Hog Solo and GB"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hog Solo"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01, A_Space_Adventure:moon02
---      ["Hog Solo couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo escaped successfully!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo has to reach the last crates"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo has to refuel his saucer."] = "", -- A_Space_Adventure:moon01
---      ["Hog Solo lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
---      ["Hog Solo wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["- Hogs will be revived"] = "", -- Capture_the_Flag
 --      ["- Hogs will drop the flag when killed"] = "", -- Capture_the_Flag
 --      ["Hog two"] = "", -- A_Space_Adventure:fruit03
@@ -927,9 +910,7 @@
 --      ["Holy shit!"] = "", -- Mutant
 --      ["Honda"] = "", -- 
 --      ["Honest Lee"] = "", -- A_Classic_Fairytale:enemy
---      ["Hook"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
 --      ["Hooks"] = "", -- 
---      ["Hooray!"] = "",
 --      ["Hooray! I actually did it! Hogera is safe!"] = "", -- A_Space_Adventure:final
 --      ["Hooray! I've found it, now I have to get back to Captain Lime!"] = "", -- A_Space_Adventure:fruit02
 --      ["Hooray! You are a champion!"] = "", -- A_Space_Adventure:ice02
@@ -945,7 +926,7 @@
 --      ["However, if you fail to do so, she dies a most violent death, just like your friend! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, if you fail to do so, she dies a most violent death! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, my mates don't agree with me on letting you go..."] = "", -- A_Classic_Fairytale:dragon
---      ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
+--      ["However, the army of %s is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
 --      ["How to Rope"] = "", -- Basic_Training_-_Rope
 --      ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen
 --      ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen
@@ -965,7 +946,6 @@
 --      ["I can't believe what I'm hearing!"] = "", -- A_Classic_Fairytale:backstab
 --      ["I can't let you go further because …"] = "", -- A_Classic_Fairytale:queen
 --      ["I can't wait any more, I have to save myself!"] = "", -- A_Classic_Fairytale:shadow
---      ["Ice"] = "", -- Basic_Training_-_Movement
 --      ["Ice Jake"] = "", -- A_Space_Adventure:ice01
 --      ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family
 --      ["Icy Girder: [3]"] = "", -- HedgeEditor
@@ -1019,7 +999,6 @@
 --      ["I just found out that they have captured your princess!"] = "", -- A_Classic_Fairytale:family
 --      ["I just want the strange device you found!"] = "", -- A_Space_Adventure:ice01
 --      ["I just wonder where Ramon and Spiky disappeared..."] = "", -- A_Classic_Fairytale:journey
---      ["Ikeda"] = "", -- User_Mission_-_Bamboo_Thicket
 --      ["I know and I'm terribly sorry!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know, my hero!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know that your resources are low due to the battle but I'll send two of my best hogs to assist you."] = "", -- A_Space_Adventure:fruit02
@@ -1047,6 +1026,7 @@
 --      ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen
 --      ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united
 --      ["IMPORTANT: To see the mission panel again, hold the mission panel key."] = "", -- Basic_Training_-_Movement
+--      ["IMPORTANT: To see the mission panel again, pause the game."] = "", -- Basic_Training_-_Movement
 --      ["Impressive...you are still dry as the corpse of a hawk after a week in the desert..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["%i ms"] = "", -- Gravity
 --      ["I'm so glad this is finally over!"] = "", -- A_Space_Adventure:final
@@ -1201,7 +1181,6 @@
 --      ["Kill The Leader: You must also hit the team with the most health."] = "", -- WxW
 --      ["Kill the traitor, %s, or spare his life!"] = "", -- A_Classic_Fairytale:backstab
 --      ["King"] = "", -- Battalion
---      ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing
 --      ["--- King Mode ---"] = "", -- Battalion
 --      ["Knight"] = "", -- Battalion
 --      ["Knives"] = "", -- 
@@ -1220,7 +1199,7 @@
 --      ["Launch some bazookas to destroy the targets!"] = "", -- Basic_Training_-_Bazooka
 --      ["Leader"] = "", -- A_Classic_Fairytale:enemy
 --      ["Leaderbot"] = "", -- A_Classic_Fairytale:queen
---      ["Lead the Green Bananas to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
+--      ["Lead your allies to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
 --      ["Leaks A Lot"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Leaks A Lot, depressed for killing his loved one, failed to save the village..."] = "", -- A_Classic_Fairytale:journey
 --      ["Leaks A Lot gave his life for his tribe! He should have survived!"] = "", -- A_Classic_Fairytale:first_blood
@@ -1234,7 +1213,6 @@
 --      ["[Left], [Right]: Change health value."] = "", -- HedgeEditor
 --      ["Left/right: Choose crate contents"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type"] = "", -- Construction_Mode
---      ["Left Tong"] = "", -- Bazooka_Battlefield
 --      ["Legs"] = "", -- 
 --      ["Less tools, more fun"] = "", -- Battalion
 --      ["Lestat"] = "", -- portal
@@ -1261,18 +1239,19 @@
 --      ["Little Obstacle Course"] = "", -- Basic_Training_-_Rope
 --      ["Lively Lifeguard"] = "",
 --      ["Lonely Cries"] = "", -- Continental_supplies
---      ["Lonely Hog"] = "", -- ClimbHome
 --      ["Long Jump: [Enter]"] = "", -- Basic_Training_-_Movement
+--      ["Long Jump: Tap the [Curvy Arrow] button for long"] = "", -- Basic_Training_-_Movement, A_Classic_Fairytale:first_blood
 --      ["Long Live The Queen"] = "", -- A_Classic_Fairytale:queen
 --      ["Look around: [Mouse movement]"] = "", -- Basic_Training_-_Movement
+--      ["Look around: [Tap or swipe on the screen]"] = "", -- Basic_Training_-_Movement
 --      ["Look, boss! There is the target!"] = "", -- A_Space_Adventure:moon01
 --      ["Look, I had no choice!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! There's more of them!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! We're surrounded by cannibals!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Looks like the whole world is falling apart!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Look to the left and do a backwards jump towards the mushroom."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Loon"] = "", -- The_Specialists
 --      ["Loopy"] = "", -- 
---      ["Lord Evil"] = "", -- Tentacle_Terror
 --      ["Losing Condition: Destroy"] = "", -- HedgeEditor
 --      ["Low Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander
@@ -1292,7 +1271,6 @@
 --      ["Mario"] = "", -- 
 --      ["Mark gears for win/lose conditions"] = "", -- HedgeEditor
 --      ["Mark/unmark gear: [Left Click]"] = "", -- HedgeEditor
---      ["Mark"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
 --      ["Max Citrus"] = "", -- A_Space_Adventure:fruit01
 --      ["Maybe you should try an easier map next time."] = "", -- Racer
 --      ["Maybe you should try an easier TechRacer map."] = "", -- TechRacer
@@ -1304,7 +1282,6 @@
 --      ["Mega kill!"] = "", -- Mutant
 --      ["Meiwes"] = "", -- A_Classic_Fairytale:backstab
 --      ["mikade"] = "", -- 
---      ["milliseconds"] = "", -- SpeedShoppa
 --      ["Mindy"] = "", -- A_Classic_Fairytale:united
 --      ["Mine Deployer"] = "",
 --      ["Mine Placement Mode"] = "", -- Construction_Mode
@@ -1321,10 +1298,11 @@
 --      ["Mines time: %ds"] = "", -- SimpleMission
 --      ["Minion"] = "", -- A_Space_Adventure:moon01
 --      ["Minions"] = "", -- A_Space_Adventure:moon01
---      ["MISSION FAILED"] = "", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+--      ["Mission failed!"] = "", -- portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, SimpleMission, HedgeEditor
+--      ["Mission"] = "", -- HedgeEditor
 --      ["Mission Panel"] = "", -- Basic_Training_-_Movement
 --      ["Mission panel: [M]"] = "", -- Basic_Training_-_Movement
---      ["MISSION SUCCESSFUL"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+--      ["Mission succeeded!"] = "", -- portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, SimpleMission, HedgeEditor
 --      ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02
 --      ["Mixed %d"] = "", -- WxW
 --      ["Mixed"] = "", -- WxW
@@ -1336,7 +1314,6 @@
 --      ["Monster kill!"] = "", -- Mutant
 --      ["Monsters"] = "", -- 
 --      ["Mooney"] = "", -- 
---      ["More Natives"] = "", -- A_Classic_Fairytale:epil
 --      ["Morris"] = "", -- 
 --      ["Most mines are not active."] = "", -- A_Space_Adventure:desert02
 --      ["Most of the destructible terrain is marked with dashed lines."] = "", -- A_Space_Adventure:desert01
@@ -1354,11 +1331,9 @@
 --      ["My flying saucer stopped working!"] = "", -- A_Space_Adventure:ice01
 --      ["Nah, probably everyone was just stupid."] = "", -- A_Space_Adventure:final
 --      ["Name"] = "", -- A_Classic_Fairytale:queen
---      ["Nameless Heroes"] = "",
 --      ["Nancy Screw"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:queen
 --      ["Napalm Rocket"] = "", -- Continental_supplies
 --      ["Naranja Jed"] = "", -- A_Space_Adventure:fruit01
---      ["Natives"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Naughty Ninja"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Near a PAotH base on the moon ..."] = "", -- A_Space_Adventure:moon01
 --      ["Near Secret Base 17 of PAotH in the rural Hogland ..."] = "", -- A_Space_Adventure:cosmos
@@ -1447,11 +1422,8 @@
 --      ["Oh, my!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oh, my! I forgot something!"] = "", -- A_Classic_Fairytale:queen
 --      ["Oh, my! This is even more entertaining than I've expected!"] = "", -- A_Classic_Fairytale:backstab
---      ["Oh no! Just try again!"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Oh no, not %s!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
---      ["Oh no, the Green Bananas have betrayed Hog Solo and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
---      ["Oh no! Time's up! Just try again."] = "", --Bazooka, Shotgun, SniperRifle
---      ["Oh no! You failed! Just try again."] = "", -- Basic_Training_-_Cluster_Bomb
+--      ["Oh no, the companions have betrayed %s and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
 --      ["Oh no! You have died. Try again!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Oh! Please spare me. You can take all my treasures!"] = "", -- A_Space_Adventure:ice01
 --      ["Oh, silly me! I forgot that I'm the shaman."] = "", -- A_Classic_Fairytale:backstab
@@ -1473,8 +1445,8 @@
 --      ["One shall not judge one by one's appearance!"] = "", -- A_Classic_Fairytale:epil
 --      ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oneye"] = "", -- portal
---      ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant
+--      ["Only %s can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard
 --      ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01
@@ -1486,6 +1458,7 @@
 --      ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01
 --      ["Oops! You have selected the wrong hedgehog! Just try again."] = "", -- Basic_Training_-_Movement
 --      ["Open ammo menu: [Right click]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
+--      ["Open ammo menu: Tap the [Suitcase]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
 --      ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Orange"] = "", -- 
 --      ["Orlando Boom!"] = "", -- A_Classic_Fairytale:queen
@@ -1502,20 +1475,18 @@
 --      ["PAotH"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01, A_Space_Adventure:desert01, A_Space_Adventure:moon01
 --      ["PAotH has sent explosives but unfortunately the trigger mechanism seems to be faulty!"] = "", -- A_Space_Adventure:cosmos
 --      ["Patches"] = "", -- 
---      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02
 --      ["Pause: [P]"] = "", -- Basic_Training_-_Movement
+--      ["Pause: Tap the [Pause] button"] = "", -- Basic_Training_-_Movement
 --      ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW
 --      ["Penguin Roar"] = "", -- Continental_supplies
 --      ["Perfect! Now try to get the next crate without hurting yourself!"] = "", -- A_Classic_Fairytale:first_blood
---      ["Per-Hog Ammo"] = "",
 --      ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh
 --      ["Personal best: %.3f seconds"] = "", -- A_Space_Adventure:ice02
 --      ["Pfew! That was close!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Phosphat"] = "", -- portal
 --      ["Physicist"] = "", -- HedgeEditor
 --      ["Pikachu"] = "", -- 
---      ["Pincer Knights"] = "", -- Bazooka_Battlefield
 --      ["Pings left: %d"] = "", -- Space_Invasion
 --      ["Pink"] = "", -- 
 --      ["Pirates"] = "", -- 
@@ -1563,9 +1534,7 @@
 --      ["Please, stop releasing your \"smoke signals\"!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Please wait …"] = "", -- WxW
 --      ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion
---      ["points"] = "", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
 --      ["--- Points Mode ---"] = "", -- Battalion
---      ["point(s)"] = "", -- TargetPractice, Mutant
 --      ["Poison"] = "",
 --      ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02
 --      ["Poisonous, deals no damage."] = "", -- Continental_supplies
@@ -1583,35 +1552,35 @@
 --      ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to fight"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos
---      ["Prepare yourself"] = "",
+--      ["Prepare yourself, %s!"] = "", -- The_Specialists
 --      ["Press [Attack] (space bar by default) to start,|repeatedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] to begin."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Attack] to confirm."] = "", -- Continental_supplies
 --      ["Press [Attack] to select this continent!"] = "", -- Continental_supplies
 --      ["Press [Left] and [Right] to change the difficulty."] = "", -- A_Classic_Fairytale:first_blood
---      ["Press [Left] or [Right] to move around, [Enter] to jump"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Press [Left] or [Right] to move around, [Long Jump] to jump forwards."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW
 --      ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW
+--      ["Press [M] to see the mission texts"] = "", -- Basic_Training_-_Movement
 --      ["Press [Precise] to skip intro"] = "",
 --      ["Press [Up] and [Down] to move between menu items.|Press [Attack], [Left], or [Right] to toggle."] = "", -- WxW
 --      ["Prestigious Pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Princess"] = "", -- A_Classic_Fairytale:family, A_Classic_Fairytale:journey
 --      ["Princess Peach"] = "", -- 
---      ["Private Nolak"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["Problems, dude? Chillax!"] = "", -- A_Classic_Fairytale:epil
 --      ["Professional pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professional stunt pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professor"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
 --      ["Professor Hogevil, then known as James Hogus, worked for PAotH back in my time."] = "", -- A_Space_Adventure:moon02
+--      ["Professor's Team"] = "", -- A_Space_Adventure:death01
 --      ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
---      ["Pro Killers"] = "", -- Big_Armory
 --      ["Protect the King: When the king dies, so does the team"] = "", -- Battalion
---      ["Protect yourselves!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Purple"] = "", -- 
 --      ["Pyromancer"] = "", -- Battalion
 --      ["Pyro"] = "", -- The_Specialists
 --      ["Quit: [Esc]"] = "", -- Basic_Training_-_Movement
 --      ["Race complexity limit reached"] = "", -- Racer, TechRacer
+--      ["Race failed!"] = "", -- A_Space_Adventure:moon02
 --      ["Racer"] = "", -- Racer
 --      ["Racer tool"] = "", -- Racer
 --      ["Race"] = "", -- TrophyRace
@@ -1644,22 +1613,18 @@
 --      ["Replenishment: Weapons are restocked on turn start of a new hog"] = "", -- Highlander
 --      ["Repositioning Mode"] = "", -- HedgeEditor
 --      ["REPOSITIONING MODE"] = "", -- HedgeEditor
---      ["rescues"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Rescue the imprisoned PAotH team and get the fuel!"] = "", -- A_Space_Adventure:moon01
 --      ["Respawner"] = "", -- Construction_Mode
 --      ["Respawner: Resurrects dead hogs."] = "", -- Construction_Mode
 --      ["Retract/Extend rope: [Up]/[Down]"] = "", -- Basic_Training_-_Rope
 --      ["- Return the enemy flag to your base to score"] = "", -- Capture_the_Flag
---      [" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = "",
 --      ["Return to Leaks A Lot!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Return to the mission menu by pressing the \"Go back\" button."] = "", -- A_Space_Adventure:cosmos
 --      ["Return to the Surface"] = "", -- A_Space_Adventure:fruit02
 --      ["Return to the training menu by pressing the “Go back” button."] = "", -- Basic_Training_-_Movement
---      ["Rhombus"] = "", -- Basic_Training_-_Movement
 --      ["Rider"] = "", -- portal
 --      ["Rifleman"] = "", -- Battalion
 --      ["Righteous Beard"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:queen, A_Classic_Fairytale:united
---      ["Right Tong"] = "", -- Bazooka_Battlefield
 --      ["Ripe"] = "", -- 
 --      ["Rise the water if nobody else is in the circle and deal 6 damage to all enemy hogs."] = "", -- Continental_supplies
 --      ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01
@@ -1667,8 +1632,8 @@
 --      ["Ronald"] = "", -- portal
 --      ["Roof"] = "", -- WxW
 --      ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge
---      ["Roper"] = "", -- SpeedShoppa
 --      ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
+--      ["Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Rope Weapons"] = "", -- Basic_Training_-_Rope
 --      ["Roshi"] = "", -- 
 --      ["Rot Molester"] = "", -- A_Classic_Fairytale:shadow
@@ -1679,7 +1644,6 @@
 --      ["Round limit:"] = "", -- TechRacer
 --      ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer
 --      ["Round's slowest lap: %.3fs by %s"] = "", -- TrophyRace
---      ["Rounds until Sudden Death: %d"] = "", -- Battalion
 --      ["RS1"] = "", -- A_Space_Adventure:fruit03
 --      ["RS2"] = "", -- A_Space_Adventure:fruit03
 --      ["Rubber"] = "", -- Construction_Mode, HedgeEditor
@@ -1703,10 +1667,17 @@
 --      ["Salvation was one step closer now..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Sam"] = "", -- A_Space_Adventure:cosmos
 --      ["Sandals?! I thought you left your ring!"] = "", -- A_Classic_Fairytale:queen
+--      ["%s and GB"] = "", -- A_Space_Adventure:fruit02
 --      ["%s and %s enter the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sandstorm"] = "", -- A_Space_Adventure:desert01
 --      ["Sandy"] = "", -- A_Space_Adventure:desert01
---      ["Save as many hapless hogs as possible!"] = "",
+--      ["%s arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
+--      ["Save as many hogs as possible!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey
 --      ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow
 --      ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor
@@ -1718,15 +1689,16 @@
 --      ["Scallywag"] = "", -- 
 --      ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab
 --      ["Scenario"] = "", -- Big_Armory, portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape
---      ["Scenario failed!"] = "", -- SimpleMission
 --      ["Scientist"] = "", -- Battalion
 --      ["%s climbed home in %d seconds!"] = "", -- ClimbHome
+--      ["%s (contd.)"] = "", -- A_Classic_Fairytale:epil
 --      ["Score: %d"] = "", -- Space_Invasion
 --      ["Score goal: %d"] = "", -- Control
 --      ["Score graph"] = "", -- Mutant, Space_Invasion
 --      ["Score points by killing other hedgehogs."] = "", -- Mutant
 --      ["Scores:"] = "", -- Mutant
 --      ["Scoring: "] = "", -- Mutant
+--      ["%s couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
 --      ["Script parameter examples:"] = "", -- Gravity
 --      ["%s (+%d)"] = "", -- Battalion
 --      ["%s (%d)"] = "", -- Continental_supplies
@@ -1738,10 +1710,9 @@
 --      ["%s died … and lives again!"] = "", -- Construction_Mode
 --      ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome
 --      ["%s, %d sec"] = "", -- Continental_supplies
---      ["Search for the device with the help of the other hedgehogs "] = "", -- A_Space_Adventure:fruit02
+--      ["Search for the device with the help of the other hedgehogs."] = "", -- A_Space_Adventure:fruit02
 --      ["Searching in the dust"] = "", -- A_Space_Adventure:desert01
 --      ["Searching the stars!"] = "", -- A_Space_Adventure:cosmos
---      ["seconds"] = "", -- ClimbHome
 --      ["Seems like every time you take a \"walk\", the enemy finds us!"] = "", -- A_Classic_Fairytale:backstab
 --      ["See that crate farther on the right?"] = "", -- A_Classic_Fairytale:first_blood
 --      ["See ya!"] = "",
@@ -1764,6 +1735,7 @@
 --      ["Select your continent with [Up]/[Down] or by selecting a representative weapon."] = "", -- Continental_supplies
 --      ["%s enters the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sergey"] = "", -- 
+--      ["%s escaped successfully!"] = "", -- A_Space_Adventure:fruit01
 --      ["Set bounciness: [Left Shift] + [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set detonation timer: [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set Health: [Left Click]"] = "", -- HedgeEditor
@@ -1787,10 +1759,12 @@
 --      ["%s has been killed before taking enough damage first."] = "", -- SimpleMission
 --      ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has been rescued from death"] = "", -- Construction_Mode
+--      ["%s has dropped the flag!"] = "", -- CTF_Blizzard
 --      ["%s has fallen victim to gravity."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has mutated! +2 points"] = "", -- Mutant
 --      ["%s has passed the best height of %s!"] = "", -- ClimbHome
 --      ["%s has scored!"] = "", -- Capture_the_Flag
+--      ["%s has to refuel the saucer."] = "", -- A_Space_Adventure:moon01
 --      ["%s hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil
 --      ["sheepluva"] = "", -- 
@@ -1807,8 +1781,6 @@
 --      ["Shinobi"] = "", -- 
 --      ["%s hit the ground."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Shoppa Love"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
---      ["Shoppa Union"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes, Challenge_-_Speed_Shoppa_-_ShoppaKing
---      ["Shoppers"] = "", -- SpeedShoppa
 --      ["Sigh."] = "", -- A_Classic_Fairytale:epil
 --      ["Silly"] = "",
 --      ["Silver"] = "", -- 
@@ -1819,11 +1791,11 @@
 --      ["%s is now as poor as a church mouse"] = "", -- Construction_Mode
 --      ["%s is now a zombie hedgehog"] = "", -- Construction_Mode
 --      ["%s is suddenly low on ammo"] = "", -- Construction_Mode
---      ["Skip your turn to try again."] = "", -- Basic_Training_-_Rope
 --      ["Skulls"] = "", -- Bazooka_Battlefield
 --      ["Slimer"] = "", -- 
 --      ["Slippery"] = "", -- A_Classic_Fairytale:journey
 --      ["%s lost all the weapons"] = "", -- Construction_Mode
+--      ["%s lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
 --      ["Slot %d: %s"] = "", -- Frenzy
 --      ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy
 --      ["Slowpoke"] = "", -- 
@@ -1837,6 +1809,7 @@
 --      ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smugglers"] = "", -- A_Space_Adventure:desert01
+--      ["%s must collect the final crates."] = "", -- A_Space_Adventure:fruit02
 --      ["%s must skip this turn for rule violation."] = "", -- WxW
 --      ["Sneaks"] = "", -- Bazooka_Battlefield
 --      ["%s never got the ninja diploma."] = "", -- ClimbHome
@@ -1844,10 +1817,8 @@
 --      ["Sniper! +8 points!"] = "", -- Space_Invasion
 --      ["Sniper"] = "", -- The_Specialists
 --      ["Sniper Training"] = "",
---      ["Sniperz"] = "",
 --      ["So, as promised I have brought you where I think that the device you are looking for is hidden."] = "", -- A_Space_Adventure:fruit02
 --      ["So far, you had infinite ropes, but in the|real world, ropes are usually limited."] = "", -- Basic_Training_-_Rope
---      ["So Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["So, I believe that it's a good place to start."] = "", -- A_Space_Adventure:desert01
 --      ["So, I kindly ask for your help."] = "", -- A_Space_Adventure:fruit01
@@ -1857,11 +1828,12 @@
 --      ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03
 --      ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen
 --      ["Some weapons can be dropped from the rope."] = "", -- Basic_Training_-_Rope
---      ["Somewhere else on the planet of fruits, Captain Lime helps Hog Solo"] = "", -- A_Space_Adventure:fruit02
---      ["Somewhere else on the planet of fruits Hog Solo gets closer to the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, Captain Lime helps %s"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, %s gets closer to the device"] = "", -- A_Space_Adventure:fruit02
 --      ["Somewhere on the Planet of Fruits a terrible war is about to begin ..."] = "", -- A_Space_Adventure:fruit01
 --      ["Somewhere on the uninhabitable Death Planet ..."] = "", -- A_Space_Adventure:death01
 --      ["So, now I got the last part and I have your friends captured."] = "", -- A_Space_Adventure:death01
+--      ["So, %s, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So the princess was never heard of again ..."] = "", -- A_Classic_Fairytale:family
 --      ["So, uhmm, how did you manage to teleport them so far?"] = "", -- A_Classic_Fairytale:epil
 --      ["Sour"] = "", -- 
@@ -1958,8 +1930,6 @@
 --      ["Structure Placement Mode"] = "", -- Construction_Mode
 --      ["Structure Placer"] = "", -- Construction_Mode
 --      ["Stupid, stupid Hogerians!"] = "", -- A_Space_Adventure:final
---      ["Subject 1"] = "", -- portal
---      ["Subjects"] = "", -- portal
 --      ["Subtract %d"] = "", -- HedgeEditor
 --      ["--- Sudden Death ---"] = "", -- Battalion
 --      ["Summer Squash"] = "", -- A_Space_Adventure:fruit01
@@ -1976,7 +1946,7 @@
 --      ["Surfer! +15 points!"] = "", -- Space_Invasion
 --      ["Surfer!"] = "", -- WxW
 --      ["Surprise supplies: Get 1-3 random weapons each turn."] = "", -- Continental_supplies
---      ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:shadow
+--      ["Survive!"] = "", -- A_Classic_Fairytale:shadow
 --      ["%s violated the “All But Last” rule and will be penalized."] = "", -- WxW
 --      ["%s violated the “Kill The Leader” rule and will be penalized."] = "", -- WxW
 --      ["Swap place with a random enemy in the circle."] = "", -- Continental_supplies
@@ -1995,6 +1965,7 @@
 --      ["%s! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
 --      ["Swing, Leaks A Lot, on the wings of the wind!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Swing: [Left]/[Right]"] = "", -- Basic_Training_-_Rope
+--      ["%s wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome
 --      ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer
 --      ["Switch: Drop ball of dirt from parachute (once)"] = "", -- Continental_supplies
@@ -2005,6 +1976,7 @@
 --      ["Switch hedgehog: [Tabulator]"] = "", -- Basic_Training_-_Movement
 --      ["Switch: Select weapon special"] = "", -- Continental_supplies
 --      ["Switch: Toggle crate radar"] = "", -- WxW
+--      ["%s won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Swords"] = "", -- Bazooka_Battlefield
 --      ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon
 --      ["%s, you may choose the rules."] = "", -- WxW
@@ -2013,6 +1985,8 @@
 --      ["Tails"] = "", -- 
 --      ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Tall Potato"] = "", -- A_Space_Adventure:fruit01
+--      ["Tap [Pause] to see the mission texts"] = "", -- Basic_Training_-_Movement
+--      ["Tap the “rotating arrow” button on the left|until you have selected Cappy, the hedgehog with the cap!"] = "", -- Basic_Training_-_Movement
 --      ["Target"] = "", -- HedgeEditor
 --      ["Target Placement Mode"] = "", -- Construction_Mode
 --      ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor
@@ -2027,13 +2001,16 @@
 --      ["Tatsujin"] = "", -- 
 --      ["Tatters"] = "", -- 
 --      ["Team %d"] = "", -- SimpleMission
+--      ["Team highscore: %d"] = "", -- Utils
 --      ["Team Identity Mode"] = "", -- HedgeEditor
 --      ["TEAM IDENTITY MODE"] = "", -- HedgeEditor
---      ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
+--      ["Team lowscore: %d"] = "", -- Utils
 --      ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion
+--      ["Team's best time: %.3fs"] = "", -- Utils
+--      ["Team's longest time: %.3fs"] = "", -- Utils
+--      ["Team's top accuracy: %d%"] = "", -- Utils
 --      ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2
 --      ["Teamwork"] = "", -- User_Mission_-_Teamwork
---      ["Team Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
 --      ["TechRacer"] = "", -- TechRacer
 --      ["Teleportation Node: Allows teleportation|    between other nodes."] = "", -- Construction_Mode
 --      ["Teleportation Node"] = "", -- Construction_Mode
@@ -2118,11 +2095,12 @@
 --      ["The forgotten continent"] = "", -- Continental_supplies
 --      ["The giant umbrella from the last crate should help break the fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Great Escape"] = "", -- User_Mission_-_The_Great_Escape
---      ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01
+--      ["- The green target must survive"] = "", -- HedgeEditor
+--      ["- The green targets must survive"] = "", -- HedgeEditor
 --      ["The guardian"] = "", -- A_Classic_Fairytale:shadow
 --      ["The hardships of the war turned %s (%s) into a killing machine: %d invaders destroyed in one round!"] = "", -- Space_Invasion
+--      ["The health of your current hedgehog|is shown at the top right corner."] = "", -- Basic_Training_-_Movement
 --      ["The hedgehog with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant
---      ["The Hogies"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["The Hospital"] = "", -- 
 --      ["The Individualist"] = "", -- A_Classic_Fairytale:shadow
 --      ["Their buildings were very primitive back then, even for an uncivilised island."] = "", -- A_Classic_Fairytale:united
@@ -2138,7 +2116,6 @@
 --      ["The Moonwalk"] = "", -- A_Classic_Fairytale:journey
 --      ["The Mutant has super weapons and a lot of health."] = "", -- Mutant
 --      ["The Mutant loses health quickly, but gains health by killing."] = "", -- Mutant
---      ["The Nameless One"] = "",
 --      ["The Navy greets %s for managing to get in a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["The next 4 times you play the \"The last encounter\" mission you'll get 20 more hit points and a laser sight."] = "", -- A_Space_Adventure:death02
 --      ["The next crate is an utility crate."] = "", -- Basic_Training_-_Movement
@@ -2150,6 +2127,7 @@
 --      ["Then what am I?"] = "", -- A_Classic_Fairytale:epil
 --      ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil
 --      ["The oppression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
+--      ["The other hog has died, he should have survived!"] = "", -- A_Space_Adventure:moon02
 --      ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Police"] = "", -- 
 --      ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -2173,7 +2151,7 @@
 --      ["The Showdown"] = "", -- A_Classic_Fairytale:shadow
 --      ["The Slaughter"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:first_blood
 --      ["The Society of Perfectionists greets %s (%s): No misses and %d hits in its best round."] = "", -- Space_Invasion
---      ["THE SPECIALISTS"] = "",
+--      ["The Specialists: Each hedgehog starts with its own weapon set"] = "", -- The_Specialists
 --      ["The spinning arrows above your hedgehog show|which hedgehog is selected right now."] = "", -- Basic_Training_-_Movement
 --      ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The targets will guide you through the training."] = "", -- Basic_Training_-_Rope
@@ -2219,7 +2197,6 @@
 --      ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["This also increases the effectiveness of Medicine."] = "", -- Continental_supplies
 --      ["This game wasn’t really exciting."] = "", -- Space_Invasion
---      ["This Hog Solo is so naive! When he returns I'll shoot him and keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This is a new personal best, congratulations!"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert02, A_Space_Adventure:fruit03
 --      ["This is a new personal best time, congratulations!"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["This is Cappy."] = "", -- Basic_Training_-_Movement
@@ -2235,6 +2212,7 @@
 --      ["This rain is really something..."] = "",
 --      ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome
 --      ["This seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01
+--      ["This %s is so naive! I'm going to shoot this fool so I can keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This was an awesome performance! But this challenge can be finished with even just one RC plane. Can you figure out how?"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["This will be fun!"] = "", -- A_Classic_Fairytale:enemy
 --      ["This will be useful when I need a new platform or if I want to rise."] = "", -- portal
@@ -2269,11 +2247,11 @@
 --      ["To begin with the training, hit the attack key!"] = "", -- Basic_Training_-_Movement
 --      ["To begin with the training, select the bazooka from the ammo menu!"] = "", -- Basic_Training_-_Bazooka
 --      ["To begin with the training, select the grenade from the ammo menu!"] = "", -- Basic_Training_-_Grenade
+--      ["To begin with the training, tap the attack button!"] = "", -- Basic_Training_-_Movement
 --      ["To finish hedgehog selection, just do anything|with him, like walking."] = "", -- Basic_Training_-_Movement
 --      ["To get over the next obstacles, keep some distance from the wall before you back jump."] = "", -- Basic_Training_-_Movement
 --      ["To get over the water, you have to do multiple|rope shots and swings."] = "", -- Basic_Training_-_Rope
 --      ["Toggle Editing Weapons and Tools: [Precise]+[2]"] = "", -- HedgeEditor
---      ["Toggle Gear Information: [Precise]+[3]"] = "", -- HedgeEditor
 --      ["Toggle Help: [Precise]+[1]"] = "", -- HedgeEditor
 --      ["Toggle Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Toggle Shield: [Long jump]"] = "", -- Space_Invasion
@@ -2283,14 +2261,14 @@
 --      ["Too bad! Then you should really leave!"] = "", -- A_Space_Adventure:fruit01
 --      ["Too slow! Try again ..."] = "", -- A_Space_Adventure:moon02
 --      ["Top-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"] = "", -- A_Classic_Fairytale:shadow
 --      ["To reach higher ground, walk to a ledge, look to the left, then do a back jump."] = "", -- Basic_Training_-_Movement
 --      ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey
 --      ["To the caves..."] = "", -- A_Classic_Fairytale:united
 --      ["Touch all waypoints as fast as you can!"] = "", -- Racer
---      ["To win the game, Hog Solo has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
+--      ["- Touch the sparkles near your base to teleport"] = "", -- CTF_Blizzard
+--      ["To win the game, %s has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
 --      ["To win the game you had to collect the 2 crates with no specific order."] = "", -- A_Space_Adventure:desert01
---      ["To win the game you have to eliminate all your enemies."] = "", -- A_Space_Adventure:death01
+--      ["To win the game you have to eliminate Professor Hogevil."] = "", -- A_Space_Adventure:death01
 --      ["To win the game you have to find the right crate."] = "", -- A_Space_Adventure:desert01
 --      ["To win the game you have to go next to Thanta."] = "", -- A_Space_Adventure:ice01
 --      ["To win the game you have to go to the surface."] = "", -- A_Space_Adventure:desert02
@@ -2298,13 +2276,10 @@
 --      ["To win the game you have to stand next to Thanta."] = "", -- A_Space_Adventure:ice01
 --      ["Toxic Team"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Track completed!"] = "", -- Racer, TechRacer
---      ["Trainee"] = "", -- TargetPractice
 --      ["Training"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Training complete!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Training Team"] = "", -- TargetPractice
 --      ["Traitors"] = "", -- A_Classic_Fairytale:epil
 --      ["Traitors don't get to shout around here!"] = "", -- A_Classic_Fairytale:epil
---      ["Trapped"] = "", -- Basic_Training_-_Movement
 --      ["Trapper"] = "", -- HedgeEditor
 --      ["Travel carefully as your fuel is limited"] = "", -- A_Space_Adventure:cosmos
 --      ["Travel to all the neighbor planets and collect all the pieces"] = "", -- A_Space_Adventure:cosmos
@@ -2321,7 +2296,6 @@
 --      ["Try to land softly, as you can still take fall damage!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Try to protect the chief! You won't lose if he dies, but it is advised that he survives."] = "", -- A_Classic_Fairytale:united
 --      ["Try to reach and destroy the next target quickly."] = "", -- Basic_Training_-_Rope
---      ["T_T"] = "",
 --      ["Tumbler"] = "", -- Tumbler
 --      ["Turn around: [Left Shift] + [Left]/[Right]"] = "", -- Basic_Training_-_Movement
 --      ["Turning Around"] = "", -- Basic_Training_-_Movement
@@ -2339,7 +2313,6 @@
 --      ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy
 --      ["Ukemi"] = "", -- 
 --      ["Ultra kill!"] = "", -- Mutant
---      ["Ultrasoldier"] = "", -- Big_Armory
 --      ["unC0Rr"] = "", -- 
 --      ["Under Construction"] = "", -- A_Classic_Fairytale:shadow
 --      ["Under normal circumstances we could easily defeat them but we have kindly sent most of our men to the Kingdom of Sand to help with the annual dusting of the king's palace."] = "", -- A_Space_Adventure:fruit01
@@ -2360,7 +2333,6 @@
 --      ["Unit 883"] = "", -- 
 --      ["United We Stand"] = "", -- A_Classic_Fairytale:united
 --      ["Unlike bazookas, grenades are not influenced by wind."] = "", -- Basic_Training_-_Grenade
---      ["Unlimited Attacks"] = "",
 --      ["Unlimited Attacks: Attacks don't end your turn"] = "", -- User_Mission_-_Diver, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree
 --      ["Unlucky Sods"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Unstoppable!"] = "",
@@ -2376,12 +2348,13 @@
 --      ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["User Challenge"] = "",
 --      ["!"] = "", -- User_Mission_-_Dangerous_Ducklings
+--      ["User Mission"] = "", -- HedgeEditor
 --      ["Use the attack key twice to change the flying saucer while being in air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the attack key twice to change the flying saucer while floating in mid-air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the bazooka and the flying saucer to get the freezer."] = "", -- A_Space_Adventure:ice01
 --      ["Use the flying saucer from the crate to fly to the moon."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly to the other planets."] = "", -- A_Space_Adventure:cosmos
---      ["Use the parachute ([Space] while in air) to get the next crate"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Use the parachute to get the next crate."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Use the portal gun to get to the next crate, then use the new gun to get to the final destination!|"] = "", -- A_Classic_Fairytale:dragon
 --      ["Use the RC plane and destroy the all the targets."] = "", -- A_Space_Adventure:desert03
 --      ["Use the rope in order to catch the blue hedgehog"] = "", -- A_Space_Adventure:moon02
@@ -2414,7 +2387,6 @@
 --      ["Victory Condition: Collect"] = "", -- HedgeEditor
 --      ["Victory Condition: Destroy"] = "", -- HedgeEditor
 --      ["Victory for %s!"] = "", -- Capture_the_Flag
---      ["Victory for the "] = "", -- CTF_Blizzard, Capture_the_Flag
 --      ["Violence is not the answer to your problems!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos
 --      ["Vladimir"] = "", -- 
@@ -2432,9 +2404,6 @@
 --      ["Walls left: %d"] = "", -- WxW
 --      ["Wall to wall"] = "", -- WxW
 --      ["Waluigi"] = "", -- 
---      ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Wannabe Ropers"] = "", -- Basic_Training_-_Rope
---      ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Wario"] = "", -- 
 --      ["Warming Up"] = "", -- Basic_Training_-_Grenade
 --      ["Warning: Fire cake detected"] = "", -- ClimbHome
@@ -2460,7 +2429,6 @@
 --      ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion
 --      ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion
 --      ["Weapon specials: Some weapons have special modes (see weapon description)."] = "", -- Continental_supplies
---      ["Weapons Reset"] = "",
 --      ["Weapons reset: The weapons are reset after each turn."] = "", -- WxW
 --      ["We are indeed."] = "", -- A_Classic_Fairytale:backstab
 --      ["We can't defeat them!"] = "", -- A_Classic_Fairytale:shadow
@@ -2477,9 +2445,9 @@
 --      ["We have to hurry! Are you armed?"] = "", -- A_Space_Adventure:moon01
 --      ["We have to protect the village!"] = "", -- A_Classic_Fairytale:united
 --      ["We have to unite and defeat those cylergs!"] = "", -- A_Classic_Fairytale:enemy
---      ["Welcome Hog Solo, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome home! Please take a seat"] = "", -- ClimbHome
 --      ["Welcome, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey
+--      ["Welcome, %s, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome to the Death Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
@@ -2638,16 +2606,16 @@
 --      ["You can’t open a portal on the blue surface."] = "", -- portal
 --      ["You can use the other 2 hogs to assist you."] = "", -- A_Space_Adventure:fruit02
 --      ["You can use the rope to reach new places."] = "", -- Basic_Training_-_Rope
---      ["You choose well, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You choose well, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You completed the mission in %.3f seconds."] = "", -- A_Space_Adventure:ice02
 --      ["You completed the mission in %d rounds."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03
---      ["You couldn't have come to a worse time, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You couldn't have come to a worse time, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You couldn't possibly believe that after refusing my offer I'd just let you go!"] = "", -- A_Classic_Fairytale:journey
 --      ["You'd almost swear the water was rising!"] = "",
 --      ["You'd better watch your steps..."] = "", -- A_Classic_Fairytale:journey
 --      ["You defended yourself against Captain Lime."] = "", -- A_Space_Adventure:fruit02
---      ["You defended yourself against the Fruit Assassins."] = "", -- A_Space_Adventure:fruit02
---      ["You did great, Hog Solo! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
+--      ["You defended yourself against %s."] = "", -- A_Space_Adventure:fruit02
+--      ["You did great, %s! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
 --      ["You don't deserve my sacrifice!"] = "", -- A_Classic_Fairytale:queen
 --      ["You drove Professor Hogevil away."] = "", -- A_Space_Adventure:moon01
 --      ["You drove the minions away."] = "", -- A_Space_Adventure:moon01
@@ -2659,11 +2627,11 @@
 --      ["You got me!"] = "", -- A_Space_Adventure:moon02
 --      ["You had %.1fs remaining on the clock (+%d points)."] = "", -- TargetPractice
 --      ["You had %.2fs remaining on the clock (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle
---      ["You had %d additional flying saucers left."] = "", -- A_Space_Adventure:ice02
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: You might want to use some mines ..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01
 --      ["You have activated Switch Hedgehog!"] = "", -- Basic_Training_-_Movement
 --      ["You have beaten the challenge!"] = "", -- ClimbHome
+--      ["You have beaten the team record, congratulations!"] = "", -- Utils
 --      ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab
 --      ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united
 --      ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01
@@ -2681,7 +2649,6 @@
 --      ["You have eliminated all visible enemy hedgehogs!"] = "", -- A_Space_Adventure:fruit01
 --      ["You have eliminated Professor Hogevil."] = "", -- A_Space_Adventure:moon01
 --      ["You have eliminated the evil minions."] = "", -- A_Space_Adventure:moon01
---      ["You have eliminated the whole evil team. You're pretty tough!"] = "", -- A_Space_Adventure:moon01
 --      ["You have escaped successfully."] = "", -- A_Space_Adventure:desert02
 --      ["You have failed to complete your task, young one!"] = "", -- A_Classic_Fairytale:journey
 --      ["You have failed to save the tribe!"] = "", -- A_Classic_Fairytale:backstab
@@ -2732,6 +2699,7 @@
 --      ["You have to travel again"] = "", -- A_Space_Adventure:cosmos
 --      ["You have to try again!"] = "", -- A_Space_Adventure:cosmos
 --      ["You have triggered the secret Do-Not-Rope-to-the-Moon Defense System."] = "", -- A_Space_Adventure:cosmos
+--      ["You have unlocked the target radar!"] = "", -- TargetPractice
 --      ["You have used %d flying saucers."] = "", -- A_Space_Adventure:ice02
 --      ["You have used %d RC planes."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["You have used only 1 RC plane. Outstanding!"] = "", -- User_Mission_-_RCPlane_Challenge
@@ -2750,11 +2718,10 @@
 --      ["You'll have only 2 watermelon bombs during the game."] = "", -- A_Space_Adventure:fruit03
 --      ["You'll have only one RC plane at the start of the mission."] = "", -- A_Space_Adventure:desert03
 --      ["You'll have to eliminate Captain Lime at the end."] = "", -- A_Space_Adventure:fruit02
---      ["You'll have to eliminate the Fruit Assassins at the end."] = "", -- A_Space_Adventure:fruit02
+--      ["You'll have to eliminate %s at the end."] = "", -- A_Space_Adventure:fruit02
 --      ["You'll lose if you die or if your time is up."] = "", -- A_Space_Adventure:moon02
 --      ["You'll see what I mean!"] = "", -- A_Classic_Fairytale:enemy
 --      ["You lose!] = "", -- Basic_Training_-_Bazooka
---      ["You lose!"] = "", -- Basic_Training_-_Sniper_Rifle, Big_Armory, Basic_Training_-_Bazooka, TargetPractice, ClimbHome
 --      ["You lost your target, try again!"] = "", -- TargetPractice
 --      ["You may find it handy."] = "", -- A_Space_Adventure:cosmos
 --      ["You may only attack from a rope!"] = "", -- WxW
@@ -2776,8 +2743,7 @@
 --      ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka
 --      ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice
 --      ["Your ammo is limited this time."] = "", -- Basic_Training_-_Bazooka
---      ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy
---      ["Your deaths will be avenged, Natives!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Your deaths will be avenged, %s!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Your death will not be in vain, Dense Cloud!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You're a coward!"] = "", -- A_Classic_Fairytale:queen
 --      ["You're...alive!? But we saw you die!"] = "", -- A_Classic_Fairytale:backstab
@@ -2803,25 +2769,26 @@
 --      ["Your next task is to collect some crates by using the rope!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Your personal best time so far: %.3f seconds"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["Your rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["You saved %d of 8 Hapless Hogs."] = "", -- User_Mission_-_That_Sinking_Feeling
+--      ["Your rope is gone! Try again!"] = "", -- Basic_Training_-_Rope
+--      ["You saved %d of 8 hegehogs."] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen
 --      ["You see the wind strength at the bottom right corner."] = "", -- Basic_Training_-_Bazooka
+--      ["You see the wind strength at the top."] = "", -- Basic_Training_-_Bazooka
 --      ["You should have known that we don't rely on meatbags!"] = "", -- A_Classic_Fairytale:queen
 --      ["You should know this more than anyone, Leaks!"] = "", -- A_Classic_Fairytale:queen
 --      ["You speak great truth, Hannibal. Here, take a sip!"] = "", -- A_Classic_Fairytale:epil
 --      ["You've been assaulting us, we have been just defending ourselves!"] = "", -- A_Classic_Fairytale:enemy
---      ["You've failed. Try again."] = "",
 --      ["You will be avenged!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You will fail if you run out of ammo and there are still targets available."] = "", -- A_Space_Adventure:desert03
 --      ["You will gain some extra ammo from the crates the next time you play the \"Getting to the device\" mission."] = "", -- A_Space_Adventure:fruit03
 --      ["You will play every 3 turns."] = "", -- A_Space_Adventure:fruit01
---      ["You win!"] = "", -- Big_Armory
 --      ["You won't believe what happened to me!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Yuck! I bet they'll keep worshipping her even after I save the village!"] = "", -- A_Classic_Fairytale:family
 --      ["Yumme Gunpowder"] = "", -- 
 --      ["Zealandia"] = "", -- Continental_supplies
 --      ["Zombie"] = "", -- 
 --      ["Zombi"] = "", -- portal
---      ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
+--      ["Zoom: [Pinch] with 2 fingers"] = "", -- Basic_Training_-_Movement
+--      ["Zoom: [Rotate mouse wheel]"] = "", -- Basic_Training_-_Movement
 --      ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen
 }
--- a/share/hedgewars/Data/Locale/sv.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/sv.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -26,7 +26,6 @@
 --      ["Above-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Accuracy Bonus! +15 points"] = "", -- Space_Invasion
 --      ["Accuracy bonus: +%d points"] = "", -- Basic_Training_-_Sniper_Rifle
---      ["Ace"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge
 --      ["Achievement gotten: %s"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_That_Sinking_Feeling, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, Basic_Training_-_Rope, Tumbler
 --      ["A Classic Fairytale"] = "", -- A_Classic_Fairytale:first_blood
 --      ["A crate critical to this mission has been destroyed."] = "", -- SimpleMission
@@ -46,7 +45,6 @@
 --      ["Again with the 'cannibals' thing!"] = "", -- A_Classic_Fairytale:enemy
 --      ["A Hedgewars minigame"] = "", -- Capture_the_Flag
 --      ["A Hedgewars mini-game"] = "", -- Racer, Space_Invasion, TechRacer, Tumbler
---      ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
 --      ["A Hedgewars tag game"] = "", -- Mutant
 --      ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome
 --      ["Aim at the ceiling and hold [Attack] pressed until the rope attaches."] = "", -- Basic_Training_-_Rope
@@ -141,13 +139,14 @@
 --      ["As you've seen, the dropped grenade roughly fell into your flying direction."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Athlete"] = "", -- Battalion
 --      ["Attack: Activate"] = "", -- Racer
---      ["Attack Captain Lime before he attacks back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack Captain Lime before he attacks back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack From Rope: %s"] = "", -- WxW
 --      ["Attack From Rope: You may only attack from a rope."] = "", -- WxW
 --      ["Attack rule: %s"] = "", -- WxW
 --      ["Attack: Select this continent"] = "", -- Continental_supplies
 --      ["Attack: [Space]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
---      ["Attack the assassins before they attack back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack: Tap the [Bomb]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
+--      ["Attack the assassins before they attack back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack: Throw ball"] = "", -- Knockball
 --      ["At the end of the game your health was %d."] = "", -- A_Space_Adventure:ice01
 --      ["At the start of the game each enemy hog has only the weapon that he is named after."] = "", -- A_Space_Adventure:death02
@@ -155,16 +154,18 @@
 --      ["Available weapon specials:"] = "", -- Continental_supplies
 --      ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion
---      ["Avoid the mines!"] = "", -- Basic_Training_-_Rope
 --      ["Axes"] = "", -- Bazooka_Battlefield
 --      ["Aye! Fellow! Let me exit this chamber of doom!"] = "", -- A_Classic_Fairytale:epil
 --      ["Back Breaker"] = "", -- A_Classic_Fairytale:backstab
 --      ["Back in the village, after telling the villagers about the threat..."] = "", -- A_Classic_Fairytale:united
 --      ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil
 --      ["Back Jump: [Backspace] ×2"] = "", -- Basic_Training_-_Movement
+--      ["Back Jump: Double-tap the [Curvy Arrow]"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (1/2)"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (2/2)"] = "", -- Basic_Training_-_Movement
 --      ["Backstab"] = "", -- A_Classic_Fairytale:backstab
+--      ["Backwards jump: Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Backwards jump: Tap the [Curvy Arrow] twice"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Bacon"] = "", -- 
 --      ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Badmad"] = "", -- portal
@@ -197,7 +198,6 @@
 --      ["Bazooka Battlefield"] = "", -- Bazooka_Battlefield
 --      ["Bazooka Master"] = "", -- Basic_Training_-_Bazooka
 --      ["Bazookas are influenced by wind."] = "", -- Basic_Training_-_Bazooka
---      ["Bazooka Team"] = "", -- Basic_Training_-_Bazooka
 	["Bazooka Training"] = "Bazookaträning",
 --      ["Bearded Beast"] = "", -- 
 --      ["Be careful, the future of Hogera is in your hands!"] = "", -- A_Space_Adventure:cosmos
@@ -231,7 +231,6 @@
 --      ["Bloodpie"] = "", -- A_Classic_Fairytale:backstab
 --      ["Bloodrocutor"] = "", -- A_Classic_Fairytale:shadow
 --      ["Bloodsucker"] = "", -- A_Classic_Fairytale:shadow
-	["Bloody Rookies"] = "Blodiga gröngölingar", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 --      ["Blue"] = "", -- 
 --      ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Bob"] = "", -- A_Space_Adventure:cosmos
@@ -314,7 +313,9 @@
 --      ["Challenge objectives"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit03, A_Space_Adventure:moon02
 --      ["Challenge over!"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa, ClimbHome
+--      ["Change bounciness: Tap [B]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Content: [Left], [Right]"] = "", -- HedgeEditor
+--      ["Change detonation timer: Tap the [Clock]"] = "", -- Basic_Training_-_Grenade, A_Classic_Fairytale:shadow
 --      ["Change direction: [Left]/[Right]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Change Health: [Left], [Right]"] = "", -- HedgeEditor
@@ -334,6 +335,8 @@
 --      ["Chicken"] = "", -- 
 --      ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01
 --      ["Chikorita"] = "", -- 
+--      ["Choose location: Left click"] = "", -- A_Classic_Fairytale:shadow
+--      ["Choose location: Tap the [Target] button, then tap on the spot you want to choose"] = "", -- A_Classic_Fairytale:shadow
 --      ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Choose your continent wisely, as your decision will be permanent."] = "", -- Continental_supplies
 --      ["Choose your side! If you want to join the strange man, walk up to him.|Otherwise, walk away from him. If you decide to att...nevermind..."] = "", -- A_Classic_Fairytale:shadow
@@ -342,7 +345,6 @@
 --      ["Cleaver"] = "", -- Construction_Mode
 --      ["Cleaver Placement Mode"] = "", -- Construction_Mode
 --      ["CLEAVER PLACEMENT MODE"] = "", -- HedgeEditor
---      ["Climber"] = "", -- ClimbHome
 --      ["Climb Home"] = "", -- ClimbHome
 --      ["Closing in"] = "", -- A_Classic_Fairytale:queen
 --      ["Clown"] = "", -- HedgeEditor
@@ -352,11 +354,13 @@
 --      ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb
 --      ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey
 --      ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey
+--      ["- Collect all the blue crates"] = "", -- HedgeEditor
 --      ["Collect all the crates, but remember, our time in this life is limited!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect or destroy all the health crates."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Collect or destroy the final crate to finish the training."] = "", -- Basic_Training_-_Flying_Saucer
+--      ["- Collect the blue crate"] = "", -- HedgeEditor
 --      ["Collect the crate and attack!"] = "", -- WxW
---      ["Collect the crate on the right.|Hint: Select the rope, [Up] or [Down] to aim, [Space] to fire, directional keys to move.|Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Collect the crate on the right."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the crates within the time limit!|If you fail, you'll have to try again."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the first crate to begin!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Collect the freezer and get the device part from Thanta."] = "", -- A_Space_Adventure:ice01
@@ -424,7 +428,6 @@
 --      ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates per turn: %d"] = "", -- WxW
---      ["crate(s)"] = "", -- SpeedShoppa
 --      ["Crazy Gravity: Gravity randomly changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity
 --      ["Crazy Runner"] = "", -- A_Space_Adventure:moon02
 --      ["Cricket Time"] = "", -- Continental_supplies
@@ -457,11 +460,10 @@
 --      ["Deals 15 damage to all enemies in the circle."] = "", -- Continental_supplies
 --      ["Deer"] = "", -- 
 --      ["Defeat all enemies!"] = "", -- portal
+--      ["Defeat!"] = "", -- HedgeEditor
 --      ["Defeat Professor Hogevil!"] = "", -- A_Space_Adventure:death01
---      ["Defeat the cannibals"] = "", -- A_Classic_Fairytale:backstab
---      ["Defeat the cannibals!|"] = "", -- A_Classic_Fairytale:united
+--      ["Defeat the cannibals!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cannibals!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Defeat the cannibals!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cyborgs!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen
 --      ["Delete Waypoint"] = "", -- HedgeEditor
@@ -482,11 +484,11 @@
 --      ["Destroyer of planes"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Destroy him, Leaks A Lot! He is responsible for the deaths of many of us!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion
+--      ["- Destroy the enemy"] = "", -- HedgeEditor
+--      ["- Destroy the red target"] = "", -- HedgeEditor
+--      ["- Destroy the red targets"] = "", -- HedgeEditor
 --      ["Destroy the targets!"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
---      ["Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
---      ["Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"] = "", -- A_Classic_Fairytale:first_blood
 --      ["+%d flamer fuel!"] = "", -- Tumbler
---      ["%d Hapless Hogs left"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["+%d health"] = "", -- Mutant
 --      ["%d-Hit Combo! +%d points!"] = "", -- Space_Invasion
 --      ["Did anyone follow you?"] = "", -- A_Classic_Fairytale:united
@@ -507,7 +509,6 @@
 --      ["Disguise as a Rockhopper Penguin"] = "", -- Continental_supplies
 --      ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies
 --      ["Displacer"] = "", -- 
---      ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Diver"] = "", -- User_Mission_-_Diver
 --      ["%d ms"] = "", -- HedgeEditor
 --      ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen
@@ -594,10 +595,8 @@
 --      ["Elderbot"] = "", -- A_Classic_Fairytale:family
 --      ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape
 	["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Förstör alla målen innan din tid tar slut.|Du har obegränsad ammunition för deta uppdrag", --Bazooka, Shotgun, SniperRifle
---      ["Eliminate the Blue Team before the time runs out."] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Eliminate the enemy before the time runs out."] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 --      ["Eliminate the enemy hogs to win."] = "",
---      ["Eliminate the enemy specialists."] = "",
 --      ["Eliminate the enemy."] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh
 --      ["Eliminate Unit 3378."] = "", -- User_Mission_-_Teamwork
 --      ["Eliminate WatchBot 4000."] = "", -- User_Mission_-_Teamwork_2
@@ -622,13 +621,14 @@
 --      ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab
 --      ["Except me, of course! I just saved a whole planet!"] = "", -- A_Space_Adventure:final
 --      ["Experienced beginner"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Explore the tunnel with the other hedgehogs and search for the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Explore the tunnel with the other hedgehogs and search for the device."] = "", -- A_Space_Adventure:fruit02
 --      ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02
 --      ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey
 --      ["Fair Wind"] = "", -- 
 --      ["Fall Damage"] = "", -- Basic_Training_-_Movement
 --      ["Fallen Angel"] = "", -- Tentacle_Terror
 --      ["Family Reunion"] = "", -- A_Classic_Fairytale:family
+--      ["Fastest escape: %d turns"] = "", -- A_Space_Adventure:desert02
 --      ["Fastest lap: %.3fs by %s"] = "", -- TrophyRace
 	["Fastest lap: "] = "Snabbast varv: ",
 	["Feeble Resistance"] = "Klent motstånd",
@@ -648,11 +648,12 @@
 --      ["Final result"] = "", -- Mutant
 --      ["Final Targets"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
 --      ["Final team scores:"] = "", -- Space_Invasion
+--      ["Find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Find a way to detonate all the explosives and stay alive!"] = "", -- A_Space_Adventure:final
 --      ["Find your tribe!|Cross the lake!"] = "", -- A_Classic_Fairytale:dragon
 --      ["Finish this challenge as fast as possible to earn bonus points."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Finish waypoint placement"] = "", -- Racer
---      ["Finish your training|Hint: Animations can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Finish your training."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Finite Ropes"] = "", -- Basic_Training_-_Rope
 --      ["Fire a rocket with napalm."] = "", -- Continental_supplies
 --      ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler
@@ -680,6 +681,7 @@
 --      ["Flying Saucer Training"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Fly into space to fight off the invaders with barrels!"] = "", -- Space_Invasion
 --      ["Fly to the meteorite and detonate the explosives"] = "", -- A_Space_Adventure:cosmos
+--      ["Follow the path and destroy the next target."] = "", -- Basic_Training_-_Rope
 --      ["Forgetfulness: You will lose all your weapons each turn."] = "", -- Continental_supplies
 --      ["For the next crate, you have to do back jumps."] = "", -- Basic_Training_-_Movement
 --      ["Four Eyes"] = "", -- 
@@ -699,9 +701,7 @@
 --      ["“g=150”, where 150 is 150% of normal gravity."] = "", -- Gravity
 --      ["“g=50, g2=150, period=4000” for gravity changing|from 50 to 150 and back with period of 4000 ms."] = "", -- Gravity
 --      ["Galaxy Guardians"] = "", -- Big_Armory
---      ["Game Modifiers: "] = "",
 --      ["Game over!"] = "", -- Space_Invasion
-	["GAME OVER!"] = "SPELET ÄR SLUT!",
 	["Game Started!"] = "Spel startat!",
 --      ["Game? Was this a game to you?!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Gangsters"] = "", -- 
@@ -710,8 +710,6 @@
 --      ["Gasp! A smuggler!"] = "", -- A_Space_Adventure:desert01
 --      ["Gasp!"] = "", -- A_Space_Adventure:desert01
 --      ["Gathering fruits all day long."] = "", -- A_Classic_Fairytale:queen
---      ["Gear information hidden"] = "", -- HedgeEditor
---      ["Gear information shown"] = "", -- HedgeEditor
 --      ["Gear Placement Tool"] = "", -- HedgeEditor
 --      ["General information"] = "", -- Continental_supplies
 --      ["General information:"] = "", -- Continental_supplies
@@ -721,7 +719,7 @@
 --      ["Get Dense Cloud out of the pit!"] = "", -- A_Classic_Fairytale:journey
 --      ["Get him, Spike!"] = "", -- A_Space_Adventure:desert01
 	["Get on over there and take him out!"] = "Ta dig bort där och gör dig av med honom!",
---      ["Get on the head of the mole"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Get on the head of the mole."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Get past the flower."] = "", -- A_Classic_Fairytale:journey
 --      ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01
 --      ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood
@@ -759,7 +757,6 @@
 	["GO! GO! GO!"] = "Kör! Kör! Kör!",
 	["Good birdy......"] = "Fin fågel......",
 --      ["Good bye!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Good Dude"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Good idea, they'll never find us there!"] = "", -- A_Classic_Fairytale:united
 --      ["Good job!"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Good job! Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -770,7 +767,7 @@
 --      ["Good so far!"] = "",
 --      ["Good to go!"] = "",
 --      ["Good! You now control Cappy."] = "", -- Basic_Training_-_Movement
---      ["Go on top of the flower"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Go on top of the flower."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Go, quick!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Gorkij"] = "", -- A_Classic_Fairytale:journey
 --      ["Go surf!"] = "", -- WxW
@@ -793,7 +790,6 @@
 --      ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow
 --      ["Green"] = "", -- 
 --      ["Green Bananas"] = "", -- A_Space_Adventure:fruit01
---      ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Green double rings also give you a new flying saucer."] = "", -- A_Space_Adventure:ice02
 --      ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01
 --      ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01
@@ -803,11 +799,8 @@
 --      ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Greetings from the Navy, %s (%s), for being a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["Greetings, %s!"] = "", -- A_Classic_Fairytale:dragon
---      ["Greg"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
---      ["Grenade Group"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard
 --      ["Grenades explode after 1 to 5 seconds (you decide)."] = "", -- Basic_Training_-_Grenade
 --      ["Grenades with high bounciness bounce a lot and behave chaotic."] = "", -- Basic_Training_-_Grenade
---      ["Grenade Team"] = "", -- Basic_Training_-_Grenade
 --      ["Grenade Training"] = "", -- Basic_Training_-_Grenade
 --      ["Grenadiers"] = "", -- Basic_Training_-_Grenade
 --      ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor
@@ -848,7 +841,6 @@
 --      ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion
 --      ["Health Modification Mode"] = "", -- HedgeEditor
 --      ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor
---      ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
 --      ["Heavenly Defense"] = "", -- Tentacle_Terror
 --      ["Heavy"] = "",
 --      ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united
@@ -861,6 +853,7 @@
 --      ["Hedgehog Projectile"] = "", -- Continental_supplies
 --      ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies
 --      ["Hedgehogs can not be deleted."] = "", -- HedgeEditor
+--      ["Hedgehogs left: %d"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Hedgehogs will be revived after their death."] = "", -- Mutant
 --      ["Hedgehogs will start in the first waypoint."] = "", -- Racer
 --      ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab
@@ -876,7 +869,6 @@
 --      ["Help Enabled"] = "", -- HedgeEditor
 --      ["Helpers: Each team starts with %d helper points"] = "", -- Battalion
 --      ["Helpers: Hogs will get 1 out of 2 helpers randomly each turn"] = "", -- Battalion
---      ["Help Hog Solo to find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Help me, Leaks!"] = "", -- A_Classic_Fairytale:journey
 --      ["Help me, please!!!"] = "", -- A_Classic_Fairytale:journey
 --      ["Help me, please!"] = "", -- A_Classic_Fairytale:journey
@@ -891,20 +883,20 @@
 --      ["Here you will find the current mission instructions."] = "", -- Basic_Training_-_Movement
 --      ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Heroic Wind"] = "", -- Continental_supplies
---      ["Hero Team"] = "", -- User_Mission_-_The_Great_Escape
 --      ["He's so brave..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["He was the lab assistant of Dr. Goodhogan, the inventor of the anti-gravity device."] = "", -- A_Space_Adventure:moon02
 --      ["He won't be selling us out anymore!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey, don't forget us! We still need to climb up!"] = "", -- A_Classic_Fairytale:family
 --      ["Hey, guys!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey guys!"] = "", -- A_Classic_Fairytale:united
---      ["Hey, Hog Solo! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey! I was supposed to collect it!"] = "", -- A_Space_Adventure:fruit02
+--      ["Hey, %s! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey, %s! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey
 --      ["Hidden"] = "", -- portal
 --      ["High Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["High Jump: [Backspace]"] = "", -- Basic_Training_-_Movement
+--      ["High Jump: Tap the [Curvy Arrow] shortly"] = "", -- Basic_Training_-_Movement
 --      ["--- Highland ---"] = "", -- Battalion
 --      ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander
 --      ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion
@@ -915,20 +907,24 @@
 --      ["Hill Guard"] = "", -- Bazooka_Battlefield
 --      ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01
 --      ["--- Hint ---"] = "", -- Battalion
---      ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
 --      ["Hint: Drilling holes should solve everything."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: Hold down [M] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: If this mission panel disappears, you can|see it again by hitting the Pause or Quit key."] = "", -- Basic_Training_-_Movement
 --      ["Hint: It might be a good idea to place a girder before starting to drill. Just saying."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: It might be easier if you vary the angle only slightly."] = "", -- Basic_Training_-_Bazooka
+--      ["Hint: Just select the parachute, it opens automatically when you fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion
 --      ["Hint: Launch the bazooka horizontally at full power."] = "", -- Basic_Training_-_Bazooka
---      ["Hint: Press [Esc] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Pause the game to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Select the blow torch, aim and press [Fire]. Press [Fire] again to stop."] = "", -- A_Classic_Fairytale:journey
 --      ["Hint: Select the low gravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey
+--      ["Hint: Select the rope, [Up] or [Down] to aim, [Attack] to fire, directional keys to move."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Select the Shoryuken and hit [Attack].|P.S.: You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: %s needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family
 --      ["Hint: The rope only bends around objects.|When it doesn't hit anything, it's always straight."] = "", -- Basic_Training_-_Rope
 --      ["Hint: To jump higher, wait a bit before you hit “High Jump” a second time."] = "", -- Basic_Training_-_Movement
+--      ["Hint: To place a girder, select it,|then use [Left] and [Right] to select angle and length,|then choose a location for the girder."] = "", -- A_Classic_Fairytale:shadow
 --      ["Hint: Use the quit key to see the team’s continent."] = "", -- Continental_supplies
 --      ["Hint: When you shorten the rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope
 --      ["Hint: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey
@@ -962,24 +958,11 @@
 --      ["Hogminator"] = "", -- A_Classic_Fairytale:family
 --      ["Hog nueve"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog octo"] = "", -- A_Space_Adventure:fruit03
---      ["Hogonauts"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Hog onze"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog Saturn"] = "", -- A_Space_Adventure:fruit03
 --      ["Hogs in sight!"] = "", -- Continental_supplies
 --      ["Hog Solo and GB"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hog Solo"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01, A_Space_Adventure:moon02
---      ["Hog Solo couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo escaped successfully!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo has to reach the last crates"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo has to refuel his saucer."] = "", -- A_Space_Adventure:moon01
---      ["Hog Solo lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
---      ["Hog Solo wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["- Hogs will be revived"] = "", -- Capture_the_Flag
 --      ["- Hogs will drop the flag when killed"] = "", -- Capture_the_Flag
 --      ["Hog two"] = "", -- A_Space_Adventure:fruit03
@@ -989,9 +972,7 @@
 --      ["Homing Bee"] = "", -- Construction_Mode
 --      ["Honda"] = "", -- 
 --      ["Honest Lee"] = "", -- A_Classic_Fairytale:enemy
---      ["Hook"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
 --      ["Hooks"] = "", -- 
-	["Hooray!"] = "Hurra!",
 --      ["Hooray! I actually did it! Hogera is safe!"] = "", -- A_Space_Adventure:final
 --      ["Hooray! I've found it, now I have to get back to Captain Lime!"] = "", -- A_Space_Adventure:fruit02
 --      ["Hooray! You are a champion!"] = "", -- A_Space_Adventure:ice02
@@ -1007,7 +988,7 @@
 --      ["However, if you fail to do so, she dies a most violent death, just like your friend! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, if you fail to do so, she dies a most violent death! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, my mates don't agree with me on letting you go..."] = "", -- A_Classic_Fairytale:dragon
---      ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
+--      ["However, the army of %s is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
 --      ["How to Rope"] = "", -- Basic_Training_-_Rope
 --      ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen
 --      ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen
@@ -1027,7 +1008,6 @@
 --      ["I can't believe what I'm hearing!"] = "", -- A_Classic_Fairytale:backstab
 --      ["I can't let you go further because …"] = "", -- A_Classic_Fairytale:queen
 --      ["I can't wait any more, I have to save myself!"] = "", -- A_Classic_Fairytale:shadow
---      ["Ice"] = "", -- Basic_Training_-_Movement
 --      ["Ice Jake"] = "", -- A_Space_Adventure:ice01
 --      ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family
 --      ["Icy Girder: [3]"] = "", -- HedgeEditor
@@ -1085,7 +1065,6 @@
 --      ["I just found out that they have captured your princess!"] = "", -- A_Classic_Fairytale:family
 --      ["I just want the strange device you found!"] = "", -- A_Space_Adventure:ice01
 --      ["I just wonder where Ramon and Spiky disappeared..."] = "", -- A_Classic_Fairytale:journey
---      ["Ikeda"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["I know and I'm terribly sorry!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know, my hero!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know that your resources are low due to the battle but I'll send two of my best hogs to assist you."] = "", -- A_Space_Adventure:fruit02
@@ -1113,6 +1092,7 @@
 --      ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen
 --      ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united
 --      ["IMPORTANT: To see the mission panel again, hold the mission panel key."] = "", -- Basic_Training_-_Movement
+--      ["IMPORTANT: To see the mission panel again, pause the game."] = "", -- Basic_Training_-_Movement
 --      ["Impressive...you are still dry as the corpse of a hawk after a week in the desert..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["%i ms"] = "", -- Gravity
 --      ["I'm so glad this is finally over!"] = "", -- A_Space_Adventure:final
@@ -1271,7 +1251,6 @@
 --      ["Kill the traitor, %s, or spare his life!"] = "", -- A_Classic_Fairytale:backstab
 --      ["--- King ---"] = "", -- Battalion
 --      ["King"] = "", -- Battalion
---      ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing
 --      ["--- King Mode ---"] = "", -- Battalion
 --      ["Knight"] = "", -- Battalion
 --      ["Knives"] = "", -- 
@@ -1290,7 +1269,7 @@
 --      ["Launch some bazookas to destroy the targets!"] = "", -- Basic_Training_-_Bazooka
 --      ["Leader"] = "", -- A_Classic_Fairytale:enemy
 --      ["Leaderbot"] = "", -- A_Classic_Fairytale:queen
---      ["Lead the Green Bananas to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
+--      ["Lead your allies to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
 --      ["Leaks A Lot"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Leaks A Lot, depressed for killing his loved one, failed to save the village..."] = "", -- A_Classic_Fairytale:journey
 --      ["Leaks A Lot gave his life for his tribe! He should have survived!"] = "", -- A_Classic_Fairytale:first_blood
@@ -1305,7 +1284,6 @@
 --      ["Left/right: Choose crate contents"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode
---      ["Left Tong"] = "", -- Bazooka_Battlefield
 --      ["Legs"] = "", -- 
 --      ["Less tools, more fun"] = "", -- Battalion
 --      ["Lestat"] = "", -- portal
@@ -1334,18 +1312,19 @@
 --      ["Lively Lifeguard"] = "",
 --      ["Lonely Cries"] = "", -- Continental_supplies
 --      ["Lonely Cries: [Rise the water if no hog is in the circle and deal 6 damage to all enemy hogs.]"] = "", -- Continental_supplies
---      ["Lonely Hog"] = "", -- ClimbHome
 --      ["Long Jump: [Enter]"] = "", -- Basic_Training_-_Movement
+--      ["Long Jump: Tap the [Curvy Arrow] button for long"] = "", -- Basic_Training_-_Movement, A_Classic_Fairytale:first_blood
 --      ["Long Live The Queen"] = "", -- A_Classic_Fairytale:queen
 --      ["Look around: [Mouse movement]"] = "", -- Basic_Training_-_Movement
+--      ["Look around: [Tap or swipe on the screen]"] = "", -- Basic_Training_-_Movement
 --      ["Look, boss! There is the target!"] = "", -- A_Space_Adventure:moon01
 --      ["Look, I had no choice!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! There's more of them!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! We're surrounded by cannibals!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Looks like the whole world is falling apart!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Look to the left and do a backwards jump towards the mushroom."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Loon"] = "", -- The_Specialists
 --      ["Loopy"] = "", -- 
---      ["Lord Evil"] = "", -- Tentacle_Terror
 --      ["Losing Condition: Destroy"] = "", -- HedgeEditor
 --      ["Low Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander
@@ -1365,7 +1344,6 @@
 --      ["Mario"] = "", -- 
 --      ["Mark gears for win/lose conditions"] = "", -- HedgeEditor
 --      ["Mark/unmark gear: [Left Click]"] = "", -- HedgeEditor
---      ["Mark"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
 --      ["- Massive weapon bonus on first turn"] = "", -- Continental_supplies
 --      ["Max Citrus"] = "", -- A_Space_Adventure:fruit01
 --      ["Maybe you should try an easier map next time."] = "", -- Racer
@@ -1380,7 +1358,6 @@
 --      ["Mega kill!"] = "", -- Mutant
 --      ["Meiwes"] = "", -- A_Classic_Fairytale:backstab
 --      ["mikade"] = "", -- 
---      ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer
 --      ["Mindy"] = "", -- A_Classic_Fairytale:united
 --      ["Mine Deployer"] = "",
 --      ["Mine Placement Mode"] = "", -- Construction_Mode
@@ -1399,12 +1376,12 @@
 --      ["Minion"] = "", -- A_Space_Adventure:moon01
 --      ["Minions"] = "", -- A_Space_Adventure:moon01
 --      ["Mission failed!"] = "", -- Big_Armory
-	["MISSION FAILED"] = "UPPDRAG MISSLYCKADES", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Mission failure in %d s"] = "", -- Big_Armory
+--      ["Mission"] = "", -- HedgeEditor
 --      ["Mission lost!"] = "", -- Basic_Training_-_Grenade
 --      ["Mission Panel"] = "", -- Basic_Training_-_Movement
 --      ["Mission panel: [M]"] = "", -- Basic_Training_-_Movement
-	["MISSION SUCCESSFUL"] = "UPPDRAG SLUTFÖRT", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+--      ["Mission succeeded!"] = "", -- portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, SimpleMission, HedgeEditor
 --      ["Mission won!"] = "", -- Basic_Training_-_Grenade
 --      ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02
 --      ["Mixed %d"] = "", -- WxW
@@ -1420,7 +1397,6 @@
 --      ["Monster kill!"] = "", -- Mutant
 --      ["Monsters"] = "", -- 
 --      ["Mooney"] = "", -- 
---      ["More Natives"] = "", -- A_Classic_Fairytale:epil
 --      ["Morris"] = "", -- 
 --      ["Most mines are not active."] = "", -- A_Space_Adventure:desert02
 --      ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01
@@ -1440,13 +1416,11 @@
 --      ["Nade Boy"] = "", -- Basic_Training_-_Grenade
 --      ["Nah, probably everyone was just stupid."] = "", -- A_Space_Adventure:final
 --      ["Name"] = "", -- A_Classic_Fairytale:queen
---      ["Nameless Heroes"] = "",
 --      ["Nancy Screw"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:queen
 --      ["Napalm"] = "", -- Construction_Mode
 --      ["Napalm Rocket"] = "", -- Continental_supplies
 --      ["Napalm rocket: [Fire a bomb with napalm!]"] = "", -- Continental_supplies
 --      ["Naranja Jed"] = "", -- A_Space_Adventure:fruit01
---      ["Natives"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Naughty Ninja"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Near a PAotH base on the moon ..."] = "", -- A_Space_Adventure:moon01
 --      ["Near Secret Base 17 of PAotH in the rural Hogland ..."] = "", -- A_Space_Adventure:cosmos
@@ -1541,11 +1515,8 @@
 --      ["Oh, my!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oh, my! I forgot something!"] = "", -- A_Classic_Fairytale:queen
 --      ["Oh, my! This is even more entertaining than I've expected!"] = "", -- A_Classic_Fairytale:backstab
-	["Oh no! Just try again!"] = "Å nej! Bara att försöka igen!", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Oh no, not %s!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
---      ["Oh no, the Green Bananas have betrayed Hog Solo and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
-	["Oh no! Time's up! Just try again."] = "Åh nej! Tiden är ute! Pröva igen.", --Bazooka, Shotgun, SniperRifle
---      ["Oh no! You failed! Just try again."] = "", -- Basic_Training_-_Cluster_Bomb
+--      ["Oh no, the companions have betrayed %s and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
 --      ["Oh no! You have died. Try again!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Oh! Please spare me. You can take all my treasures!"] = "", -- A_Space_Adventure:ice01
 --      ["Oh, silly me! I forgot that I'm the shaman."] = "", -- A_Classic_Fairytale:backstab
@@ -1567,9 +1538,9 @@
 --      ["One shall not judge one by one's appearance!"] = "", -- A_Classic_Fairytale:epil
 --      ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oneye"] = "", -- portal
---      ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant
 --      ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant
+--      ["Only %s can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard
 --      ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01
@@ -1581,6 +1552,7 @@
 --      ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01
 --      ["Oops! You have selected the wrong hedgehog! Just try again."] = "", -- Basic_Training_-_Movement
 --      ["Open ammo menu: [Right click]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
+--      ["Open ammo menu: Tap the [Suitcase]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
 --      ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood
 	["Opposing Team: "] = "Motståndarlag: ",
 --      ["Orange"] = "", -- 
@@ -1600,15 +1572,14 @@
 --      ["PAotH has sent explosives but unfortunately the trigger mechanism seems to be faulty!"] = "", -- A_Space_Adventure:cosmos
 --      ["Parachute"] = "", -- Continental_supplies
 --      ["Patches"] = "", -- 
---      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02
 --      ["Pause: [P]"] = "", -- Basic_Training_-_Movement
+--      ["Pause: Tap the [Pause] button"] = "", -- Basic_Training_-_Movement
 --      ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW
 --      ["Penguin Roar"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hog’s health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Perfect! Now try to get the next crate without hurting yourself!"] = "", -- A_Classic_Fairytale:first_blood
---      ["Per-Hog Ammo"] = "",
 --      ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh
 --      ["Personal best: %.3f seconds"] = "", -- A_Space_Adventure:ice02
 --      ["Per team weapons"] = "", -- Continental_supplies
@@ -1617,7 +1588,6 @@
 --      ["Physicist"] = "", -- HedgeEditor
 --      ["Piano Strike"] = "", -- Construction_Mode
 --      ["Pikachu"] = "", -- 
---      ["Pincer Knights"] = "", -- Bazooka_Battlefield
 --      ["Pings left: %d"] = "", -- Space_Invasion
 --      ["Pink"] = "", -- 
 --      ["Pirates"] = "", -- 
@@ -1669,9 +1639,7 @@
 --      ["Please wait …"] = "", -- WxW
 --      ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion
 --      ["--- Points ---"] = "", -- Battalion
---      ["points"] = "", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
 --      ["--- Points Mode ---"] = "", -- Battalion
---      ["point(s)"] = "", -- TargetPractice, Mutant
 	["Poison"] = "Gift",
 --      ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02
 --      ["Poisonous, deals no damage."] = "", -- Continental_supplies
@@ -1691,37 +1659,37 @@
 --      ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to fight"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos
---      ["Prepare yourself"] = "",
+--      ["Prepare yourself, %s!"] = "", -- The_Specialists
 --      ["Press [Attack] (space bar by default) to start,|repeadedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] (space bar by default) to start,|repeatedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] to begin."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Attack] to confirm."] = "", -- Continental_supplies
 --      ["Press [Attack] to select this continent!"] = "", -- Continental_supplies
 --      ["Press [Left] and [Right] to change the difficulty."] = "", -- A_Classic_Fairytale:first_blood
---      ["Press [Left] or [Right] to move around, [Enter] to jump"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Press [Left] or [Right] to move around, [Long Jump] to jump forwards."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW
 --      ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW
+--      ["Press [M] to see the mission texts"] = "", -- Basic_Training_-_Movement
 --      ["Press [Precise] to skip intro"] = "",
 --      ["Press [Up] and [Down] to move between menu items.|Press [Attack], [Left], or [Right] to toggle."] = "", -- WxW
 --      ["Prestigious Pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Princess"] = "", -- A_Classic_Fairytale:family, A_Classic_Fairytale:journey
 --      ["Princess Peach"] = "", -- 
---      ["Private Nolak"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["Problems, dude? Chillax!"] = "", -- A_Classic_Fairytale:epil
 --      ["Professional pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professional stunt pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professor"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
 --      ["Professor Hogevil, then known as James Hogus, worked for PAotH back in my time."] = "", -- A_Space_Adventure:moon02
+--      ["Professor's Team"] = "", -- A_Space_Adventure:death01
 --      ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
---      ["Pro Killers"] = "", -- Big_Armory
 --      ["Protect the King: When the king dies, so does the team"] = "", -- Battalion
 --      ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Protect yourselves!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Purple"] = "", -- 
 --      ["Pyro"] = "", -- HedgeEditor, The_Specialists
 --      ["Pyromancer"] = "", -- Battalion
 --      ["Quit: [Esc]"] = "", -- Basic_Training_-_Movement
 --      ["Race complexity limit reached"] = "", -- Racer, TechRacer
+--      ["Race failed!"] = "", -- A_Space_Adventure:moon02
 --      ["Racer"] = "", -- Racer
 --      ["Racer tool"] = "", -- Racer
 --      ["Race"] = "", -- TrophyRace
@@ -1757,23 +1725,19 @@
 --      ["Replenishment: Weapons are restocked on turn start of a new hog"] = "", -- Highlander
 --      ["Repositioning Mode"] = "", -- HedgeEditor
 --      ["REPOSITIONING MODE"] = "", -- HedgeEditor
---      ["rescues"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Rescue the imprisoned PAotH team and get the fuel!"] = "", -- A_Space_Adventure:moon01
 --      ["Respawner"] = "", -- Construction_Mode
 --      ["Respawner: Resurrects dead hogs."] = "", -- Construction_Mode
 --      ["Resurrector"] = "", -- Construction_Mode
 --      ["Retract/Extend rope: [Up]/[Down]"] = "", -- Basic_Training_-_Rope
 --      ["- Return the enemy flag to your base to score"] = "", -- Capture_the_Flag
-	[" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = " - Återvänd med fiendens flagga till din bas för att ta poäng | - Första laget till tre vinner | - Du kan bara ta poäng när din egen flagga är i basen | - Kottar tappar flaggan när de dödas eller drunknar | - Tappade flaggor kan tas tillbaka eller fångas | - Kottar kommer tillbaka när de dör",
 --      ["Return to Leaks A Lot!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Return to the mission menu by pressing the \"Go back\" button."] = "", -- A_Space_Adventure:cosmos
 --      ["Return to the Surface"] = "", -- A_Space_Adventure:fruit02
 --      ["Return to the training menu by pressing the “Go back” button."] = "", -- Basic_Training_-_Movement
---      ["Rhombus"] = "", -- Basic_Training_-_Movement
 --      ["Rider"] = "", -- portal
 --      ["Rifleman"] = "", -- Battalion
 --      ["Righteous Beard"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:queen, A_Classic_Fairytale:united
---      ["Right Tong"] = "", -- Bazooka_Battlefield
 --      ["Ripe"] = "", -- 
 --      ["Rise the water if nobody else is in the circle and deal 6 damage to all enemy hogs."] = "", -- Continental_supplies
 --      ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01
@@ -1782,8 +1746,8 @@
 --      ["Roof"] = "", -- WxW
 --      ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Rope Master"] = "", -- Basic_Training_-_Rope
---      ["Roper"] = "", -- SpeedShoppa
 --      ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
+--      ["Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Rope Team"] = "", -- Basic_Training_-_Rope
 --      ["Rope Training"] = "", -- Basic_Training_-_Rope
 --      ["Rope Weapons"] = "", -- Basic_Training_-_Rope
@@ -1797,7 +1761,6 @@
 --      ["Round limit:"] = "", -- TechRacer
 --      ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer
 --      ["Round's slowest lap: %.3fs by %s"] = "", -- TrophyRace
---      ["Rounds until Sudden Death: %d"] = "", -- Battalion
 --      ["RS1"] = "", -- A_Space_Adventure:fruit03
 --      ["RS2"] = "", -- A_Space_Adventure:fruit03
 --      ["Rubber"] = "", -- Construction_Mode, HedgeEditor
@@ -1823,10 +1786,17 @@
 --      ["Salvation was one step closer now..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Sam"] = "", -- A_Space_Adventure:cosmos
 --      ["Sandals?! I thought you left your ring!"] = "", -- A_Classic_Fairytale:queen
+--      ["%s and GB"] = "", -- A_Space_Adventure:fruit02
 --      ["%s and %s enter the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sandstorm"] = "", -- A_Space_Adventure:desert01
 --      ["Sandy"] = "", -- A_Space_Adventure:desert01
---      ["Save as many hapless hogs as possible!"] = "",
+--      ["%s arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
+--      ["Save as many hogs as possible!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey
 --      ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow
 --      ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor
@@ -1838,9 +1808,9 @@
 --      ["Scallywag"] = "", -- 
 --      ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab
 --      ["Scenario"] = "", -- Big_Armory, portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape
---      ["Scenario failed!"] = "", -- SimpleMission
 --      ["Scientist"] = "", -- Battalion
 --      ["%s climbed home in %d seconds!"] = "", -- ClimbHome
+--      ["%s (contd.)"] = "", -- A_Classic_Fairytale:epil
 --      ["Score: %d"] = "", -- Space_Invasion
 --      ["Score goal: %d"] = "", -- Control
 --      ["Score graph"] = "", -- Mutant, Space_Invasion
@@ -1850,6 +1820,7 @@
 --      ["Scores"] = "", -- Mutant
 --      ["Scores:"] = "", -- Mutant
 --      ["Scoring: "] = "", -- Mutant
+--      ["%s couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
 --      ["Script parameter examples:"] = "", -- Gravity
 --      ["%s (+%d)"] = "", -- Battalion
 --      ["%s: %d"] = "", -- Capture_the_Flag, Control
@@ -1862,10 +1833,9 @@
 --      ["%s died … and lives again!"] = "", -- Construction_Mode
 --      ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome
 --      ["%s, %d sec"] = "", -- Continental_supplies
---      ["Search for the device with the help of the other hedgehogs "] = "", -- A_Space_Adventure:fruit02
+--      ["Search for the device with the help of the other hedgehogs."] = "", -- A_Space_Adventure:fruit02
 --      ["Searching in the dust"] = "", -- A_Space_Adventure:desert01
 --      ["Searching the stars!"] = "", -- A_Space_Adventure:cosmos
---      ["seconds"] = "", -- ClimbHome
 --      ["Seduction"] = "", -- Continental_supplies
 --      ["Seems like every time you take a \"walk\", the enemy finds us!"] = "", -- A_Classic_Fairytale:backstab
 --      ["See that crate farther on the right?"] = "", -- A_Classic_Fairytale:first_blood
@@ -1892,6 +1862,7 @@
 --      ["Select your continent with [Up]/[Down] or by selecting a representative weapon."] = "", -- Continental_supplies
 --      ["%s enters the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sergey"] = "", -- 
+--      ["%s escaped successfully!"] = "", -- A_Space_Adventure:fruit01
 --      ["Set bounciness: [Left Shift] + [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set detonation timer: [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set Health: [Left Click]"] = "", -- HedgeEditor
@@ -1915,10 +1886,12 @@
 --      ["%s has been killed before taking enough damage first."] = "", -- SimpleMission
 --      ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has been rescued from death"] = "", -- Construction_Mode
+--      ["%s has dropped the flag!"] = "", -- CTF_Blizzard
 --      ["%s has fallen victim to gravity."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has mutated! +2 points"] = "", -- Mutant
 --      ["%s has passed the best height of %s!"] = "", -- ClimbHome
 --      ["%s has scored!"] = "", -- Capture_the_Flag
+--      ["%s has to refuel the saucer."] = "", -- A_Space_Adventure:moon01
 --      ["%s hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil
 --      ["sheepluva"] = "", -- 
@@ -1935,8 +1908,6 @@
 --      ["Shinobi"] = "", -- 
 --      ["%s hit the ground."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Shoppa Love"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
---      ["Shoppa Union"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes, Challenge_-_Speed_Shoppa_-_ShoppaKing
---      ["Shoppers"] = "", -- SpeedShoppa
 --      ["Shotgun"] = "", -- Continental_supplies
 --      ["Sigh."] = "", -- A_Classic_Fairytale:epil
 --      ["Silly"] = "",
@@ -1949,11 +1920,11 @@
 --      ["%s is now as poor as a church mouse"] = "", -- Construction_Mode
 --      ["%s is now a zombie hedgehog"] = "", -- Construction_Mode
 --      ["%s is suddenly low on ammo"] = "", -- Construction_Mode
---      ["Skip your turn to try again."] = "", -- Basic_Training_-_Rope
 --      ["Skulls"] = "", -- Bazooka_Battlefield
 --      ["Slimer"] = "", -- 
 --      ["Slippery"] = "", -- A_Classic_Fairytale:journey
 --      ["%s lost all the weapons"] = "", -- Construction_Mode
+--      ["%s lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
 --      ["Slot %d: %s"] = "", -- Frenzy
 --      ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy
 --      ["Slowpoke"] = "", -- 
@@ -1967,6 +1938,7 @@
 --      ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smugglers"] = "", -- A_Space_Adventure:desert01
+--      ["%s must collect the final crates."] = "", -- A_Space_Adventure:fruit02
 --      ["%s must skip this turn for rule violation."] = "", -- WxW
 --      ["Sneaks"] = "", -- Bazooka_Battlefield
 --      ["%s never got the ninja diploma."] = "", -- ClimbHome
@@ -1975,10 +1947,8 @@
 --      ["Sniper"] = "", -- HedgeEditor, The_Specialists
 --      ["Sniper Rifle"] = "", -- Continental_supplies
 	["Sniper Training"] = "Prickskyttesträning",
-	["Sniperz"] = "Prickskyttarna",
 --      ["So, as promised I have brought you where I think that the device you are looking for is hidden."] = "", -- A_Space_Adventure:fruit02
 --      ["So far, you had infinite ropes, but in the|real world, ropes are usually limited."] = "", -- Basic_Training_-_Rope
---      ["So Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["So, I believe that it's a good place to start."] = "", -- A_Space_Adventure:desert01
 --      ["So, I kindly ask for your help."] = "", -- A_Space_Adventure:fruit01
@@ -1988,11 +1958,12 @@
 --      ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03
 --      ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen
 --      ["Some weapons can be dropped from the rope."] = "", -- Basic_Training_-_Rope
---      ["Somewhere else on the planet of fruits, Captain Lime helps Hog Solo"] = "", -- A_Space_Adventure:fruit02
---      ["Somewhere else on the planet of fruits Hog Solo gets closer to the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, Captain Lime helps %s"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, %s gets closer to the device"] = "", -- A_Space_Adventure:fruit02
 --      ["Somewhere on the Planet of Fruits a terrible war is about to begin ..."] = "", -- A_Space_Adventure:fruit01
 --      ["Somewhere on the uninhabitable Death Planet ..."] = "", -- A_Space_Adventure:death01
 --      ["So, now I got the last part and I have your friends captured."] = "", -- A_Space_Adventure:death01
+--      ["So, %s, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So the princess was never heard of again ..."] = "", -- A_Classic_Fairytale:family
 --      ["So, uhmm, how did you manage to teleport them so far?"] = "", -- A_Classic_Fairytale:epil
 --      ["Sour"] = "", -- 
@@ -2093,8 +2064,6 @@
 --      ["Structure Placement Mode"] = "", -- Construction_Mode
 --      ["Structure Placer"] = "", -- Construction_Mode
 --      ["Stupid, stupid Hogerians!"] = "", -- A_Space_Adventure:final
---      ["Subject 1"] = "", -- portal
---      ["Subjects"] = "", -- portal
 --      ["Subtract %d"] = "", -- HedgeEditor
 --      ["--- Sudden Death ---"] = "", -- Battalion
 --      ["Summer Squash"] = "", -- A_Space_Adventure:fruit01
@@ -2111,7 +2080,7 @@
 --      ["Surfer! +15 points!"] = "", -- Space_Invasion
 --      ["Surfer!"] = "", -- WxW
 --      ["Surprise supplies: Get 1-3 random weapons each turn."] = "", -- Continental_supplies
---      ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:shadow
+--      ["Survive!"] = "", -- A_Classic_Fairytale:shadow
 --      ["%s violated the “All But Last” rule and will be penalized."] = "", -- WxW
 --      ["%s violated the “Kill The Leader” rule and will be penalized."] = "", -- WxW
 --      ["Swap place with a random enemy in the circle."] = "", -- Continental_supplies
@@ -2130,6 +2099,7 @@
 --      ["%s! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
 --      ["Swing, Leaks A Lot, on the wings of the wind!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Swing: [Left]/[Right]"] = "", -- Basic_Training_-_Rope
+--      ["%s wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome
 --      ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer
 --      ["switch"] = "", -- Continental_supplies
@@ -2143,6 +2113,7 @@
 --      ["Switch Hog"] = "", -- Construction_Mode
 --      ["Switch: Select weapon special"] = "", -- Continental_supplies
 --      ["Switch: Toggle crate radar"] = "", -- WxW
+--      ["%s won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Swords"] = "", -- Bazooka_Battlefield
 --      ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon
 --      ["%s, you may choose the rules."] = "", -- WxW
@@ -2151,6 +2122,8 @@
 --      ["Tails"] = "", -- 
 --      ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Tall Potato"] = "", -- A_Space_Adventure:fruit01
+--      ["Tap [Pause] to see the mission texts"] = "", -- Basic_Training_-_Movement
+--      ["Tap the “rotating arrow” button on the left|until you have selected Cappy, the hedgehog with the cap!"] = "", -- Basic_Training_-_Movement
 --      ["Target"] = "", -- HedgeEditor
 --      ["Target Placement Mode"] = "", -- Construction_Mode
 --      ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor
@@ -2166,15 +2139,18 @@
 --      ["Tatters"] = "", -- 
 	["Team %d: "] = "Lag %d: ",
 --      ["Team %d"] = "", -- SimpleMission
+--      ["Team highscore: %d"] = "", -- Utils
 --      ["Team Identity Mode"] = "", -- HedgeEditor
 --      ["TEAM IDENTITY MODE"] = "", -- HedgeEditor
---      ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
+--      ["Team lowscore: %d"] = "", -- Utils
 --      ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion
+--      ["Team's best time: %.3fs"] = "", -- Utils
 --      ["Team Scores:"] = "", -- Control
 --      ["Team scores:"] = "", -- Space_Invasion
+--      ["Team's longest time: %.3fs"] = "", -- Utils
+--      ["Team's top accuracy: %d%"] = "", -- Utils
 --      ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2
 --      ["Teamwork"] = "", -- User_Mission_-_Teamwork
---      ["Team Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
 --      ["TechRacer"] = "", -- TechRacer
 --      ["Teleporation Node"] = "", -- Construction_Mode
 --      ["Teleportation Mode"] = "", -- Construction_Mode
@@ -2266,11 +2242,12 @@
 --      ["The forgotten continent"] = "", -- Continental_supplies
 --      ["The giant umbrella from the last crate should help break the fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Great Escape"] = "", -- User_Mission_-_The_Great_Escape
---      ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01
+--      ["- The green target must survive"] = "", -- HedgeEditor
+--      ["- The green targets must survive"] = "", -- HedgeEditor
 --      ["The guardian"] = "", -- A_Classic_Fairytale:shadow
 --      ["The hardships of the war turned %s (%s) into a killing machine: %d invaders destroyed in one round!"] = "", -- Space_Invasion
+--      ["The health of your current hedgehog|is shown at the top right corner."] = "", -- Basic_Training_-_Movement
 --      ["The hedgehog with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant
---      ["The Hogies"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["The Hospital"] = "", -- 
 --      ["The Individualist"] = "", -- A_Classic_Fairytale:shadow
 --      ["Their buildings were very primitive back then, even for an uncivilised island."] = "", -- A_Classic_Fairytale:united
@@ -2288,7 +2265,6 @@
 --      ["The Mutant has super-weapons and a lot of health."] = "", -- Mutant
 --      ["The Mutant loses health quickly, but gains health by killing."] = "", -- Mutant
 --      ["The Mutant loses health quickly if he doesn't keep scoring kills."] = "", -- Mutant
---      ["The Nameless One"] = "",
 --      ["The Navy greets %s for managing to get in a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["The next 4 times you play the \"The last encounter\" mission you'll get 20 more hit points and a laser sight."] = "", -- A_Space_Adventure:death02
 --      ["The next crate is an utility crate."] = "", -- Basic_Training_-_Movement
@@ -2302,6 +2278,7 @@
 --      ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil
 --      ["The oppression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
 --      ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
+--      ["The other hog has died, he should have survived!"] = "", -- A_Space_Adventure:moon02
 --      ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Police"] = "", -- 
 --      ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -2326,7 +2303,7 @@
 --      ["The Showdown"] = "", -- A_Classic_Fairytale:shadow
 --      ["The Slaughter"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:first_blood
 --      ["The Society of Perfectionists greets %s (%s): No misses and %d hits in its best round."] = "", -- Space_Invasion
---      ["THE SPECIALISTS"] = "",
+--      ["The Specialists: Each hedgehog starts with its own weapon set"] = "", -- The_Specialists
 --      ["The spinning arrows above your hedgehog show|which hedgehog is selected right now."] = "", -- Basic_Training_-_Movement
 --      ["The spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
@@ -2374,7 +2351,6 @@
 --      ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["This also increases the effectiveness of Medicine."] = "", -- Continental_supplies
 --      ["This game wasn’t really exciting."] = "", -- Space_Invasion
---      ["This Hog Solo is so naive! When he returns I'll shoot him and keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This is a new personal best, congratulations!"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert02, A_Space_Adventure:fruit03
 --      ["This is a new personal best time, congratulations!"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["This is Cappy."] = "", -- Basic_Training_-_Movement
@@ -2392,6 +2368,7 @@
 --      ["This rain is really something..."] = "",
 --      ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome
 --      ["This seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01
+--      ["This %s is so naive! I'm going to shoot this fool so I can keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This was an awesome performance! But this challenge can be finished with even just one RC plane. Can you figure out how?"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["This will be fun!"] = "", -- A_Classic_Fairytale:enemy
 --      ["This will be useful when I need a new platform or if I want to rise."] = "", -- portal
@@ -2432,11 +2409,11 @@
 --      ["To begin with the training, hit the attack key!"] = "", -- Basic_Training_-_Movement
 --      ["To begin with the training, select the bazooka from the ammo menu!"] = "", -- Basic_Training_-_Bazooka
 --      ["To begin with the training, select the grenade from the ammo menu!"] = "", -- Basic_Training_-_Grenade
+--      ["To begin with the training, tap the attack button!"] = "", -- Basic_Training_-_Movement
 --      ["To finish hedgehog selection, just do anything|with him, like walking."] = "", -- Basic_Training_-_Movement
 --      ["To get over the next obstacles, keep some distance from the wall before you back jump."] = "", -- Basic_Training_-_Movement
 --      ["To get over the water, you have to do multiple|rope shots and swings."] = "", -- Basic_Training_-_Rope
 --      ["Toggle Editing Weapons and Tools: [Precise]+[2]"] = "", -- HedgeEditor
---      ["Toggle Gear Information: [Precise]+[3]"] = "", -- HedgeEditor
 --      ["Toggle Help: [Precise]+[1]"] = "", -- HedgeEditor
 --      ["Toggle Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Toggle Shield: [Long jump]"] = "", -- Space_Invasion
@@ -2446,14 +2423,14 @@
 --      ["Too bad! Then you should really leave!"] = "", -- A_Space_Adventure:fruit01
 --      ["Too slow! Try again ..."] = "", -- A_Space_Adventure:moon02
 --      ["Top-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"] = "", -- A_Classic_Fairytale:shadow
 --      ["To reach higher ground, walk to a ledge, look to the left, then do a back jump."] = "", -- Basic_Training_-_Movement
 --      ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey
 --      ["To the caves..."] = "", -- A_Classic_Fairytale:united
 --      ["Touch all waypoints as fast as you can!"] = "", -- Racer
---      ["To win the game, Hog Solo has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
+--      ["- Touch the sparkles near your base to teleport"] = "", -- CTF_Blizzard
+--      ["To win the game, %s has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
 --      ["To win the game you had to collect the 2 crates with no specific order."] = "", -- A_Space_Adventure:desert01
---      ["To win the game you have to eliminate all your enemies."] = "", -- A_Space_Adventure:death01
+--      ["To win the game you have to eliminate Professor Hogevil."] = "", -- A_Space_Adventure:death01
 --      ["To win the game you have to find the right crate."] = "", -- A_Space_Adventure:desert01
 --      ["To win the game you have to go next to Thanta."] = "", -- A_Space_Adventure:ice01
 --      ["To win the game you have to go to the surface."] = "", -- A_Space_Adventure:desert02
@@ -2461,13 +2438,10 @@
 --      ["To win the game you have to stand next to Thanta."] = "", -- A_Space_Adventure:ice01
 	["Toxic Team"] = "Förgiftade laget", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Track completed!"] = "", -- Racer, TechRacer
---      ["Trainee"] = "", -- TargetPractice
 --      ["Training"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Training complete!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Training Team"] = "", -- TargetPractice
 --      ["Traitors"] = "", -- A_Classic_Fairytale:epil
 --      ["Traitors don't get to shout around here!"] = "", -- A_Classic_Fairytale:epil
---      ["Trapped"] = "", -- Basic_Training_-_Movement
 --      ["Trapper"] = "", -- HedgeEditor
 --      ["Travel carefully as your fuel is limited"] = "", -- A_Space_Adventure:cosmos
 --      ["Travel to all the neighbor planets and collect all the pieces"] = "", -- A_Space_Adventure:cosmos
@@ -2484,7 +2458,6 @@
 --      ["Try to land softly, as you can still take fall damage!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Try to protect the chief! You won't lose if he dies, but it is advised that he survives."] = "", -- A_Classic_Fairytale:united
 --      ["Try to reach and destroy the next target quickly."] = "", -- Basic_Training_-_Rope
-	["T_T"] = "T_T",
 --      ["Tumbler"] = "", -- Tumbler
 --      ["Turn around: [Left Shift] + [Left]/[Right]"] = "", -- Basic_Training_-_Movement
 --      ["Turning Around"] = "", -- Basic_Training_-_Movement
@@ -2503,7 +2476,6 @@
 --      ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy
 --      ["Ukemi"] = "", -- 
 --      ["Ultra kill!"] = "", -- Mutant
---      ["Ultrasoldier"] = "", -- Big_Armory
 --      ["unC0Rr"] = "", -- 
 --      ["Under Construction"] = "", -- A_Classic_Fairytale:shadow
 --      ["Under normal circumstances we could easily defeat them but we have kindly sent most of our men to the Kingdom of Sand to help with the annual dusting of the king's palace."] = "", -- A_Space_Adventure:fruit01
@@ -2527,7 +2499,6 @@
 --      ["Unit 883"] = "", -- 
 --      ["United We Stand"] = "", -- A_Classic_Fairytale:united
 --      ["Unlike bazookas, grenades are not influenced by wind."] = "", -- Basic_Training_-_Grenade
---      ["Unlimited Attacks"] = "",
 --      ["Unlimited Attacks: Attacks don't end your turn"] = "", -- User_Mission_-_Diver, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree
 --      ["Unlucky Sods"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Unstoppable!"] = "",
@@ -2543,13 +2514,14 @@
 --      ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["User Challenge"] = "",
 --      ["!"] = "", -- User_Mission_-_Dangerous_Ducklings
+--      ["User Mission"] = "", -- HedgeEditor
 --      ["Use the attack key twice to change the flying saucer while being in air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the attack key twice to change the flying saucer while floating in mid-air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the bazooka and the flying saucer to get the freezer."] = "", -- A_Space_Adventure:ice01
 --      ["Use the flying saucer from the crate to fly to the moon."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly the other planets."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly to the other planets."] = "", -- A_Space_Adventure:cosmos
---      ["Use the parachute ([Space] while in air) to get the next crate"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Use the parachute to get the next crate."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Use the portal gun to get to the next crate, then use the new gun to get to the final destination!|"] = "", -- A_Classic_Fairytale:dragon
 --      ["Use the RC plane and destroy the all the targets."] = "", -- A_Space_Adventure:desert03
 --      ["Use the rope in order to catch the blue hedgehog"] = "", -- A_Space_Adventure:moon02
@@ -2583,7 +2555,6 @@
 --      ["Victory Condition: Collect"] = "", -- HedgeEditor
 --      ["Victory Condition: Destroy"] = "", -- HedgeEditor
 --      ["Victory for %s!"] = "", -- Capture_the_Flag
-	["Victory for the "] = "Vinst för", -- CTF_Blizzard, Capture_the_Flag
 --      ["Violence is not the answer to your problems!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos
 --      ["Vladimir"] = "", -- 
@@ -2602,9 +2573,6 @@
 --      ["Walls left: %d"] = "", -- WxW
 --      ["Wall to wall"] = "", -- WxW
 --      ["Waluigi"] = "", -- 
---      ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Wannabe Ropers"] = "", -- Basic_Training_-_Rope
---      ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Wario"] = "", -- 
 --      ["Warming Up"] = "", -- Basic_Training_-_Grenade
 --      ["Warning: Fire cake detected"] = "", -- ClimbHome
@@ -2633,7 +2601,6 @@
 --      ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion
 --      ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion
 --      ["Weapon specials: Some weapons have special modes (see weapon description)."] = "", -- Continental_supplies
---      ["Weapons Reset"] = "",
 --      ["Weapons reset: The weapons are reset after each turn."] = "", -- WxW
 --      ["We are indeed."] = "", -- A_Classic_Fairytale:backstab
 --      ["We can't defeat them!"] = "", -- A_Classic_Fairytale:shadow
@@ -2650,9 +2617,9 @@
 --      ["We have to hurry! Are you armed?"] = "", -- A_Space_Adventure:moon01
 --      ["We have to protect the village!"] = "", -- A_Classic_Fairytale:united
 --      ["We have to unite and defeat those cylergs!"] = "", -- A_Classic_Fairytale:enemy
---      ["Welcome Hog Solo, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome home! Please take a seat"] = "", -- ClimbHome
 --      ["Welcome, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey
+--      ["Welcome, %s, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome to the Death Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
@@ -2819,16 +2786,16 @@
 --      ["You can’t open a portal on the blue surface."] = "", -- portal
 --      ["You can use the other 2 hogs to assist you."] = "", -- A_Space_Adventure:fruit02
 --      ["You can use the rope to reach new places."] = "", -- Basic_Training_-_Rope
---      ["You choose well, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You choose well, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You completed the mission in %.3f seconds."] = "", -- A_Space_Adventure:ice02
 --      ["You completed the mission in %d rounds."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03
---      ["You couldn't have come to a worse time, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You couldn't have come to a worse time, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You couldn't possibly believe that after refusing my offer I'd just let you go!"] = "", -- A_Classic_Fairytale:journey
 --      ["You'd almost swear the water was rising!"] = "",
 --      ["You'd better watch your steps..."] = "", -- A_Classic_Fairytale:journey
 --      ["You defended yourself against Captain Lime."] = "", -- A_Space_Adventure:fruit02
---      ["You defended yourself against the Fruit Assassins."] = "", -- A_Space_Adventure:fruit02
---      ["You did great, Hog Solo! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
+--      ["You defended yourself against %s."] = "", -- A_Space_Adventure:fruit02
+--      ["You did great, %s! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
 --      ["You did not make it in time, try again!"] = "", -- Basic_Training_-_Rope
 --      ["You don't deserve my sacrifice!"] = "", -- A_Classic_Fairytale:queen
 --      ["You drove Professor Hogevil away."] = "", -- A_Space_Adventure:moon01
@@ -2844,12 +2811,12 @@
 --      ["You got me!"] = "", -- A_Space_Adventure:moon02
 --      ["You had %.1fs remaining on the clock (+%d points)."] = "", -- TargetPractice
 --      ["You had %.2fs remaining on the clock (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle
---      ["You had %d additional flying saucers left."] = "", -- A_Space_Adventure:ice02
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: you might want to use some mines..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: You might want to use some mines ..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01
 --      ["You have activated Switch Hedgehog!"] = "", -- Basic_Training_-_Movement
 --      ["You have beaten the challenge!"] = "", -- ClimbHome
+--      ["You have beaten the team record, congratulations!"] = "", -- Utils
 --      ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab
 --      ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united
 --      ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01
@@ -2868,7 +2835,6 @@
 --      ["You have eliminated all visible enemy hedgehogs!"] = "", -- A_Space_Adventure:fruit01
 --      ["You have eliminated Professor Hogevil."] = "", -- A_Space_Adventure:moon01
 --      ["You have eliminated the evil minions."] = "", -- A_Space_Adventure:moon01
---      ["You have eliminated the whole evil team. You're pretty tough!"] = "", -- A_Space_Adventure:moon01
 --      ["You have escaped successfully."] = "", -- A_Space_Adventure:desert02
 --      ["You have failed to complete your task, young one!"] = "", -- A_Classic_Fairytale:journey
 --      ["You have failed to save the tribe!"] = "", -- A_Classic_Fairytale:backstab
@@ -2922,6 +2888,7 @@
 --      ["You have to travel again"] = "", -- A_Space_Adventure:cosmos
 --      ["You have to try again!"] = "", -- A_Space_Adventure:cosmos
 --      ["You have triggered the secret Do-Not-Rope-to-the-Moon Defense System."] = "", -- A_Space_Adventure:cosmos
+--      ["You have unlocked the target radar!"] = "", -- TargetPractice
 --      ["You have used %d flying saucers."] = "", -- A_Space_Adventure:ice02
 --      ["You have used %d RC planes."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["You have used only 1 RC plane. Outstanding!"] = "", -- User_Mission_-_RCPlane_Challenge
@@ -2940,10 +2907,9 @@
 --      ["You'll have only 2 watermelon bombs during the game."] = "", -- A_Space_Adventure:fruit03
 --      ["You'll have only one RC plane at the start of the mission."] = "", -- A_Space_Adventure:desert03
 --      ["You'll have to eliminate Captain Lime at the end."] = "", -- A_Space_Adventure:fruit02
---      ["You'll have to eliminate the Fruit Assassins at the end."] = "", -- A_Space_Adventure:fruit02
+--      ["You'll have to eliminate %s at the end."] = "", -- A_Space_Adventure:fruit02
 --      ["You'll lose if you die or if your time is up."] = "", -- A_Space_Adventure:moon02
 --      ["You'll see what I mean!"] = "", -- A_Classic_Fairytale:enemy
---      ["You lose!"] = "", -- Basic_Training_-_Sniper_Rifle, Big_Armory, Basic_Training_-_Bazooka, TargetPractice, ClimbHome
 --      ["You lost your target, try again!"] = "", -- TargetPractice
 --      ["You may find it handy."] = "", -- A_Space_Adventure:cosmos
 --      ["You may only attack from a rope!"] = "", -- WxW
@@ -2965,8 +2931,7 @@
 --      ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice
 --      ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice
 --      ["Your ammo is limited this time."] = "", -- Basic_Training_-_Bazooka
---      ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy
---      ["Your deaths will be avenged, Natives!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Your deaths will be avenged, %s!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Your death will not be in vain, Dense Cloud!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You're a coward!"] = "", -- A_Classic_Fairytale:queen
 --      ["You're...alive!? But we saw you die!"] = "", -- A_Classic_Fairytale:backstab
@@ -2994,21 +2959,21 @@
 --      ["Your next task is to collect some crates by using the rope!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Your personal best time so far: %.3f seconds"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["Your rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["You saved %d of 8 Hapless Hogs."] = "", -- User_Mission_-_That_Sinking_Feeling
+--      ["Your rope is gone! Try again!"] = "", -- Basic_Training_-_Rope
+--      ["You saved %d of 8 hegehogs."] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen
 --      ["You see the wind strength at the bottom right corner."] = "", -- Basic_Training_-_Bazooka
+--      ["You see the wind strength at the top."] = "", -- Basic_Training_-_Bazooka
 --      ["You should have known that we don't rely on meatbags!"] = "", -- A_Classic_Fairytale:queen
 --      ["You should know this more than anyone, Leaks!"] = "", -- A_Classic_Fairytale:queen
 --      ["You speak great truth, Hannibal. Here, take a sip!"] = "", -- A_Classic_Fairytale:epil
 --      ["You've been assaulting us, we have been just defending ourselves!"] = "", -- A_Classic_Fairytale:enemy
-	["You've failed. Try again."] = "Du har misslyckats. Försök igen.",
 	["You've reached the goal!| |Time: "] = "Du har nått målet!| |Tid: ",
 --      ["You will be avenged!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You will fail if you run out of ammo and there are still targets available."] = "", -- A_Space_Adventure:desert03
 --      ["You will gain some extra ammo from the crates the next time you play the \"Getting to the device\" mission."] = "", -- A_Space_Adventure:fruit03
 --      ["You will play every 3 turns."] = "", -- A_Space_Adventure:fruit01
 --      ["- You will recieve 2-4 weapons on each kill! (Even on own hogs)"] = "", -- Continental_supplies
---      ["You win!"] = "", -- Big_Armory
 --      ["You won't believe what happened to me!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Yuck! I bet they'll keep worshipping her even after I save the village!"] = "", -- A_Classic_Fairytale:family
 --      ["Yumme Gunpowder"] = "", -- 
@@ -3016,6 +2981,7 @@
 --      ["Zombie"] = "", -- 
 --      ["Zombi"] = "", -- portal
 	["'Zooka Team"] = "Bazookalaget",
---      ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
+--      ["Zoom: [Pinch] with 2 fingers"] = "", -- Basic_Training_-_Movement
+--      ["Zoom: [Rotate mouse wheel]"] = "", -- Basic_Training_-_Movement
 --      ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen
 }
--- a/share/hedgewars/Data/Locale/tips_de.xml	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/tips_de.xml	Fri Aug 16 10:59:50 2019 -0600
@@ -16,7 +16,7 @@
     <tip>Hedgewars ist freie Open-Source-Software, die wir in unserer Freizeit nur so zum Spaß erstellen. Triff die Entwickler auf <a href="irc://irc.freenode.net/hedgewars">#hedgewars</a>!</tip>
     <tip>Von Zeit zu Zeit wird es offizielle Turniere geben. Bevorstehende Ereignisse werden auf <a href="https://www.hedgewars.org/">https://www.hedgewars.org/</a> ein paar Tage im Voraus angekündigt.</tip>
     <tip>Hedgewars ist in vielen Sprachen verfügbar. Wenn die Übersetzung deiner Sprache zu fehlen oder veraltet zu sein scheint, nimm ruhig mit uns Kontakt auf!</tip>
-    <tip>Hedgewars läuft auf vielen verschiedenen Betriebssystemen, unter anderem Microsoft Windows, Mac OS X und GNU/Linux.</tip>
+    <tip>Hedgewars läuft auf vielen verschiedenen Betriebssystemen, unter anderem Microsoft Windows, macOS und GNU/Linux.</tip>
     <tip>Denk immer daran, dass du in der Lage bist, deine eigenen Spiele in lokalen Spielen und Netzwerkspielen aufzusetzen. Du musst nicht zwangsläufig nur einfache Spiele spielen.</tip>
     <tip>Verbinde einen oder mehr Gamepads, bevor du das Spiel startest, damit du ihre Belegung deinen Teams zuweisen kannst.</tip>
     <tip>Erstelle ein Benutzerkonto auf <a href="https://www.hedgewars.org/">https://www.hedgewars.org/</a>, um andere davon abzuhalten, deinen Lieblingsspitznamen beim Spielen auf dem offiziellen Server zu benutzen.</tip>
@@ -42,8 +42,7 @@
     <tip>Des Kuchens maximale Laufentfernung hängt von dem Boden, den er überqueren muss, ab. Benutze [Angriff], um ihn vorzeitig zu detonieren.</tip>
     <tip>Der Flammenwerfer ist eine Waffe, aber sie kann auch zum Tunnelgraben verwendet werden.</tip>
     <tip>Benutze den Molotowcocktail oder Flammenwerfer, um kurzzeitig Igel daran zu hindern, Gelände wie Tunnel oder Bauträger zu überqueren.</tip>
-    <tip>Willst du wissen, wer hinter dem Spiel steckt? Klick auf das Hedgewars-Logo im Hauptmenü, um die Liste der Mitwirkenden (derzeit nur auf Englisch, Anm. eines Übersetzers) zu sehen.</tip>
-    <tip>Magst du Hedgewars? Werd zum Fan auf <a href="https://www.facebook.com/Hedgewars">Facebook</a> oder folg uns auf <a href="https://twitter.com/hedgewars">Twitter</a>!</tip>
+    <tip>Magst du Hedgewars? Werd zum Fan auf <a href="https://www.facebook.com/Hedgewars">Facebook</a> oder folg uns auf <a href="https://twitter.com/hedgewars">Twitter</a>.</tip>
     <tip>Tu dir keinen Zwang an, dir deine eigenen Grabsteine, Hüte, Flaggen oder sogar Karten und Szenerien zu malen! Aber beachte, dass du sie irgendwo online teilen musst, um sie online benutzen zu können.</tip>
     <tip>Halte deine Grafikkartentreiber auf dem neuesten Stand, um Probleme beim Spielen des Spiels zu vermeiden.</tip>
     <tip>Kopf oder Zahl? Gib »/rnd« in der Lobby ein und finde es heraus. »/rnd Schere Stein Papier« funktioniert auch!</tip>
--- a/share/hedgewars/Data/Locale/tips_en.xml	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/tips_en.xml	Fri Aug 16 10:59:50 2019 -0600
@@ -8,20 +8,20 @@
     <tip>If you’re unsure what to do and don’t want to waste ammo, skip one round. But don’t let too much time pass as there will be Sudden Death!</tip>
     <tip>Want to save ropes? Release the rope in mid air and then shoot again. As long as you don’t touch the ground or miss a shot you’ll reuse your rope without wasting ammo!</tip>
     <tip>If you’d like to keep others from using your preferred nickname on the official server, register an account at <a href="https://www.hedgewars.org/">https://www.hedgewars.org/</a>.</tip>
-    <tip>You're bored of default gameplay? Try one of the missions — they'll offer different gameplay depending on the one you picked.</tip>
+    <tip>You're bored of default gameplay? Try one of the missions—they'll offer different gameplay depending on the one you picked.</tip>
     <tip>By default the game will always record the last game played as a demo. Select “Local Game” and pick the “Demos” button on the lower right corner to play or manage them.</tip>
     <tip>Hedgewars is free software (Open Source) we create in our spare time. If you’ve got problems, ask on our forums or visit our IRC room!</tip>
     <tip>Hedgewars is free software (Open Source) we create in our spare time. If you like it, feel free to help us with a small donation or contribute your own work!</tip>
     <tip>Hedgewars is free software (Open Source) we create in our spare time. Share it with your family and friends as you like!</tip>
-    <tip>Hedgewars is free software (Open Source) we create in our spare time, just for fun! Meet the devs in <a href="irc://irc.freenode.net/hedgewars">#hedgewars</a>!</tip>
+    <tip>Hedgewars is free software (Open Source) we create in our spare time, just for fun! Meet the developers in <a href="irc://irc.freenode.net/hedgewars">#hedgewars</a>!</tip>
     <tip>From time to time there will be official tournaments. Upcoming events will be announced at <a href="https://www.hedgewars.org/">https://www.hedgewars.org/</a> some days in advance.</tip>
     <tip>Hedgewars is available in many languages. If the translation in your language seems to be missing or outdated, feel free to contact us!</tip>
-    <tip>Hedgewars can be run on lots of different operating systems including Microsoft Windows, Mac OS X and GNU/Linux.</tip>
+    <tip>Hedgewars can be run on lots of different operating systems including Microsoft Windows, macOS and GNU/Linux.</tip>
     <tip>Always remember you’re able to set up your own games in local and network/online play. You’re not restricted to the “Simple Game” option.</tip>
     <tip>Connect one or more gamepads before starting the game to be able to assign their controls to your teams.</tip>
     <tip>Consider giving yourself a short break at least once an hour to guard against strain from playing.</tip>
-    <tip>If your graphics card isn’t able to provide hardware accelerated OpenGL, try to enable the low quality mode to improve performance.</tip>
-    <tip>If your graphics card isn’t able to provide hardware accelerated OpenGL, try to update the associated drivers.</tip>
+    <tip>If your graphics card isn’t able to provide hardware-accelerated OpenGL, try to enable the low quality mode to improve performance.</tip>
+    <tip>If your graphics card isn’t able to provide hardware-accelerated OpenGL, try to update the associated drivers.</tip>
     <tip>We’re open to suggestions and constructive feedback. If you don’t like something or got a great idea, let us know!</tip>
     <tip>For your own benefit we'd like you to be polite and friendly while playing on our server. Also please keep in mind that some players are minors!</tip>
     <tip>Special game modes such as “Vampirism” or “Karma” allow you to develop completely new tactics. Try them in a custom game!</tip>
@@ -39,14 +39,13 @@
     <tip>The Hammer is most effective when used on bridges or girders. Hit hogs will just break through the ground.</tip>
     <tip>If you’re stuck behind an enemy hedgehog, use the Hammer to free yourself without getting damaged by an explosion.</tip>
     <tip>The Cake’s maximum walking distance depends on the ground it has to pass. Use [attack] to detonate it early.</tip>
-    <tip>The Flame Thrower is a weapon but it can be used for tunnel digging as well.</tip>
-    <tip>Use the Molotov or Flame Thrower to temporary keep hedgehogs from passing terrain such as tunnels or platforms.</tip>
-    <tip>Want to know who’s behind the game? Click on the Hedgewars logo in the main menu to see the credits.</tip>
-    <tip>Like Hedgewars? Become a fan on <a href="https://www.facebook.com/Hedgewars">Facebook</a> or follow us on <a href="https://twitter.com/hedgewars">Twitter</a></tip>
+    <tip>The Flamethrower is a weapon but it can be used for tunnel digging as well.</tip>
+    <tip>Use the Molotov Cocktail or Flamethrower to temporary keep hedgehogs from passing terrain such as tunnels or platforms.</tip>
+    <tip>Like Hedgewars? Become a fan on <a href="https://www.facebook.com/Hedgewars">Facebook</a> or follow us on <a href="https://twitter.com/hedgewars">Twitter</a>.</tip>
     <tip>Feel free to draw your own graves, hats, flags or even maps and themes! But note that you’ll have to share them somewhere to use them online.</tip>
     <tip>Keep your video card drivers up to date to avoid issues playing the game.</tip>
     <tip>Heads or tails? Type “/rnd” in the lobby and you’ll find out. Also “/rnd rock paper scissors” works!</tip>
-    <tip>You’re able to associate Hedgewars related files (savegames and demo recordings) with the game to launch them right from your favorite file or web browser.</tip>
+    <tip>You’re able to associate Hedgewars-related files (savegames and demo recordings) with the game to launch them right from your favorite file or web browser.</tip>
     <tip>Dud mines are not harmless: Although their timer is broken, they can still explode if they took too much abuse!</tip>
     <tip>Love is hot! Use Seduction to thaw frozen hedgehogs.</tip>
     <tip>Smoke coming from a barrel is an indicator that it is low on “health” and even small amounts of damage might cause it to burst.</tip>
@@ -60,7 +59,7 @@
     <tip>The whip also hits hedgehogs and objects behind a thin wall.</tip>
     <tip>A cleaver deals more damage the faster it’s moving.</tip>
     <tip>You can drop cakes from cliffs, but you have to stand very close to the edge, so be careful.</tip>
-    <tip>Use your rope to push away other hedgehogs i.e. by sliding on the ground. This technique is known as “rope-knocking”.</tip>
+    <tip>Use your rope to push away other hedgehogs, e.g. by sliding on the ground. This technique is known as “rope-knocking”.</tip>
     <tip>Don’t stand still on an icy slope, or you will slip away. Alternatively, you can hold down [precise].</tip>
     <tip>In the lands of Snow and Christmas, the snow piles up over time, unless the land is indestructible.</tip>
     <tip>Be aware in lands of Snow and Christmas, because girders are made of slippery ice.</tip>
--- a/share/hedgewars/Data/Locale/tips_gd.xml	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/tips_gd.xml	Fri Aug 16 10:59:50 2019 -0600
@@ -4,7 +4,7 @@
      Do not escape characters or use the CDATA tag. -->
 <tips>
     <tip>Airson cluiche ann an cinneadh, cha leig thu leas ach an aon dath a thaghadh ’s a thagh caraid. Stiùirichidh sibh na gràineagan agaibh fhèin fa leth fhathast ach caillidh no buannaichidh sibh còmhla.</tip>
-    <tip>Tha airm ann nach dèan ach beagan a dhochann ach dh’fhaoidte gum bi iad glè èifeachdach a-rèir an t-suidheachaidh. Feuch gun cleachd thu Iolaire an fhàsaich gus iomadh gràineag a chur dhan mhuir.</tip>
+    <tip>Tha airm ann nach dèan ach beagan a dhochann ach dh’fhaoidte gum bi iad glè èifeachdach a-rèir an t-suidheachaidh. Feuch gun cleachd thu Iolaire an fhàsaich gus iomadh gràineag a phutadh dhan mhuir.</tip>
     <tip>Mur eil thu cinnteach na nì thu agus mur eil thu airson connadh a chaitheamh gun fheum, leig seachad do chuairt. Ach na fuirich ro fhada on a thigeadh bàs obann ort!</tip>
     <tip>A bheil thu airson ròpannan a shàbhaladh? Leig às an ròpa fad ’s a bhios tu san adhair is loisg e a-rithist. Cho fad ’s nach bean thu ri tìr is a chuimsicheas tu gu soirbheachail, cleachdaidh tu an ròpa agad a-rithist gun a bhith a’ caitheamh connaidh!</tip>
     <tip>Mur eil thu ag iarraidh gun cleachd daoine eile am far-ainm as fhearr leat air an fhrithealaiche oifigeil, clàraich cunntas air <a href="https://www.hedgewars.org/">https://www.hedgewars.org/</a>.</tip>
@@ -16,7 +16,7 @@
     <tip>’S e bathar-bog saor (Open Source) a th’ ann an Hedgewars a tha sinn a’ cruthachadh gu saor-thoileach a cum tlachd! Coinnich ris an luchd-leasachaidh ann an <a href="irc://irc.freenode.net/hedgewars">#hedgewars</a>!</tip>
     <tip>Bi fèill-chluiche oifigeil againn o àm gu àm. Sgaoilidh sinn brathan-naidheachd mu na tachartasan air <a href="https://www.hedgewars.org/">https://www.hedgewars.org/</a> beagan làithean ro làimh.</tip>
     <tip>Tha Hedgewars ri fhaighinn ann an iomadh cànan. Ma tha an cànan agad a dhìth no an t-eadar-theangachadh ro shean, nach cuir thu fios thugainn?</tip>
-    <tip>Gabhaidh Hedgewars a ruith air iomadh siostam-obrachaidh, a’ gabhail a-steach Microsoft Windows, Mac OS X agus GNU/Linux.</tip>
+    <tip>Gabhaidh Hedgewars a ruith air iomadh siostam-obrachaidh, a’ gabhail a-steach Microsoft Windows, MacOS agus GNU/Linux.</tip>
     <tip>Cuimhnich gur urrainn dhut na geamannan agad fhèin a suidheachadh air an lìonra ionadail no air loidhne. Tha barrachd roghainnean na geama simplidh agad.</tip>
     <tip>Ma tha iomadh pada-geama agad, ceangail iad ris mus tòisich thu an geama agus sònraich an stiùireadh dha na sgiobannan agad.</tip>
     <tip>Bu chòir dhut beagan fois a ghabhail on chluich gach uair a thìde air eagal ’s gun cuir e an sgithear ort.</tip>
@@ -41,8 +41,7 @@
     <tip>Tha astar coiseachd na cèice an eisimeil air an làr a thèid i tarsaing. Cleachd [attack] gus a spreadhadh tràth.</tip>
     <tip>’S e arm a tha sa ghunna loisgidh ach gabhaidh a chleachdadh gus tunailean a chruthachadh cuideachd.</tip>
     <tip>Cleachd am Molotov Cocktail no an gunna loisgidh gus gràineagan a cumail air falbh o thìr mar thunailean no ùrlaran rè seall.</tip>
-    <tip>A bheil thu airson faighinn a-mach cò rinn an geama seo? Briog air suaicheantas Hedgewars air a’ phrìomh chlàr-taice gus an t-urram a shealltainn.</tip>
-    <tip>An toigh leat Hedgewars? Lean oirnn air <a href="https://www.facebook.com/Hedgewars">Facebook</a> no air <a href="https://twitter.com/hedgewars">Twitter</a></tip>
+    <tip>An toigh leat Hedgewars? Lean oirnn air <a href="https://www.facebook.com/Hedgewars">Facebook</a> no air <a href="https://twitter.com/hedgewars">Twitter</a>.</tip>
     <tip>Dèan na dealbhan agad fhèin dha na cladhan, adan, brataich no fiù ’s mapaichean is ùrlaran mar a thogras tu! Ach thoir an aire gum feum thu an co-roinneadh am badeigin mus cleachd thu air loidhne iad.</tip>
     <tip>Cum na draibhearan video agad cho ùr ’s a ghabhas ach nach èirich duilgheadas dhut le cluich a’ gheama.</tip>
     <tip>Ceann no bonn? Sgrìobh “/rnd” san lobaidh is gheibh thu a-mach. Obraichidh “/rnd rock paper scissors” cuideachd!</tip>
@@ -60,12 +59,12 @@
     <tip>Buailidh a’ chuip air gràineagan is nithean taobh thall balla thana cuideachd.</tip>
     <tip>Mar as luaithe a ghluaiseas corc ’s ann nas motha a dhochann a nì i.</tip>
     <tip>’S urrainn dhut cèic a leigeil tuiteam o chreag ach feumaidh tu seasamh glè dhlùth air an oir, mar sin thoir an aire.</tip>
-    <tip>Cleachd an ròpa agad gus gràineagan eile a bhruthadh air falbh, can le sleamhnachadh air an làr. Canar “gnogag ròpa” ris a’ chleas seo.</tip>
+    <tip>Cleachd an ròpa agad gus gràineagan eile a bhruthadh air falbh, can le sleamhnachadh air an làr. Canar “putadh ròpa” ris a’ chleas seo.</tip>
     <tip>Na fuirich ’nad sheasamh air sliabh deighe ach nach tuit thu. ’S urrainn dhut [precise] a cumail sìos mar roghainn eile.</tip>
-    <tip>Air tìr an t-sneachd ’s na Nollaige, bidh cur ’s cathadh ann ach mura gabh an tìr milleadh.</tip>
+    <tip>Air tìr an t-sneachd ’s na Nollaige, bidh cur ’s cathadh ann ach mura gabh an talamh milleadh.</tip>
     <tip>Thoir an aire air tìr an t-sneachd ’s na Nollaige on a bhios na teannadairean ’nan deigh shleamhainn.</tip>
     <tip>Tha ùine a’ chùlachaidh an eisimeil air an arm a chaidh a chleachdadh. Thoir an aire o nach eil ùine cùlachaidh air cuid a dh’airm idir ’s gun cuir iad crìoch air a’ chuairt agad sa bhad!</tip>
-    <tip>Le beagan sgil, ’s urrainn dhut gràineagan a bhrùthadh nuair a leumas tu às am bonn.</tip>
+    <tip>Le beagan sgil, ’s urrainn dhut gràineagan a phutadh nuair a leumas tu às am bonn.</tip>
     <tip>’S urrainn dha ionnsaigh le shoryuken, piocaid ’s òrd no gunna sìneis aig an àm ceart an dochann tuiteim a chur gu neoni.</tip>
     <tip>Cha bhuail go ghràineag ri astasan nuair a bhios i san adhar.</tip>
     <tip>Tha na tuill a nì rocaidean tochlaidh, isnich fàtha agus iolaire an fhàsaich mòr gu leòr ach an tilg thu tele-phortadh tromhpa – ma tha d’ amas ceart.</tip>
--- a/share/hedgewars/Data/Locale/tips_it.xml	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/tips_it.xml	Fri Aug 16 10:59:50 2019 -0600
@@ -41,7 +41,6 @@
     <tip>La distanza massima di cammino della Torta dipende dal terreno che deve attraversare. Usa [attacca] per farla esplodere prima.</tip>
     <tip>Il Lanciafiamme è un'arma che può essere usata anche per scavare gallerie.</tip>
     <tip>Usa la Bomba Molotov o il Lanciafiamme per impedire temporaneamente ai ricci di attraversare terreni pianeggianti, tunnel o collinette.</tip>
-    <tip>Vuoi sapere chi c'è dietro il gioco? Clicca sul logo Hedgewars nel menu principale per vederne gli autori e sviluppatori.</tip>
     <tip>Ti piace Hedgewars? Diventa fan su <a href="https://www.facebook.com/Hedgewars">Facebook</a> oppure seguici su <a href="https://twitter.com/hedgewars">Twitter</a></tip>
     <tip>Sentiti libero di disegnare tombe, cappelli, bandiere o anche mappe e temi personalizzati! Ma nota che dovrai condividerli in qualche modo per usarli online.</tip>
     <tip>Mantieni aggiornati i driver della tua scheda video, per evitare problemi durante il gioco.</tip>
--- a/share/hedgewars/Data/Locale/tips_pl.xml	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/tips_pl.xml	Fri Aug 16 10:59:50 2019 -0600
@@ -39,7 +39,6 @@
     <tip>Jeśli utknąłeś za jeżem przeciwnika, użyj młotka by wbić go w ziemię. Unikniesz wtedy eksplozji, która z pewnością zabrałaby Tobie punkty życia.</tip>
     <tip>Dystans, który ciasto może przebyć, zależy od terenu, który ma do przebycia. Użyj [ataku] by zdetonować je wcześniej.</tip>
     <tip>Miotacz ognia jest śmiercionośną bronią ale może być użyty również jako narzędzie do kopania tuneli.</tip>
-    <tip>Chcesz wiedzieć kto tworzy tę grę? Kliknij logo w głównym menu, by zobaczyć autorów.</tip>
     <tip>Lubisz Hedgewars? Zostań fanem na <a href="http://www.facebook.com/Hedgewars">Facebooku</a> lub obserwuj nas na <a href="http://twitter.com/hedgewars">Twitterze</a>!</tip>
     <tip>Możesz rysować własne nagrobki, czapki, flagi lub nawet mapy albo motywy! Miej na uwadze by udostępnić je każdemu, kto będzie grał z Tobą przez sieć.</tip>
     <tip>Chcesz nosić wymarzoną czapkę? Wspomóż nas pieniężnie, a my zrobimy specjalną czapkę tylko dla Ciebie!</tip>
--- a/share/hedgewars/Data/Locale/tr.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/tr.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -26,7 +26,6 @@
 --      ["Above-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Accuracy Bonus! +15 points"] = "", -- Space_Invasion
 --      ["Accuracy bonus: +%d points"] = "", -- Basic_Training_-_Sniper_Rifle
---      ["Ace"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge
 --      ["Achievement gotten: %s"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_That_Sinking_Feeling, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, Basic_Training_-_Rope, Tumbler
 --      ["A Classic Fairytale"] = "", -- A_Classic_Fairytale:first_blood
 --      ["A crate critical to this mission has been destroyed."] = "", -- SimpleMission
@@ -45,7 +44,6 @@
 --      ["After you left the moon, my other loyal minions came and resurrected me so I could complete my master plan."] = "", -- A_Space_Adventure:death01
 --      ["Again with the 'cannibals' thing!"] = "", -- A_Classic_Fairytale:enemy
 --      ["A Hedgewars minigame"] = "", -- Capture_the_Flag
-	["a Hedgewars mini-game"] = "Hedgewars mini oyunu", -- Space_Invasion, The_Specialists
 --      ["A Hedgewars mini-game"] = "", -- Racer, Space_Invasion, TechRacer, Tumbler
 --      ["A Hedgewars tag game"] = "", -- Mutant
 --      ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome
@@ -141,13 +139,14 @@
 --      ["As you've seen, the dropped grenade roughly fell into your flying direction."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Athlete"] = "", -- Battalion
 --      ["Attack: Activate"] = "", -- Racer
---      ["Attack Captain Lime before he attacks back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack Captain Lime before he attacks back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack From Rope: %s"] = "", -- WxW
 --      ["Attack From Rope: You may only attack from a rope."] = "", -- WxW
 --      ["Attack rule: %s"] = "", -- WxW
 --      ["Attack: Select this continent"] = "", -- Continental_supplies
 --      ["Attack: [Space]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
---      ["Attack the assassins before they attack back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack: Tap the [Bomb]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
+--      ["Attack the assassins before they attack back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack: Throw ball"] = "", -- Knockball
 --      ["At the end of the game your health was %d."] = "", -- A_Space_Adventure:ice01
 --      ["At the start of the game each enemy hog has only the weapon that he is named after."] = "", -- A_Space_Adventure:death02
@@ -155,16 +154,18 @@
 --      ["Available weapon specials:"] = "", -- Continental_supplies
 --      ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion
---      ["Avoid the mines!"] = "", -- Basic_Training_-_Rope
 --      ["Axes"] = "", -- Bazooka_Battlefield
 --      ["Aye! Fellow! Let me exit this chamber of doom!"] = "", -- A_Classic_Fairytale:epil
 --      ["Back Breaker"] = "", -- A_Classic_Fairytale:backstab
 --      ["Back in the village, after telling the villagers about the threat..."] = "", -- A_Classic_Fairytale:united
 --      ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil
 --      ["Back Jump: [Backspace] ×2"] = "", -- Basic_Training_-_Movement
+--      ["Back Jump: Double-tap the [Curvy Arrow]"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (1/2)"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (2/2)"] = "", -- Basic_Training_-_Movement
 --      ["Backstab"] = "", -- A_Classic_Fairytale:backstab
+--      ["Backwards jump: Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Backwards jump: Tap the [Curvy Arrow] twice"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Bacon"] = "", -- 
 --      ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Badmad"] = "", -- portal
@@ -197,7 +198,6 @@
 --      ["Bazooka Battlefield"] = "", -- Bazooka_Battlefield
 --      ["Bazooka Master"] = "", -- Basic_Training_-_Bazooka
 --      ["Bazookas are influenced by wind."] = "", -- Basic_Training_-_Bazooka
---      ["Bazooka Team"] = "", -- Basic_Training_-_Bazooka
 	["Bazooka Training"] = "Roketatar Eğitimi",
 --      ["Bearded Beast"] = "", -- 
 --      ["Be careful, the future of Hogera is in your hands!"] = "", -- A_Space_Adventure:cosmos
@@ -231,7 +231,6 @@
 --      ["Bloodpie"] = "", -- A_Classic_Fairytale:backstab
 --      ["Bloodrocutor"] = "", -- A_Classic_Fairytale:shadow
 --      ["Bloodsucker"] = "", -- A_Classic_Fairytale:shadow
-	["Bloody Rookies"] = "Kanlı Acemiler", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 --      ["Blue"] = "", -- 
 --      ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Bob"] = "", -- A_Space_Adventure:cosmos
@@ -314,7 +313,9 @@
 --      ["Challenge objectives"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit03, A_Space_Adventure:moon02
 --      ["Challenge over!"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa, ClimbHome
+--      ["Change bounciness: Tap [B]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Content: [Left], [Right]"] = "", -- HedgeEditor
+--      ["Change detonation timer: Tap the [Clock]"] = "", -- Basic_Training_-_Grenade, A_Classic_Fairytale:shadow
 --      ["Change direction: [Left]/[Right]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Change Health: [Left], [Right]"] = "", -- HedgeEditor
@@ -334,6 +335,8 @@
 --      ["Chicken"] = "", -- 
 --      ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01
 --      ["Chikorita"] = "", -- 
+--      ["Choose location: Left click"] = "", -- A_Classic_Fairytale:shadow
+--      ["Choose location: Tap the [Target] button, then tap on the spot you want to choose"] = "", -- A_Classic_Fairytale:shadow
 --      ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Choose your continent wisely, as your decision will be permanent."] = "", -- Continental_supplies
 --      ["Choose your side! If you want to join the strange man, walk up to him.|Otherwise, walk away from him. If you decide to att...nevermind..."] = "", -- A_Classic_Fairytale:shadow
@@ -342,7 +345,6 @@
 --      ["Cleaver"] = "", -- Construction_Mode
 --      ["Cleaver Placement Mode"] = "", -- Construction_Mode
 --      ["CLEAVER PLACEMENT MODE"] = "", -- HedgeEditor
---      ["Climber"] = "", -- ClimbHome
 --      ["Climb Home"] = "", -- ClimbHome
 --      ["Closing in"] = "", -- A_Classic_Fairytale:queen
 --      ["Clown"] = "", -- HedgeEditor
@@ -352,11 +354,13 @@
 --      ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb
 --      ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey
 --      ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey
+--      ["- Collect all the blue crates"] = "", -- HedgeEditor
 --      ["Collect all the crates, but remember, our time in this life is limited!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect or destroy all the health crates."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Collect or destroy the final crate to finish the training."] = "", -- Basic_Training_-_Flying_Saucer
+--      ["- Collect the blue crate"] = "", -- HedgeEditor
 --      ["Collect the crate and attack!"] = "", -- WxW
---      ["Collect the crate on the right.|Hint: Select the rope, [Up] or [Down] to aim, [Space] to fire, directional keys to move.|Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Collect the crate on the right."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the crates within the time limit!|If you fail, you'll have to try again."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the first crate to begin!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Collect the freezer and get the device part from Thanta."] = "", -- A_Space_Adventure:ice01
@@ -424,7 +428,6 @@
 --      ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates per turn: %d"] = "", -- WxW
---      ["crate(s)"] = "", -- SpeedShoppa
 --      ["Crazy Gravity: Gravity randomly changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity
 --      ["Crazy Runner"] = "", -- A_Space_Adventure:moon02
 --      ["Cricket Time"] = "", -- Continental_supplies
@@ -457,11 +460,10 @@
 --      ["Deals 15 damage to all enemies in the circle."] = "", -- Continental_supplies
 --      ["Deer"] = "", -- 
 --      ["Defeat all enemies!"] = "", -- portal
+--      ["Defeat!"] = "", -- HedgeEditor
 --      ["Defeat Professor Hogevil!"] = "", -- A_Space_Adventure:death01
---      ["Defeat the cannibals"] = "", -- A_Classic_Fairytale:backstab
---      ["Defeat the cannibals!|"] = "", -- A_Classic_Fairytale:united
+--      ["Defeat the cannibals!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cannibals!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Defeat the cannibals!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cyborgs!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen
 --      ["Delete Waypoint"] = "", -- HedgeEditor
@@ -482,11 +484,11 @@
 --      ["Destroyer of planes"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Destroy him, Leaks A Lot! He is responsible for the deaths of many of us!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion
+--      ["- Destroy the enemy"] = "", -- HedgeEditor
+--      ["- Destroy the red target"] = "", -- HedgeEditor
+--      ["- Destroy the red targets"] = "", -- HedgeEditor
 --      ["Destroy the targets!"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
---      ["Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
---      ["Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"] = "", -- A_Classic_Fairytale:first_blood
 --      ["+%d flamer fuel!"] = "", -- Tumbler
---      ["%d Hapless Hogs left"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["+%d health"] = "", -- Mutant
 --      ["%d-Hit Combo! +%d points!"] = "", -- Space_Invasion
 --      ["Did anyone follow you?"] = "", -- A_Classic_Fairytale:united
@@ -507,7 +509,6 @@
 --      ["Disguise as a Rockhopper Penguin"] = "", -- Continental_supplies
 --      ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies
 --      ["Displacer"] = "", -- 
---      ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Diver"] = "", -- User_Mission_-_Diver
 --      ["%d ms"] = "", -- HedgeEditor
 --      ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen
@@ -594,10 +595,8 @@
 --      ["Elderbot"] = "", -- A_Classic_Fairytale:family
 --      ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape
 	["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Süren dolmadan tüm hedefleri yoket.|Bu görevde sınırsız mermin var.", --Bazooka, Shotgun, SniperRifle
---      ["Eliminate the Blue Team before the time runs out."] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Eliminate the enemy before the time runs out."] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 	["Eliminate the enemy hogs to win."] = "Vernichte alle gegnerischen Igel um zu gewinnen",
-	["Eliminate the enemy specialists."] = "Vernichte die gegnerischen Spezialisten",
 --      ["Eliminate the enemy."] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh
 --      ["Eliminate Unit 3378."] = "", -- User_Mission_-_Teamwork
 --      ["Eliminate WatchBot 4000."] = "", -- User_Mission_-_Teamwork_2
@@ -622,13 +621,14 @@
 --      ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab
 --      ["Except me, of course! I just saved a whole planet!"] = "", -- A_Space_Adventure:final
 --      ["Experienced beginner"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Explore the tunnel with the other hedgehogs and search for the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Explore the tunnel with the other hedgehogs and search for the device."] = "", -- A_Space_Adventure:fruit02
 --      ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02
 --      ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey
 --      ["Fair Wind"] = "", -- 
 --      ["Fall Damage"] = "", -- Basic_Training_-_Movement
 --      ["Fallen Angel"] = "", -- Tentacle_Terror
 --      ["Family Reunion"] = "", -- A_Classic_Fairytale:family
+--      ["Fastest escape: %d turns"] = "", -- A_Space_Adventure:desert02
 --      ["Fastest lap: %.3fs by %s"] = "", -- TrophyRace
 	["Fastest lap: "] = "Schnellste Runde: ",
 	["Feeble Resistance"] = "Kraftloser Widerstand",
@@ -648,11 +648,12 @@
 --      ["Final result"] = "", -- Mutant
 --      ["Final Targets"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
 --      ["Final team scores:"] = "", -- Space_Invasion
+--      ["Find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Find a way to detonate all the explosives and stay alive!"] = "", -- A_Space_Adventure:final
 --      ["Find your tribe!|Cross the lake!"] = "", -- A_Classic_Fairytale:dragon
 --      ["Finish this challenge as fast as possible to earn bonus points."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Finish waypoint placement"] = "", -- Racer
---      ["Finish your training|Hint: Animations can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Finish your training."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Finite Ropes"] = "", -- Basic_Training_-_Rope
 --      ["Fire a rocket with napalm."] = "", -- Continental_supplies
 --      ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler
@@ -680,6 +681,7 @@
 --      ["Flying Saucer Training"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Fly into space to fight off the invaders with barrels!"] = "", -- Space_Invasion
 --      ["Fly to the meteorite and detonate the explosives"] = "", -- A_Space_Adventure:cosmos
+--      ["Follow the path and destroy the next target."] = "", -- Basic_Training_-_Rope
 --      ["Forgetfulness: You will lose all your weapons each turn."] = "", -- Continental_supplies
 --      ["For the next crate, you have to do back jumps."] = "", -- Basic_Training_-_Movement
 --      ["Four Eyes"] = "", -- 
@@ -699,9 +701,7 @@
 --      ["“g=150”, where 150 is 150% of normal gravity."] = "", -- Gravity
 --      ["“g=50, g2=150, period=4000” for gravity changing|from 50 to 150 and back with period of 4000 ms."] = "", -- Gravity
 --      ["Galaxy Guardians"] = "", -- Big_Armory
---      ["Game Modifiers: "] = "", -- The_Specialists
 --      ["Game over!"] = "", -- Space_Invasion
-	["GAME OVER!"] = "SPIEL ZU ENDE!",
 	["Game Started!"] = "Spiel Gestartet!]",
 --      ["Game? Was this a game to you?!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Gangsters"] = "", -- 
@@ -710,8 +710,6 @@
 --      ["Gasp! A smuggler!"] = "", -- A_Space_Adventure:desert01
 --      ["Gasp!"] = "", -- A_Space_Adventure:desert01
 --      ["Gathering fruits all day long."] = "", -- A_Classic_Fairytale:queen
---      ["Gear information hidden"] = "", -- HedgeEditor
---      ["Gear information shown"] = "", -- HedgeEditor
 --      ["Gear Placement Tool"] = "", -- HedgeEditor
 --      ["General information"] = "", -- Continental_supplies
 --      ["General information:"] = "", -- Continental_supplies
@@ -721,7 +719,7 @@
 --      ["Get Dense Cloud out of the pit!"] = "", -- A_Classic_Fairytale:journey
 --      ["Get him, Spike!"] = "", -- A_Space_Adventure:desert01
 	["Get on over there and take him out!"] = "Mach, dass du hinüber kommst und schalte ihn aus!",
---      ["Get on the head of the mole"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Get on the head of the mole."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Get past the flower."] = "", -- A_Classic_Fairytale:journey
 --      ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01
 --      ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood
@@ -759,7 +757,6 @@
 	["GO! GO! GO!"] = "Bewegung, Bewegung, Bewegung!",
 	["Good birdy......"] = "Braver Vogel......",
 --      ["Good bye!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Good Dude"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Good idea, they'll never find us there!"] = "", -- A_Classic_Fairytale:united
 --      ["Good job!"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Good job! Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -770,7 +767,7 @@
 	["Good so far!"] = "Gut soweit!",
 	["Good to go!"] = "Startklar!",
 --      ["Good! You now control Cappy."] = "", -- Basic_Training_-_Movement
---      ["Go on top of the flower"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Go on top of the flower."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Go, quick!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Gorkij"] = "", -- A_Classic_Fairytale:journey
 --      ["Go surf!"] = "", -- WxW
@@ -793,7 +790,6 @@
 --      ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow
 --      ["Green"] = "", -- 
 --      ["Green Bananas"] = "", -- A_Space_Adventure:fruit01
---      ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Green double rings also give you a new flying saucer."] = "", -- A_Space_Adventure:ice02
 --      ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01
 --      ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01
@@ -803,11 +799,8 @@
 --      ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Greetings from the Navy, %s (%s), for being a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["Greetings, %s!"] = "", -- A_Classic_Fairytale:dragon
---      ["Greg"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
---      ["Grenade Group"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard
 --      ["Grenades explode after 1 to 5 seconds (you decide)."] = "", -- Basic_Training_-_Grenade
 --      ["Grenades with high bounciness bounce a lot and behave chaotic."] = "", -- Basic_Training_-_Grenade
---      ["Grenade Team"] = "", -- Basic_Training_-_Grenade
 --      ["Grenade Training"] = "", -- Basic_Training_-_Grenade
 --      ["Grenadiers"] = "", -- Basic_Training_-_Grenade
 --      ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor
@@ -848,7 +841,6 @@
 --      ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion
 --      ["Health Modification Mode"] = "", -- HedgeEditor
 --      ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor
---      ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
 --      ["Heavenly Defense"] = "", -- Tentacle_Terror
 --      ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united
 	["Heavy"] = "Schwierig",
@@ -861,6 +853,7 @@
 --      ["Hedgehog Projectile"] = "", -- Continental_supplies
 --      ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies
 --      ["Hedgehogs can not be deleted."] = "", -- HedgeEditor
+--      ["Hedgehogs left: %d"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Hedgehogs will be revived after their death."] = "", -- Mutant
 --      ["Hedgehogs will start in the first waypoint."] = "", -- Racer
 --      ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab
@@ -876,7 +869,6 @@
 --      ["Help Enabled"] = "", -- HedgeEditor
 --      ["Helpers: Each team starts with %d helper points"] = "", -- Battalion
 --      ["Helpers: Hogs will get 1 out of 2 helpers randomly each turn"] = "", -- Battalion
---      ["Help Hog Solo to find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Help me, Leaks!"] = "", -- A_Classic_Fairytale:journey
 --      ["Help me, please!!!"] = "", -- A_Classic_Fairytale:journey
 --      ["Help me, please!"] = "", -- A_Classic_Fairytale:journey
@@ -891,20 +883,20 @@
 --      ["Here you will find the current mission instructions."] = "", -- Basic_Training_-_Movement
 --      ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Heroic Wind"] = "", -- Continental_supplies
---      ["Hero Team"] = "", -- User_Mission_-_The_Great_Escape
 --      ["He's so brave..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["He was the lab assistant of Dr. Goodhogan, the inventor of the anti-gravity device."] = "", -- A_Space_Adventure:moon02
 --      ["He won't be selling us out anymore!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey, don't forget us! We still need to climb up!"] = "", -- A_Classic_Fairytale:family
 --      ["Hey, guys!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey guys!"] = "", -- A_Classic_Fairytale:united
---      ["Hey, Hog Solo! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey! I was supposed to collect it!"] = "", -- A_Space_Adventure:fruit02
+--      ["Hey, %s! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey, %s! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey
 --      ["Hidden"] = "", -- portal
 --      ["High Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["High Jump: [Backspace]"] = "", -- Basic_Training_-_Movement
+--      ["High Jump: Tap the [Curvy Arrow] shortly"] = "", -- Basic_Training_-_Movement
 --      ["--- Highland ---"] = "", -- Battalion
 --      ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander
 --      ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion
@@ -915,20 +907,24 @@
 --      ["Hill Guard"] = "", -- Bazooka_Battlefield
 --      ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01
 --      ["--- Hint ---"] = "", -- Battalion
---      ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
 --      ["Hint: Drilling holes should solve everything."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: Hold down [M] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: If this mission panel disappears, you can|see it again by hitting the Pause or Quit key."] = "", -- Basic_Training_-_Movement
 --      ["Hint: It might be a good idea to place a girder before starting to drill. Just saying."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: It might be easier if you vary the angle only slightly."] = "", -- Basic_Training_-_Bazooka
+--      ["Hint: Just select the parachute, it opens automatically when you fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion
 --      ["Hint: Launch the bazooka horizontally at full power."] = "", -- Basic_Training_-_Bazooka
---      ["Hint: Press [Esc] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Pause the game to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Select the blow torch, aim and press [Fire]. Press [Fire] again to stop."] = "", -- A_Classic_Fairytale:journey
 --      ["Hint: Select the low gravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey
+--      ["Hint: Select the rope, [Up] or [Down] to aim, [Attack] to fire, directional keys to move."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Select the Shoryuken and hit [Attack].|P.S.: You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: %s needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family
 --      ["Hint: The rope only bends around objects.|When it doesn't hit anything, it's always straight."] = "", -- Basic_Training_-_Rope
 --      ["Hint: To jump higher, wait a bit before you hit “High Jump” a second time."] = "", -- Basic_Training_-_Movement
+--      ["Hint: To place a girder, select it,|then use [Left] and [Right] to select angle and length,|then choose a location for the girder."] = "", -- A_Classic_Fairytale:shadow
 --      ["Hint: Use the quit key to see the team’s continent."] = "", -- Continental_supplies
 --      ["Hint: When you shorten the rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope
 --      ["Hint: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey
@@ -962,24 +958,11 @@
 --      ["Hogminator"] = "", -- A_Classic_Fairytale:family
 --      ["Hog nueve"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog octo"] = "", -- A_Space_Adventure:fruit03
---      ["Hogonauts"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Hog onze"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog Saturn"] = "", -- A_Space_Adventure:fruit03
 --      ["Hogs in sight!"] = "", -- Continental_supplies
 --      ["Hog Solo and GB"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hog Solo"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01, A_Space_Adventure:moon02
---      ["Hog Solo couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo escaped successfully!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo has to reach the last crates"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo has to refuel his saucer."] = "", -- A_Space_Adventure:moon01
---      ["Hog Solo lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
---      ["Hog Solo wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["- Hogs will be revived"] = "", -- Capture_the_Flag
 --      ["- Hogs will drop the flag when killed"] = "", -- Capture_the_Flag
 --      ["Hog two"] = "", -- A_Space_Adventure:fruit03
@@ -989,9 +972,7 @@
 --      ["Homing Bee"] = "", -- Construction_Mode
 --      ["Honda"] = "", -- 
 --      ["Honest Lee"] = "", -- A_Classic_Fairytale:enemy
---      ["Hook"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
 --      ["Hooks"] = "", -- 
-	["Hooray!"] = "Hurra!",
 --      ["Hooray! I actually did it! Hogera is safe!"] = "", -- A_Space_Adventure:final
 --      ["Hooray! I've found it, now I have to get back to Captain Lime!"] = "", -- A_Space_Adventure:fruit02
 --      ["Hooray! You are a champion!"] = "", -- A_Space_Adventure:ice02
@@ -1007,7 +988,7 @@
 --      ["However, if you fail to do so, she dies a most violent death, just like your friend! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, if you fail to do so, she dies a most violent death! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, my mates don't agree with me on letting you go..."] = "", -- A_Classic_Fairytale:dragon
---      ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
+--      ["However, the army of %s is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
 --      ["How to Rope"] = "", -- Basic_Training_-_Rope
 --      ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen
 --      ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen
@@ -1027,7 +1008,6 @@
 --      ["I can't believe what I'm hearing!"] = "", -- A_Classic_Fairytale:backstab
 --      ["I can't let you go further because …"] = "", -- A_Classic_Fairytale:queen
 --      ["I can't wait any more, I have to save myself!"] = "", -- A_Classic_Fairytale:shadow
---      ["Ice"] = "", -- Basic_Training_-_Movement
 --      ["Ice Jake"] = "", -- A_Space_Adventure:ice01
 --      ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family
 --      ["Icy Girder: [3]"] = "", -- HedgeEditor
@@ -1085,7 +1065,6 @@
 --      ["I just found out that they have captured your princess!"] = "", -- A_Classic_Fairytale:family
 --      ["I just want the strange device you found!"] = "", -- A_Space_Adventure:ice01
 --      ["I just wonder where Ramon and Spiky disappeared..."] = "", -- A_Classic_Fairytale:journey
---      ["Ikeda"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["I know and I'm terribly sorry!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know, my hero!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know that your resources are low due to the battle but I'll send two of my best hogs to assist you."] = "", -- A_Space_Adventure:fruit02
@@ -1113,6 +1092,7 @@
 --      ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen
 --      ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united
 --      ["IMPORTANT: To see the mission panel again, hold the mission panel key."] = "", -- Basic_Training_-_Movement
+--      ["IMPORTANT: To see the mission panel again, pause the game."] = "", -- Basic_Training_-_Movement
 --      ["Impressive...you are still dry as the corpse of a hawk after a week in the desert..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["%i ms"] = "", -- Gravity
 --      ["I'm so glad this is finally over!"] = "", -- A_Space_Adventure:final
@@ -1271,7 +1251,6 @@
 --      ["Kill the traitor, %s, or spare his life!"] = "", -- A_Classic_Fairytale:backstab
 --      ["--- King ---"] = "", -- Battalion
 --      ["King"] = "", -- Battalion
---      ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing
 --      ["--- King Mode ---"] = "", -- Battalion
 --      ["Knight"] = "", -- Battalion
 --      ["Knives"] = "", -- 
@@ -1290,7 +1269,7 @@
 --      ["Launch some bazookas to destroy the targets!"] = "", -- Basic_Training_-_Bazooka
 --      ["Leader"] = "", -- A_Classic_Fairytale:enemy
 --      ["Leaderbot"] = "", -- A_Classic_Fairytale:queen
---      ["Lead the Green Bananas to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
+--      ["Lead your allies to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
 --      ["Leaks A Lot"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Leaks A Lot, depressed for killing his loved one, failed to save the village..."] = "", -- A_Classic_Fairytale:journey
 --      ["Leaks A Lot gave his life for his tribe! He should have survived!"] = "", -- A_Classic_Fairytale:first_blood
@@ -1305,7 +1284,6 @@
 --      ["Left/right: Choose crate contents"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode
---      ["Left Tong"] = "", -- Bazooka_Battlefield
 --      ["Legs"] = "", -- 
 --      ["Less tools, more fun"] = "", -- Battalion
 --      ["Lestat"] = "", -- portal
@@ -1334,18 +1312,19 @@
 --      ["Lively Lifeguard"] = "",
 --      ["Lonely Cries"] = "", -- Continental_supplies
 --      ["Lonely Cries: [Rise the water if no hog is in the circle and deal 6 damage to all enemy hogs.]"] = "", -- Continental_supplies
---      ["Lonely Hog"] = "", -- ClimbHome
 --      ["Long Jump: [Enter]"] = "", -- Basic_Training_-_Movement
+--      ["Long Jump: Tap the [Curvy Arrow] button for long"] = "", -- Basic_Training_-_Movement, A_Classic_Fairytale:first_blood
 --      ["Long Live The Queen"] = "", -- A_Classic_Fairytale:queen
 --      ["Look around: [Mouse movement]"] = "", -- Basic_Training_-_Movement
+--      ["Look around: [Tap or swipe on the screen]"] = "", -- Basic_Training_-_Movement
 --      ["Look, boss! There is the target!"] = "", -- A_Space_Adventure:moon01
 --      ["Look, I had no choice!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! There's more of them!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! We're surrounded by cannibals!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Looks like the whole world is falling apart!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Look to the left and do a backwards jump towards the mushroom."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Loon"] = "", -- The_Specialists
 --      ["Loopy"] = "", -- 
---      ["Lord Evil"] = "", -- Tentacle_Terror
 --      ["Losing Condition: Destroy"] = "", -- HedgeEditor
 --      ["Low Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander
@@ -1365,7 +1344,6 @@
 --      ["Mario"] = "", -- 
 --      ["Mark gears for win/lose conditions"] = "", -- HedgeEditor
 --      ["Mark/unmark gear: [Left Click]"] = "", -- HedgeEditor
---      ["Mark"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
 --      ["- Massive weapon bonus on first turn"] = "", -- Continental_supplies
 --      ["Max Citrus"] = "", -- A_Space_Adventure:fruit01
 --      ["Maybe you should try an easier map next time."] = "", -- Racer
@@ -1380,7 +1358,6 @@
 --      ["Mega kill!"] = "", -- Mutant
 --      ["Meiwes"] = "", -- A_Classic_Fairytale:backstab
 --      ["mikade"] = "", -- 
---      ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer
 --      ["Mindy"] = "", -- A_Classic_Fairytale:united
 	["Mine Deployer"] = "Minenleger",
 --      ["Mine Placement Mode"] = "", -- Construction_Mode
@@ -1399,12 +1376,12 @@
 --      ["Minion"] = "", -- A_Space_Adventure:moon01
 --      ["Minions"] = "", -- A_Space_Adventure:moon01
 --      ["Mission failed!"] = "", -- Big_Armory
-	["MISSION FAILED"] = "MISSION GESCHEITERT", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Mission failure in %d s"] = "", -- Big_Armory
+--      ["Mission"] = "", -- HedgeEditor
 --      ["Mission lost!"] = "", -- Basic_Training_-_Grenade
 --      ["Mission Panel"] = "", -- Basic_Training_-_Movement
 --      ["Mission panel: [M]"] = "", -- Basic_Training_-_Movement
-	["MISSION SUCCESSFUL"] = "MISSION ERFOLGREICH", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+--      ["Mission succeeded!"] = "", -- portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, SimpleMission, HedgeEditor
 --      ["Mission won!"] = "", -- Basic_Training_-_Grenade
 --      ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02
 --      ["Mixed %d"] = "", -- WxW
@@ -1420,7 +1397,6 @@
 --      ["Monster kill!"] = "", -- Mutant
 --      ["Monsters"] = "", -- 
 --      ["Mooney"] = "", -- 
---      ["More Natives"] = "", -- A_Classic_Fairytale:epil
 --      ["Morris"] = "", -- 
 --      ["Most mines are not active."] = "", -- A_Space_Adventure:desert02
 --      ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01
@@ -1441,13 +1417,11 @@
 --      ["Nade Boy"] = "", -- Basic_Training_-_Grenade
 --      ["Nah, probably everyone was just stupid."] = "", -- A_Space_Adventure:final
 --      ["Name"] = "", -- A_Classic_Fairytale:queen
-	["Nameless Heroes"] = "Namenlose Helden",
 --      ["Nancy Screw"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:queen
 --      ["Napalm"] = "", -- Construction_Mode
 --      ["Napalm Rocket"] = "", -- Continental_supplies
 --      ["Napalm rocket: [Fire a bomb with napalm!]"] = "", -- Continental_supplies
 --      ["Naranja Jed"] = "", -- A_Space_Adventure:fruit01
---      ["Natives"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Naughty Ninja"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Near a PAotH base on the moon ..."] = "", -- A_Space_Adventure:moon01
 --      ["Near Secret Base 17 of PAotH in the rural Hogland ..."] = "", -- A_Space_Adventure:cosmos
@@ -1542,11 +1516,8 @@
 --      ["Oh, my!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oh, my! I forgot something!"] = "", -- A_Classic_Fairytale:queen
 --      ["Oh, my! This is even more entertaining than I've expected!"] = "", -- A_Classic_Fairytale:backstab
-	["Oh no! Just try again!"] = "Oh nein! Versuch's nochmal!", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Oh no, not %s!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
---      ["Oh no, the Green Bananas have betrayed Hog Solo and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
-	["Oh no! Time's up! Just try again."] = "Oh nein! Die Zeit ist um! Versuche es nochmal.", --Bazooka, Shotgun, SniperRifle
---      ["Oh no! You failed! Just try again."] = "", -- Basic_Training_-_Cluster_Bomb
+--      ["Oh no, the companions have betrayed %s and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
 --      ["Oh no! You have died. Try again!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Oh! Please spare me. You can take all my treasures!"] = "", -- A_Space_Adventure:ice01
 --      ["Oh, silly me! I forgot that I'm the shaman."] = "", -- A_Classic_Fairytale:backstab
@@ -1568,9 +1539,9 @@
 --      ["One shall not judge one by one's appearance!"] = "", -- A_Classic_Fairytale:epil
 --      ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oneye"] = "", -- portal
---      ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant
 --      ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant
+--      ["Only %s can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard
 --      ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01
@@ -1582,6 +1553,7 @@
 --      ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01
 --      ["Oops! You have selected the wrong hedgehog! Just try again."] = "", -- Basic_Training_-_Movement
 --      ["Open ammo menu: [Right click]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
+--      ["Open ammo menu: Tap the [Suitcase]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
 --      ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood
 	["Opposing Team: "] = "Gegnerisches Team: ",
 --      ["Orange"] = "", -- 
@@ -1601,15 +1573,14 @@
 --      ["PAotH has sent explosives but unfortunately the trigger mechanism seems to be faulty!"] = "", -- A_Space_Adventure:cosmos
 --      ["Parachute"] = "", -- Continental_supplies
 --      ["Patches"] = "", -- 
-	["Pathetic Resistance"] = "Erbärmlicher Widerstand", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02
 --      ["Pause: [P]"] = "", -- Basic_Training_-_Movement
+--      ["Pause: Tap the [Pause] button"] = "", -- Basic_Training_-_Movement
 --      ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW
 --      ["Penguin Roar"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hog’s health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Perfect! Now try to get the next crate without hurting yourself!"] = "", -- A_Classic_Fairytale:first_blood
-	["Per-Hog Ammo"] = "Munition pro Igel",
 --      ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh
 --      ["Personal best: %.3f seconds"] = "", -- A_Space_Adventure:ice02
 --      ["Per team weapons"] = "", -- Continental_supplies
@@ -1618,7 +1589,6 @@
 --      ["Physicist"] = "", -- HedgeEditor
 --      ["Piano Strike"] = "", -- Construction_Mode
 --      ["Pikachu"] = "", -- 
---      ["Pincer Knights"] = "", -- Bazooka_Battlefield
 --      ["Pings left: %d"] = "", -- Space_Invasion
 --      ["Pink"] = "", -- 
 --      ["Pirates"] = "", -- 
@@ -1671,8 +1641,6 @@
 --      ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion
 --      ["--- Points ---"] = "", -- Battalion
 --      ["--- Points Mode ---"] = "", -- Battalion
-	["points"] = "Punkte", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
---      ["point(s)"] = "", -- TargetPractice, Mutant
 	["Poison"] = "Gift",
 --      ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02
 --      ["Poisonous, deals no damage."] = "", -- Continental_supplies
@@ -1692,37 +1660,37 @@
 --      ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to fight"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos
-	["Prepare yourself"] = "Mach dich bereit",
+--      ["Prepare yourself, %s!"] = "", -- The_Specialists
 --      ["Press [Attack] (space bar by default) to start,|repeadedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] (space bar by default) to start,|repeatedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] to begin."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Attack] to confirm."] = "", -- Continental_supplies
 --      ["Press [Attack] to select this continent!"] = "", -- Continental_supplies
 --      ["Press [Left] and [Right] to change the difficulty."] = "", -- A_Classic_Fairytale:first_blood
---      ["Press [Left] or [Right] to move around, [Enter] to jump"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Press [Left] or [Right] to move around, [Long Jump] to jump forwards."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW
 --      ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW
+--      ["Press [M] to see the mission texts"] = "", -- Basic_Training_-_Movement
 --      ["Press [Precise] to skip intro"] = "",
 --      ["Press [Up] and [Down] to move between menu items.|Press [Attack], [Left], or [Right] to toggle."] = "", -- WxW
 --      ["Prestigious Pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Princess"] = "", -- A_Classic_Fairytale:family, A_Classic_Fairytale:journey
 --      ["Princess Peach"] = "", -- 
---      ["Private Nolak"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["Problems, dude? Chillax!"] = "", -- A_Classic_Fairytale:epil
 --      ["Professional pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professional stunt pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professor"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
 --      ["Professor Hogevil, then known as James Hogus, worked for PAotH back in my time."] = "", -- A_Space_Adventure:moon02
+--      ["Professor's Team"] = "", -- A_Space_Adventure:death01
 --      ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
---      ["Pro Killers"] = "", -- Big_Armory
 --      ["Protect the King: When the king dies, so does the team"] = "", -- Battalion
 --      ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Protect yourselves!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Purple"] = "", -- 
 --      ["Pyro"] = "", -- HedgeEditor, The_Specialists
 --      ["Pyromancer"] = "", -- Battalion
 --      ["Quit: [Esc]"] = "", -- Basic_Training_-_Movement
 --      ["Race complexity limit reached"] = "", -- Racer, TechRacer
+--      ["Race failed!"] = "", -- A_Space_Adventure:moon02
 --      ["Racer"] = "", -- Racer
 --      ["Racer tool"] = "", -- Racer
 --      ["Race"] = "", -- TrophyRace
@@ -1758,23 +1726,19 @@
 --      ["Replenishment: Weapons are restocked on turn start of a new hog"] = "", -- Highlander
 --      ["Repositioning Mode"] = "", -- HedgeEditor
 --      ["REPOSITIONING MODE"] = "", -- HedgeEditor
---      ["rescues"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Rescue the imprisoned PAotH team and get the fuel!"] = "", -- A_Space_Adventure:moon01
 --      ["Respawner"] = "", -- Construction_Mode
 --      ["Respawner: Resurrects dead hogs."] = "", -- Construction_Mode
 --      ["Resurrector"] = "", -- Construction_Mode
 --      ["Retract/Extend rope: [Up]/[Down]"] = "", -- Basic_Training_-_Rope
 --      ["- Return the enemy flag to your base to score"] = "", -- Capture_the_Flag
-	[" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = " - Bringe die gegnerische Flagge zu deiner Heimatbasis um zu punkten. | - Das Team das zuerst 3 Flaggen erobert gewinnt. | - Du kannst nur punkten wenn deine eigene Flagge in deiner Basis ist | - Igel lassen die Flagge fallen wenn sie sterben oder ertrinken | - Fallen gelassene Flaggen können zurückgebracht oder wieder gestohlen werden | - Igel tauchen nach ihrem Tod wieder auf",
 --      ["Return to Leaks A Lot!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Return to the mission menu by pressing the \"Go back\" button."] = "", -- A_Space_Adventure:cosmos
 --      ["Return to the Surface"] = "", -- A_Space_Adventure:fruit02
 --      ["Return to the training menu by pressing the “Go back” button."] = "", -- Basic_Training_-_Movement
---      ["Rhombus"] = "", -- Basic_Training_-_Movement
 --      ["Rider"] = "", -- portal
 --      ["Rifleman"] = "", -- Battalion
 --      ["Righteous Beard"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:queen, A_Classic_Fairytale:united
---      ["Right Tong"] = "", -- Bazooka_Battlefield
 --      ["Ripe"] = "", -- 
 --      ["Rise the water if nobody else is in the circle and deal 6 damage to all enemy hogs."] = "", -- Continental_supplies
 --      ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01
@@ -1783,8 +1747,8 @@
 --      ["Roof"] = "", -- WxW
 --      ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Rope Master"] = "", -- Basic_Training_-_Rope
---      ["Roper"] = "", -- SpeedShoppa
 --      ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
+--      ["Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Rope Team"] = "", -- Basic_Training_-_Rope
 --      ["Rope Training"] = "", -- Basic_Training_-_Rope
 --      ["Rope Weapons"] = "", -- Basic_Training_-_Rope
@@ -1798,7 +1762,6 @@
 --      ["Round limit:"] = "", -- TechRacer
 --      ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer
 --      ["Round's slowest lap: %.3fs by %s"] = "", -- TrophyRace
---      ["Rounds until Sudden Death: %d"] = "", -- Battalion
 --      ["RS1"] = "", -- A_Space_Adventure:fruit03
 --      ["RS2"] = "", -- A_Space_Adventure:fruit03
 --      ["Rubber"] = "", -- Construction_Mode, HedgeEditor
@@ -1824,10 +1787,17 @@
 --      ["Salvation was one step closer now..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Sam"] = "", -- A_Space_Adventure:cosmos
 --      ["Sandals?! I thought you left your ring!"] = "", -- A_Classic_Fairytale:queen
+--      ["%s and GB"] = "", -- A_Space_Adventure:fruit02
 --      ["%s and %s enter the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sandstorm"] = "", -- A_Space_Adventure:desert01
 --      ["Sandy"] = "", -- A_Space_Adventure:desert01
-	["Save as many hapless hogs as possible!"] = "Rette so viele glücklose Igel als möglich!",
+--      ["%s arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
+--      ["Save as many hogs as possible!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey
 --      ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow
 --      ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor
@@ -1839,9 +1809,9 @@
 --      ["Scallywag"] = "", -- 
 --      ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab
 --      ["Scenario"] = "", -- Big_Armory, portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape
---      ["Scenario failed!"] = "", -- SimpleMission
 --      ["Scientist"] = "", -- Battalion
 --      ["%s climbed home in %d seconds!"] = "", -- ClimbHome
+--      ["%s (contd.)"] = "", -- A_Classic_Fairytale:epil
 --      ["Score: %d"] = "", -- Space_Invasion
 --      ["Score goal: %d"] = "", -- Control
 --      ["Score graph"] = "", -- Mutant, Space_Invasion
@@ -1851,6 +1821,7 @@
 --      ["Scores"] = "", -- Mutant
 --      ["Scores:"] = "", -- Mutant
 --      ["Scoring: "] = "", -- Mutant
+--      ["%s couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
 --      ["Script parameter examples:"] = "", -- Gravity
 --      ["%s (+%d)"] = "", -- Battalion
 --      ["%s: %d"] = "", -- Capture_the_Flag, Control
@@ -1863,10 +1834,9 @@
 --      ["%s died … and lives again!"] = "", -- Construction_Mode
 --      ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome
 --      ["%s, %d sec"] = "", -- Continental_supplies
---      ["Search for the device with the help of the other hedgehogs "] = "", -- A_Space_Adventure:fruit02
+--      ["Search for the device with the help of the other hedgehogs."] = "", -- A_Space_Adventure:fruit02
 --      ["Searching in the dust"] = "", -- A_Space_Adventure:desert01
 --      ["Searching the stars!"] = "", -- A_Space_Adventure:cosmos
---      ["seconds"] = "", -- ClimbHome
 --      ["Seduction"] = "", -- Continental_supplies
 --      ["Seems like every time you take a \"walk\", the enemy finds us!"] = "", -- A_Classic_Fairytale:backstab
 --      ["See that crate farther on the right?"] = "", -- A_Classic_Fairytale:first_blood
@@ -1893,6 +1863,7 @@
 --      ["Select your continent with [Up]/[Down] or by selecting a representative weapon."] = "", -- Continental_supplies
 --      ["%s enters the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sergey"] = "", -- 
+--      ["%s escaped successfully!"] = "", -- A_Space_Adventure:fruit01
 --      ["Set bounciness: [Left Shift] + [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set detonation timer: [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set Health: [Left Click]"] = "", -- HedgeEditor
@@ -1916,10 +1887,12 @@
 --      ["%s has been killed before taking enough damage first."] = "", -- SimpleMission
 --      ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has been rescued from death"] = "", -- Construction_Mode
+--      ["%s has dropped the flag!"] = "", -- CTF_Blizzard
 --      ["%s has fallen victim to gravity."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has mutated! +2 points"] = "", -- Mutant
 --      ["%s has passed the best height of %s!"] = "", -- ClimbHome
 --      ["%s has scored!"] = "", -- Capture_the_Flag
+--      ["%s has to refuel the saucer."] = "", -- A_Space_Adventure:moon01
 --      ["%s hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil
 --      ["sheepluva"] = "", -- 
@@ -1936,8 +1909,6 @@
 --      ["Shinobi"] = "", -- 
 --      ["%s hit the ground."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Shoppa Love"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
---      ["Shoppa Union"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes, Challenge_-_Speed_Shoppa_-_ShoppaKing
---      ["Shoppers"] = "", -- SpeedShoppa
 --      ["Shotgun"] = "", -- Continental_supplies
 --      ["Sigh."] = "", -- A_Classic_Fairytale:epil
 	["Silly"] = "Doofi",
@@ -1950,11 +1921,11 @@
 --      ["%s is now as poor as a church mouse"] = "", -- Construction_Mode
 --      ["%s is now a zombie hedgehog"] = "", -- Construction_Mode
 --      ["%s is suddenly low on ammo"] = "", -- Construction_Mode
---      ["Skip your turn to try again."] = "", -- Basic_Training_-_Rope
 --      ["Skulls"] = "", -- Bazooka_Battlefield
 --      ["Slimer"] = "", -- 
 --      ["Slippery"] = "", -- A_Classic_Fairytale:journey
 --      ["%s lost all the weapons"] = "", -- Construction_Mode
+--      ["%s lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
 --      ["Slot %d: %s"] = "", -- Frenzy
 --      ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy
 --      ["Slowpoke"] = "", -- 
@@ -1968,6 +1939,7 @@
 --      ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smugglers"] = "", -- A_Space_Adventure:desert01
+--      ["%s must collect the final crates."] = "", -- A_Space_Adventure:fruit02
 --      ["%s must skip this turn for rule violation."] = "", -- WxW
 --      ["Sneaks"] = "", -- Bazooka_Battlefield
 --      ["%s never got the ninja diploma."] = "", -- ClimbHome
@@ -1976,10 +1948,8 @@
 --      ["Sniper"] = "", -- HedgeEditor, The_Specialists
 --      ["Sniper Rifle"] = "", -- Continental_supplies
 	["Sniper Training"] = "Scharfschützen-Training",
-	["Sniperz"] = "Heckenschützen",
 --      ["So, as promised I have brought you where I think that the device you are looking for is hidden."] = "", -- A_Space_Adventure:fruit02
 --      ["So far, you had infinite ropes, but in the|real world, ropes are usually limited."] = "", -- Basic_Training_-_Rope
---      ["So Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["So, I believe that it's a good place to start."] = "", -- A_Space_Adventure:desert01
 --      ["So, I kindly ask for your help."] = "", -- A_Space_Adventure:fruit01
@@ -1989,11 +1959,12 @@
 --      ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03
 --      ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen
 --      ["Some weapons can be dropped from the rope."] = "", -- Basic_Training_-_Rope
---      ["Somewhere else on the planet of fruits, Captain Lime helps Hog Solo"] = "", -- A_Space_Adventure:fruit02
---      ["Somewhere else on the planet of fruits Hog Solo gets closer to the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, Captain Lime helps %s"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, %s gets closer to the device"] = "", -- A_Space_Adventure:fruit02
 --      ["Somewhere on the Planet of Fruits a terrible war is about to begin ..."] = "", -- A_Space_Adventure:fruit01
 --      ["Somewhere on the uninhabitable Death Planet ..."] = "", -- A_Space_Adventure:death01
 --      ["So, now I got the last part and I have your friends captured."] = "", -- A_Space_Adventure:death01
+--      ["So, %s, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So the princess was never heard of again ..."] = "", -- A_Classic_Fairytale:family
 --      ["So, uhmm, how did you manage to teleport them so far?"] = "", -- A_Classic_Fairytale:epil
 --      ["Sour"] = "", -- 
@@ -2094,8 +2065,6 @@
 --      ["Structure Placement Mode"] = "", -- Construction_Mode
 --      ["Structure Placer"] = "", -- Construction_Mode
 --      ["Stupid, stupid Hogerians!"] = "", -- A_Space_Adventure:final
---      ["Subject 1"] = "", -- portal
---      ["Subjects"] = "", -- portal
 --      ["Subtract %d"] = "", -- HedgeEditor
 --      ["--- Sudden Death ---"] = "", -- Battalion
 --      ["Summer Squash"] = "", -- A_Space_Adventure:fruit01
@@ -2112,7 +2081,7 @@
 --      ["Surfer! +15 points!"] = "", -- Space_Invasion
 --      ["Surfer!"] = "", -- WxW
 --      ["Surprise supplies: Get 1-3 random weapons each turn."] = "", -- Continental_supplies
---      ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:shadow
+--      ["Survive!"] = "", -- A_Classic_Fairytale:shadow
 --      ["%s violated the “All But Last” rule and will be penalized."] = "", -- WxW
 --      ["%s violated the “Kill The Leader” rule and will be penalized."] = "", -- WxW
 --      ["Swap place with a random enemy in the circle."] = "", -- Continental_supplies
@@ -2131,6 +2100,7 @@
 --      ["%s! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
 --      ["Swing, Leaks A Lot, on the wings of the wind!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Swing: [Left]/[Right]"] = "", -- Basic_Training_-_Rope
+--      ["%s wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome
 --      ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer
 --      ["switch"] = "", -- Continental_supplies
@@ -2144,6 +2114,7 @@
 --      ["Switch Hog"] = "", -- Construction_Mode
 --      ["Switch: Select weapon special"] = "", -- Continental_supplies
 --      ["Switch: Toggle crate radar"] = "", -- WxW
+--      ["%s won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Swords"] = "", -- Bazooka_Battlefield
 --      ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon
 --      ["%s, you may choose the rules."] = "", -- WxW
@@ -2152,6 +2123,8 @@
 --      ["Tails"] = "", -- 
 --      ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Tall Potato"] = "", -- A_Space_Adventure:fruit01
+--      ["Tap [Pause] to see the mission texts"] = "", -- Basic_Training_-_Movement
+--      ["Tap the “rotating arrow” button on the left|until you have selected Cappy, the hedgehog with the cap!"] = "", -- Basic_Training_-_Movement
 --      ["Target"] = "", -- HedgeEditor
 --      ["Target Placement Mode"] = "", -- Construction_Mode
 --      ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor
@@ -2167,15 +2140,18 @@
 --      ["Tatters"] = "", -- 
 --	["Team %d: "] = "",
 --      ["Team %d"] = "", -- SimpleMission
+--      ["Team highscore: %d"] = "", -- Utils
 --      ["Team Identity Mode"] = "", -- HedgeEditor
 --      ["TEAM IDENTITY MODE"] = "", -- HedgeEditor
---      ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
+--      ["Team lowscore: %d"] = "", -- Utils
 --      ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion
+--      ["Team's best time: %.3fs"] = "", -- Utils
 --      ["Team Scores:"] = "", -- Control
 --      ["Team scores:"] = "", -- Space_Invasion
+--      ["Team's longest time: %.3fs"] = "", -- Utils
+--      ["Team's top accuracy: %d%"] = "", -- Utils
 --      ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2
 --      ["Teamwork"] = "", -- User_Mission_-_Teamwork
---      ["Team Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
 --      ["TechRacer"] = "", -- TechRacer
 --      ["Teleporation Node"] = "", -- Construction_Mode
 --      ["Teleportation Mode"] = "", -- Construction_Mode
@@ -2267,11 +2243,12 @@
 --      ["The forgotten continent"] = "", -- Continental_supplies
 --      ["The giant umbrella from the last crate should help break the fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Great Escape"] = "", -- User_Mission_-_The_Great_Escape
---      ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01
+--      ["- The green target must survive"] = "", -- HedgeEditor
+--      ["- The green targets must survive"] = "", -- HedgeEditor
 --      ["The guardian"] = "", -- A_Classic_Fairytale:shadow
 --      ["The hardships of the war turned %s (%s) into a killing machine: %d invaders destroyed in one round!"] = "", -- Space_Invasion
+--      ["The health of your current hedgehog|is shown at the top right corner."] = "", -- Basic_Training_-_Movement
 --      ["The hedgehog with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant
---      ["The Hogies"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["The Hospital"] = "", -- 
 --      ["The Individualist"] = "", -- A_Classic_Fairytale:shadow
 --      ["Their buildings were very primitive back then, even for an uncivilised island."] = "", -- A_Classic_Fairytale:united
@@ -2289,7 +2266,6 @@
 --      ["The Mutant has super-weapons and a lot of health."] = "", -- Mutant
 --      ["The Mutant loses health quickly, but gains health by killing."] = "", -- Mutant
 --      ["The Mutant loses health quickly if he doesn't keep scoring kills."] = "", -- Mutant
-	["The Nameless One"] = "Der Namenlose",
 --      ["The Navy greets %s for managing to get in a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["The next 4 times you play the \"The last encounter\" mission you'll get 20 more hit points and a laser sight."] = "", -- A_Space_Adventure:death02
 --      ["The next crate is an utility crate."] = "", -- Basic_Training_-_Movement
@@ -2303,6 +2279,7 @@
 --      ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil
 --      ["The oppression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
 --      ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
+--      ["The other hog has died, he should have survived!"] = "", -- A_Space_Adventure:moon02
 --      ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Police"] = "", -- 
 --      ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -2327,7 +2304,7 @@
 --      ["The Showdown"] = "", -- A_Classic_Fairytale:shadow
 --      ["The Slaughter"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:first_blood
 --      ["The Society of Perfectionists greets %s (%s): No misses and %d hits in its best round."] = "", -- Space_Invasion
-	["THE SPECIALISTS"] = "DIE SPEZIALISTEN",
+--      ["The Specialists: Each hedgehog starts with its own weapon set"] = "", -- The_Specialists
 --      ["The spinning arrows above your hedgehog show|which hedgehog is selected right now."] = "", -- Basic_Training_-_Movement
 --      ["The spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
@@ -2375,7 +2352,6 @@
 --      ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["This also increases the effectiveness of Medicine."] = "", -- Continental_supplies
 --      ["This game wasn’t really exciting."] = "", -- Space_Invasion
---      ["This Hog Solo is so naive! When he returns I'll shoot him and keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This is a new personal best, congratulations!"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert02, A_Space_Adventure:fruit03
 --      ["This is a new personal best time, congratulations!"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["This is Cappy."] = "", -- Basic_Training_-_Movement
@@ -2393,6 +2369,7 @@
 	["This rain is really something..."] = "Das nenne ich mal einen Regenschauer...",
 --      ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome
 --      ["This seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01
+--      ["This %s is so naive! I'm going to shoot this fool so I can keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This was an awesome performance! But this challenge can be finished with even just one RC plane. Can you figure out how?"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["This will be fun!"] = "", -- A_Classic_Fairytale:enemy
 --      ["This will be useful when I need a new platform or if I want to rise."] = "", -- portal
@@ -2434,11 +2411,11 @@
 --      ["To begin with the training, hit the attack key!"] = "", -- Basic_Training_-_Movement
 --      ["To begin with the training, select the bazooka from the ammo menu!"] = "", -- Basic_Training_-_Bazooka
 --      ["To begin with the training, select the grenade from the ammo menu!"] = "", -- Basic_Training_-_Grenade
+--      ["To begin with the training, tap the attack button!"] = "", -- Basic_Training_-_Movement
 --      ["To finish hedgehog selection, just do anything|with him, like walking."] = "", -- Basic_Training_-_Movement
 --      ["To get over the next obstacles, keep some distance from the wall before you back jump."] = "", -- Basic_Training_-_Movement
 --      ["To get over the water, you have to do multiple|rope shots and swings."] = "", -- Basic_Training_-_Rope
 --      ["Toggle Editing Weapons and Tools: [Precise]+[2]"] = "", -- HedgeEditor
---      ["Toggle Gear Information: [Precise]+[3]"] = "", -- HedgeEditor
 --      ["Toggle Help: [Precise]+[1]"] = "", -- HedgeEditor
 --      ["Toggle Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Toggle Shield: [Long jump]"] = "", -- Space_Invasion
@@ -2448,14 +2425,14 @@
 --      ["Too bad! Then you should really leave!"] = "", -- A_Space_Adventure:fruit01
 --      ["Too slow! Try again ..."] = "", -- A_Space_Adventure:moon02
 --      ["Top-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"] = "", -- A_Classic_Fairytale:shadow
 --      ["To reach higher ground, walk to a ledge, look to the left, then do a back jump."] = "", -- Basic_Training_-_Movement
 --      ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey
 --      ["To the caves..."] = "", -- A_Classic_Fairytale:united
 --      ["Touch all waypoints as fast as you can!"] = "", -- Racer
---      ["To win the game, Hog Solo has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
+--      ["- Touch the sparkles near your base to teleport"] = "", -- CTF_Blizzard
+--      ["To win the game, %s has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
 --      ["To win the game you had to collect the 2 crates with no specific order."] = "", -- A_Space_Adventure:desert01
---      ["To win the game you have to eliminate all your enemies."] = "", -- A_Space_Adventure:death01
+--      ["To win the game you have to eliminate Professor Hogevil."] = "", -- A_Space_Adventure:death01
 --      ["To win the game you have to find the right crate."] = "", -- A_Space_Adventure:desert01
 --      ["To win the game you have to go next to Thanta."] = "", -- A_Space_Adventure:ice01
 --      ["To win the game you have to go to the surface."] = "", -- A_Space_Adventure:desert02
@@ -2463,13 +2440,10 @@
 --      ["To win the game you have to stand next to Thanta."] = "", -- A_Space_Adventure:ice01
 	["Toxic Team"] = "Giftige Gegner", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Track completed!"] = "", -- Racer, TechRacer
---      ["Trainee"] = "", -- TargetPractice
 --      ["Training"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Training complete!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Training Team"] = "", -- TargetPractice
 --      ["Traitors"] = "", -- A_Classic_Fairytale:epil
 --      ["Traitors don't get to shout around here!"] = "", -- A_Classic_Fairytale:epil
---      ["Trapped"] = "", -- Basic_Training_-_Movement
 --      ["Trapper"] = "", -- HedgeEditor
 --      ["Travel carefully as your fuel is limited"] = "", -- A_Space_Adventure:cosmos
 --      ["Travel to all the neighbor planets and collect all the pieces"] = "", -- A_Space_Adventure:cosmos
@@ -2486,7 +2460,6 @@
 --      ["Try to land softly, as you can still take fall damage!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Try to protect the chief! You won't lose if he dies, but it is advised that he survives."] = "", -- A_Classic_Fairytale:united
 --      ["Try to reach and destroy the next target quickly."] = "", -- Basic_Training_-_Rope
---      ["T_T"] = "",
 --      ["Tumbler"] = "", -- Tumbler
 --      ["Turn around: [Left Shift] + [Left]/[Right]"] = "", -- Basic_Training_-_Movement
 --      ["Turning Around"] = "", -- Basic_Training_-_Movement
@@ -2505,7 +2478,6 @@
 --      ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy
 --      ["Ukemi"] = "", -- 
 --      ["Ultra kill!"] = "", -- Mutant
---      ["Ultrasoldier"] = "", -- Big_Armory
 --      ["unC0Rr"] = "", -- 
 --      ["Under Construction"] = "", -- A_Classic_Fairytale:shadow
 --      ["Under normal circumstances we could easily defeat them but we have kindly sent most of our men to the Kingdom of Sand to help with the annual dusting of the king's palace."] = "", -- A_Space_Adventure:fruit01
@@ -2530,7 +2502,6 @@
 	["Unit"] = "Einheit",
 --      ["Unlike bazookas, grenades are not influenced by wind."] = "", -- Basic_Training_-_Grenade
 --      ["Unlimited Attacks: Attacks don't end your turn"] = "", -- User_Mission_-_Diver, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree
-	["Unlimited Attacks"] = "Unbegrenzte Angriffe",
 --      ["Unlucky Sods"] = "", -- User_Mission_-_Rope_Knock_Challenge
 	["Unstoppable!"] = "Unaufhaltbar!",
 --      ["Unsuspecting Louts"] = "", -- User_Mission_-_Rope_Knock_Challenge
@@ -2545,13 +2516,14 @@
 --      ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["User Challenge"] = "",
 --      ["!"] = "", -- User_Mission_-_Dangerous_Ducklings
+--      ["User Mission"] = "", -- HedgeEditor
 --      ["Use the attack key twice to change the flying saucer while being in air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the attack key twice to change the flying saucer while floating in mid-air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the bazooka and the flying saucer to get the freezer."] = "", -- A_Space_Adventure:ice01
 --      ["Use the flying saucer from the crate to fly to the moon."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly the other planets."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly to the other planets."] = "", -- A_Space_Adventure:cosmos
---      ["Use the parachute ([Space] while in air) to get the next crate"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Use the parachute to get the next crate."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Use the portal gun to get to the next crate, then use the new gun to get to the final destination!|"] = "", -- A_Classic_Fairytale:dragon
 --      ["Use the RC plane and destroy the all the targets."] = "", -- A_Space_Adventure:desert03
 --      ["Use the rope in order to catch the blue hedgehog"] = "", -- A_Space_Adventure:moon02
@@ -2585,7 +2557,6 @@
 --      ["Victory Condition: Collect"] = "", -- HedgeEditor
 --      ["Victory Condition: Destroy"] = "", -- HedgeEditor
 --      ["Victory for %s!"] = "", -- Capture_the_Flag
-	["Victory for the "] = "Sieg für ", -- CTF_Blizzard, Capture_the_Flag
 --      ["Violence is not the answer to your problems!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos
 --      ["Vladimir"] = "", -- 
@@ -2604,9 +2575,6 @@
 --      ["Walls left: %d"] = "", -- WxW
 --      ["Wall to wall"] = "", -- WxW
 --      ["Waluigi"] = "", -- 
---      ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Wannabe Ropers"] = "", -- Basic_Training_-_Rope
---      ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Wario"] = "", -- 
 --      ["Warming Up"] = "", -- Basic_Training_-_Grenade
 --      ["Warning: Fire cake detected"] = "", -- ClimbHome
@@ -2636,7 +2604,6 @@
 --      ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion
 --      ["Weapon specials: Some weapons have special modes (see weapon description)."] = "", -- Continental_supplies
 --      ["Weapons reset: The weapons are reset after each turn."] = "", -- WxW
-	["Weapons Reset"] = "Waffenzurücksetzung",
 --      ["We are indeed."] = "", -- A_Classic_Fairytale:backstab
 --      ["We can't defeat them!"] = "", -- A_Classic_Fairytale:shadow
 --      ["We can't hold them up much longer!"] = "", -- A_Classic_Fairytale:united
@@ -2652,9 +2619,9 @@
 --      ["We have to hurry! Are you armed?"] = "", -- A_Space_Adventure:moon01
 --      ["We have to protect the village!"] = "", -- A_Classic_Fairytale:united
 --      ["We have to unite and defeat those cylergs!"] = "", -- A_Classic_Fairytale:enemy
---      ["Welcome Hog Solo, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome home! Please take a seat"] = "", -- ClimbHome
 --      ["Welcome, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey
+--      ["Welcome, %s, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome to the Death Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
@@ -2821,16 +2788,16 @@
 --      ["You can’t open a portal on the blue surface."] = "", -- portal
 --      ["You can use the other 2 hogs to assist you."] = "", -- A_Space_Adventure:fruit02
 --      ["You can use the rope to reach new places."] = "", -- Basic_Training_-_Rope
---      ["You choose well, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You choose well, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You completed the mission in %.3f seconds."] = "", -- A_Space_Adventure:ice02
 --      ["You completed the mission in %d rounds."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03
---      ["You couldn't have come to a worse time, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You couldn't have come to a worse time, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You couldn't possibly believe that after refusing my offer I'd just let you go!"] = "", -- A_Classic_Fairytale:journey
 	["You'd almost swear the water was rising!"] = "Suyun yükseldiğine yemin edebilirdin!",
 --      ["You'd better watch your steps..."] = "", -- A_Classic_Fairytale:journey
 --      ["You defended yourself against Captain Lime."] = "", -- A_Space_Adventure:fruit02
---      ["You defended yourself against the Fruit Assassins."] = "", -- A_Space_Adventure:fruit02
---      ["You did great, Hog Solo! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
+--      ["You defended yourself against %s."] = "", -- A_Space_Adventure:fruit02
+--      ["You did great, %s! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
 --      ["You did not make it in time, try again!"] = "", -- Basic_Training_-_Rope
 --      ["You don't deserve my sacrifice!"] = "", -- A_Classic_Fairytale:queen
 --      ["You drove Professor Hogevil away."] = "", -- A_Space_Adventure:moon01
@@ -2846,12 +2813,12 @@
 --      ["You got me!"] = "", -- A_Space_Adventure:moon02
 --      ["You had %.1fs remaining on the clock (+%d points)."] = "", -- TargetPractice
 --      ["You had %.2fs remaining on the clock (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle
---      ["You had %d additional flying saucers left."] = "", -- A_Space_Adventure:ice02
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: you might want to use some mines..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: You might want to use some mines ..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01
 --      ["You have activated Switch Hedgehog!"] = "", -- Basic_Training_-_Movement
 --      ["You have beaten the challenge!"] = "", -- ClimbHome
+--      ["You have beaten the team record, congratulations!"] = "", -- Utils
 --      ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab
 --      ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united
 --      ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01
@@ -2870,7 +2837,6 @@
 --      ["You have eliminated all visible enemy hedgehogs!"] = "", -- A_Space_Adventure:fruit01
 --      ["You have eliminated Professor Hogevil."] = "", -- A_Space_Adventure:moon01
 --      ["You have eliminated the evil minions."] = "", -- A_Space_Adventure:moon01
---      ["You have eliminated the whole evil team. You're pretty tough!"] = "", -- A_Space_Adventure:moon01
 --      ["You have escaped successfully."] = "", -- A_Space_Adventure:desert02
 --      ["You have failed to complete your task, young one!"] = "", -- A_Classic_Fairytale:journey
 --      ["You have failed to save the tribe!"] = "", -- A_Classic_Fairytale:backstab
@@ -2924,6 +2890,7 @@
 --      ["You have to travel again"] = "", -- A_Space_Adventure:cosmos
 --      ["You have to try again!"] = "", -- A_Space_Adventure:cosmos
 --      ["You have triggered the secret Do-Not-Rope-to-the-Moon Defense System."] = "", -- A_Space_Adventure:cosmos
+--      ["You have unlocked the target radar!"] = "", -- TargetPractice
 --      ["You have used %d flying saucers."] = "", -- A_Space_Adventure:ice02
 --      ["You have used %d RC planes."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["You have used only 1 RC plane. Outstanding!"] = "", -- User_Mission_-_RCPlane_Challenge
@@ -2942,10 +2909,9 @@
 --      ["You'll have only 2 watermelon bombs during the game."] = "", -- A_Space_Adventure:fruit03
 --      ["You'll have only one RC plane at the start of the mission."] = "", -- A_Space_Adventure:desert03
 --      ["You'll have to eliminate Captain Lime at the end."] = "", -- A_Space_Adventure:fruit02
---      ["You'll have to eliminate the Fruit Assassins at the end."] = "", -- A_Space_Adventure:fruit02
+--      ["You'll have to eliminate %s at the end."] = "", -- A_Space_Adventure:fruit02
 --      ["You'll lose if you die or if your time is up."] = "", -- A_Space_Adventure:moon02
 --      ["You'll see what I mean!"] = "", -- A_Classic_Fairytale:enemy
---      ["You lose!"] = "", -- Basic_Training_-_Sniper_Rifle, Big_Armory, Basic_Training_-_Bazooka, TargetPractice, ClimbHome
 --      ["You lost your target, try again!"] = "", -- TargetPractice
 --      ["You may find it handy."] = "", -- A_Space_Adventure:cosmos
 --      ["You may only attack from a rope!"] = "", -- WxW
@@ -2967,8 +2933,7 @@
 --      ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice
 --      ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice
 --      ["Your ammo is limited this time."] = "", -- Basic_Training_-_Bazooka
---      ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy
---      ["Your deaths will be avenged, Natives!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Your deaths will be avenged, %s!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Your death will not be in vain, Dense Cloud!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You're a coward!"] = "", -- A_Classic_Fairytale:queen
 --      ["You're...alive!? But we saw you die!"] = "", -- A_Classic_Fairytale:backstab
@@ -2996,21 +2961,21 @@
 --      ["Your next task is to collect some crates by using the rope!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Your personal best time so far: %.3f seconds"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["Your rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["You saved %d of 8 Hapless Hogs."] = "", -- User_Mission_-_That_Sinking_Feeling
+--      ["Your rope is gone! Try again!"] = "", -- Basic_Training_-_Rope
+--      ["You saved %d of 8 hegehogs."] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen
 --      ["You see the wind strength at the bottom right corner."] = "", -- Basic_Training_-_Bazooka
+--      ["You see the wind strength at the top."] = "", -- Basic_Training_-_Bazooka
 --      ["You should have known that we don't rely on meatbags!"] = "", -- A_Classic_Fairytale:queen
 --      ["You should know this more than anyone, Leaks!"] = "", -- A_Classic_Fairytale:queen
 --      ["You speak great truth, Hannibal. Here, take a sip!"] = "", -- A_Classic_Fairytale:epil
 --      ["You've been assaulting us, we have been just defending ourselves!"] = "", -- A_Classic_Fairytale:enemy
-	["You've failed. Try again."] = "Başaramadın. Yeniden dene!",
 	["You've reached the goal!| |Time: "] = "Hedefe ulaştın!| |Süre: ",
 --      ["You will be avenged!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You will fail if you run out of ammo and there are still targets available."] = "", -- A_Space_Adventure:desert03
 --      ["You will gain some extra ammo from the crates the next time you play the \"Getting to the device\" mission."] = "", -- A_Space_Adventure:fruit03
 --      ["You will play every 3 turns."] = "", -- A_Space_Adventure:fruit01
 --      ["- You will recieve 2-4 weapons on each kill! (Even on own hogs)"] = "", -- Continental_supplies
---      ["You win!"] = "", -- Big_Armory
 --      ["You won't believe what happened to me!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Yuck! I bet they'll keep worshipping her even after I save the village!"] = "", -- A_Classic_Fairytale:family
 --      ["Yumme Gunpowder"] = "", -- 
@@ -3018,6 +2983,7 @@
 --      ["Zombie"] = "", -- 
 --      ["Zombi"] = "", -- portal
 	["'Zooka Team"] = "Roketatar Takımı",
---      ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
+--      ["Zoom: [Pinch] with 2 fingers"] = "", -- Basic_Training_-_Movement
+--      ["Zoom: [Rotate mouse wheel]"] = "", -- Basic_Training_-_Movement
 --      ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen
 }
--- a/share/hedgewars/Data/Locale/uk.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/uk.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -6,8 +6,8 @@
 --      ["15+%d damage, %d invulnerable left"] = "", -- Continental_supplies
 --      ["1-5, Precise + 1-4: Choose structure type"] = "", -- Construction_Mode
 --      ["+1 barrel!"] = "+1 бочка!", -- Tumbler
+--      ["%.1fs"] = "%.1fс", -- Racer, TechRacer
 --      ["%.1f seconds were remaining."] = "", -- Basic_Training_-_Bazooka
---      ["%.1fs"] = "%.1fс", -- Racer, TechRacer
 --      ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["+1 mine!"] = "+1 міна!", -- Tumbler
 --      ["+1 point"] = "+1 очко", -- Mutant
@@ -25,7 +25,6 @@
 --      ["Above-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Accuracy Bonus! +15 points"] = "Бонус Точності! +15 очок", -- Space_Invasion
 --      ["Accuracy bonus: +%d points"] = "Бонус точності: +%d очок", -- Basic_Training_-_Sniper_Rifle
---      ["Ace"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge
 --      ["Achievement gotten: %s"] = "Досягнення: %s", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_That_Sinking_Feeling, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, Basic_Training_-_Rope, Tumbler
         ["A Classic Fairytale"] = "Класична казка", -- A_Classic_Fairytale:first_blood
 --      ["A crate critical to this mission has been destroyed."] = "", -- SimpleMission
@@ -45,7 +44,6 @@
 --      ["Again with the 'cannibals' thing!"] = "", -- A_Classic_Fairytale:enemy
 --      ["A Hedgewars minigame"] = "", -- Capture_the_Flag
 --      ["A Hedgewars mini-game"] = "", -- Racer, Space_Invasion, TechRacer, Tumbler
-        ["a Hedgewars mini-game"] = "Міні-гра Hedgewars", -- Space_Invasion, The_Specialists
 --      ["A Hedgewars tag game"] = "", -- Mutant
 --      ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome
 --      ["Aim at the ceiling and hold [Attack] pressed until the rope attaches."] = "", -- Basic_Training_-_Rope
@@ -140,13 +138,14 @@
 --      ["As you've seen, the dropped grenade roughly fell into your flying direction."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Athlete"] = "", -- Battalion
 --      ["Attack: Activate"] = "", -- Racer
---      ["Attack Captain Lime before he attacks back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack Captain Lime before he attacks back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack From Rope: %s"] = "", -- WxW
 --      ["Attack From Rope: You may only attack from a rope."] = "", -- WxW
 --      ["Attack rule: %s"] = "", -- WxW
 --      ["Attack: Select this continent"] = "", -- Continental_supplies
 --      ["Attack: [Space]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
---      ["Attack the assassins before they attack back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack: Tap the [Bomb]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
+--      ["Attack the assassins before they attack back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack: Throw ball"] = "", -- Knockball
 --      ["At the end of the game your health was %d."] = "", -- A_Space_Adventure:ice01
 --      ["At the start of the game each enemy hog has only the weapon that he is named after."] = "", -- A_Space_Adventure:death02
@@ -154,16 +153,18 @@
 --      ["Available weapon specials:"] = "", -- Continental_supplies
 --      ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion
---      ["Avoid the mines!"] = "", -- Basic_Training_-_Rope
 --      ["Axes"] = "", -- Bazooka_Battlefield
 --      ["Aye! Fellow! Let me exit this chamber of doom!"] = "", -- A_Classic_Fairytale:epil
 --      ["Back Breaker"] = "", -- A_Classic_Fairytale:backstab
 --      ["Back in the village, after telling the villagers about the threat..."] = "", -- A_Classic_Fairytale:united
 --      ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil
 --      ["Back Jump: [Backspace] ×2"] = "", -- Basic_Training_-_Movement
+--      ["Back Jump: Double-tap the [Curvy Arrow]"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (1/2)"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (2/2)"] = "", -- Basic_Training_-_Movement
 --      ["Backstab"] = "", -- A_Classic_Fairytale:backstab
+--      ["Backwards jump: Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Backwards jump: Tap the [Curvy Arrow] twice"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Bacon"] = "", -- 
 --      ["Bad Guy"] = "Поганий хлопець", -- User_Mission_-_The_Great_Escape
 --      ["Badmad"] = "", -- portal
@@ -196,7 +197,6 @@
 --      ["Bazooka Battlefield"] = "", -- Bazooka_Battlefield
 --      ["Bazooka Master"] = "", -- Basic_Training_-_Bazooka
 --      ["Bazookas are influenced by wind."] = "", -- Basic_Training_-_Bazooka
---      ["Bazooka Team"] = "", -- Basic_Training_-_Bazooka
         ["Bazooka Training"] = "Тренування з базукою",
 --      ["Bearded Beast"] = "", -- 
 --      ["Be careful, the future of Hogera is in your hands!"] = "", -- A_Space_Adventure:cosmos
@@ -230,7 +230,6 @@
 --      ["Bloodpie"] = "", -- A_Classic_Fairytale:backstab
 --      ["Bloodrocutor"] = "", -- A_Classic_Fairytale:shadow
 --      ["Bloodsucker"] = "", -- A_Classic_Fairytale:shadow
-        ["Bloody Rookies"] = "Криваві Салаги", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 --      ["Blue"] = "", -- 
 --      ["Blue Team"] = "Блакитна команда", -- User_Mission_-_Dangerous_Ducklings
 --      ["Bob"] = "", -- A_Space_Adventure:cosmos
@@ -313,7 +312,9 @@
 --      ["Challenge objectives"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit03, A_Space_Adventure:moon02
 --      ["Challenge over!"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa, ClimbHome
+--      ["Change bounciness: Tap [B]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Content: [Left], [Right]"] = "", -- HedgeEditor
+--      ["Change detonation timer: Tap the [Clock]"] = "", -- Basic_Training_-_Grenade, A_Classic_Fairytale:shadow
 --      ["Change direction: [Left]/[Right]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Change Health: [Left], [Right]"] = "", -- HedgeEditor
@@ -333,6 +334,8 @@
 --      ["Chicken"] = "", -- 
 --      ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01
 --      ["Chikorita"] = "", -- 
+--      ["Choose location: Left click"] = "", -- A_Classic_Fairytale:shadow
+--      ["Choose location: Tap the [Target] button, then tap on the spot you want to choose"] = "", -- A_Classic_Fairytale:shadow
 --      ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Choose your continent wisely, as your decision will be permanent."] = "", -- Continental_supplies
 --      ["Choose your side! If you want to join the strange man, walk up to him.|Otherwise, walk away from him. If you decide to att...nevermind..."] = "", -- A_Classic_Fairytale:shadow
@@ -341,7 +344,6 @@
 --      ["Cleaver"] = "", -- Construction_Mode
 --      ["Cleaver Placement Mode"] = "", -- Construction_Mode
 --      ["CLEAVER PLACEMENT MODE"] = "", -- HedgeEditor
---      ["Climber"] = "", -- ClimbHome
 --      ["Climb Home"] = "", -- ClimbHome
 --      ["Closing in"] = "", -- A_Classic_Fairytale:queen
 --      ["Clown"] = "", -- HedgeEditor
@@ -351,11 +353,13 @@
 --      ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb
 --      ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey
 --      ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey
+--      ["- Collect all the blue crates"] = "", -- HedgeEditor
 --      ["Collect all the crates, but remember, our time in this life is limited!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect or destroy all the health crates."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Collect or destroy the final crate to finish the training."] = "", -- Basic_Training_-_Flying_Saucer
+--      ["- Collect the blue crate"] = "", -- HedgeEditor
 --      ["Collect the crate and attack!"] = "", -- WxW
---      ["Collect the crate on the right.|Hint: Select the rope, [Up] or [Down] to aim, [Space] to fire, directional keys to move.|Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Collect the crate on the right."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the crates within the time limit!|If you fail, you'll have to try again."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the first crate to begin!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Collect the freezer and get the device part from Thanta."] = "", -- A_Space_Adventure:ice01
@@ -378,7 +382,6 @@
 --      ["Configuration accepted."] = "Привітання прийняті.", -- WxW
 --      ["Configuration phase"] = "Привітальна фраза", -- WxW
 --      ["Congrats! You won!"] = "Вітання! Ви перемогли!", -- A_Space_Adventure:moon01
---      ["Congratulations"] = "Вітання", -- Basic_Training_-_Rope
 --      ["Congratulations, you acquired the device part!"] = "", -- A_Space_Adventure:ice01
 --      ["Congratulations, you are the best!"] = "", -- A_Space_Adventure:desert03
 --      ["Congratulations, you are the fastest!"] = "", -- A_Space_Adventure:moon02
@@ -392,6 +395,7 @@
 --      ["Congratulations! You win."] = "", -- Big_Armory
 --      ["Congratulations, you won!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice02
         ["Congratulations!"] = "Вітаємо!",
+--      ["Congratulations"] = "Вітання", -- Basic_Training_-_Rope
 --      ["Conquering the galaxy"] = "", -- A_Space_Adventure:cosmos
 --      ["CONSTRUCTION MODE"] = "", -- Construction_Mode
 --      ["Construction Mode tool"] = "", -- Construction_Mode
@@ -409,8 +413,8 @@
 --      ["Corporationals"] = "", -- A_Classic_Fairytale:queen
 --      ["Corpsemonger"] = "", -- A_Classic_Fairytale:shadow
 --      ["Corpse Thrower"] = "", -- A_Classic_Fairytale:epil
+--      ["Cost: %d"] = "Ціна: %d", -- Construction_Mode
 --      ["Cost"] = "Ціна", -- Construction_Mode
---      ["Cost: %d"] = "Ціна: %d", -- Construction_Mode
 --      ["Cotton Needer"] = "", -- Mutant
 --      ["Count Hogula"] = "", -- 
 --      ["Coward"] = "Боягуз", -- A_Classic_Fairytale:queen
@@ -423,7 +427,6 @@
 --      ["Crates left: %d"] = "Залишилось ящиків: %d", -- User_Mission_-_RCPlane_Challenge
         ["Crates Left:"] = "Залишилось ящиків:", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates per turn: %d"] = "", -- WxW
---      ["crate(s)"] = "", -- SpeedShoppa
 --      ["Crazy Gravity: Gravity randomly changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity
 --      ["Crazy Runner"] = "", -- A_Space_Adventure:moon02
 --      ["Cricket Time"] = "", -- Continental_supplies
@@ -444,9 +447,9 @@
 --      ["+%d Ammo"] = "", -- Space_Invasion
         ["Dangerous Ducklings"] = "Небезпечні Каченята",
 --      ["Dark Strawberry"] = "", -- A_Space_Adventure:fruit02
---      ["+%d"] = "+%d", -- Battalion
 --      ["%d crate(s) remaining"] = "", -- SpeedShoppa
 --      ["%d damage was dealt in this game."] = "", -- Mutant
+--      ["+%d"] = "+%d", -- Battalion
 --      ["%d / %d"] = "%d / %d", -- Battalion
 --      ["%d | %d"] = "%d | %d", -- Mutant
 --      ["%d/%d"] = "%d/%d", -- SpeedShoppa
@@ -456,11 +459,10 @@
 --      ["Deals 15 damage to all enemies in the circle."] = "", -- Continental_supplies
 --      ["Deer"] = "", -- 
 --      ["Defeat all enemies!"] = "", -- portal
+--      ["Defeat!"] = "", -- HedgeEditor
 --      ["Defeat Professor Hogevil!"] = "", -- A_Space_Adventure:death01
---      ["Defeat the cannibals"] = "", -- A_Classic_Fairytale:backstab
---      ["Defeat the cannibals!|"] = "", -- A_Classic_Fairytale:united
+--      ["Defeat the cannibals!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cannibals!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Defeat the cannibals!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cyborgs!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen
 --      ["Delete Waypoint"] = "", -- HedgeEditor
@@ -481,11 +483,11 @@
 --      ["Destroyer of planes"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Destroy him, Leaks A Lot! He is responsible for the deaths of many of us!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Destroy invaders and collect bonuses to score points."] = "Знищіть загарбників і зберіть бонуси, щоб набрати очки.", -- Space_Invasion
+--      ["- Destroy the enemy"] = "", -- HedgeEditor
+--      ["- Destroy the red target"] = "", -- HedgeEditor
+--      ["- Destroy the red targets"] = "", -- HedgeEditor
 --      ["Destroy the targets!"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
---      ["Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
---      ["Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"] = "", -- A_Classic_Fairytale:first_blood
 --      ["+%d flamer fuel!"] = "", -- Tumbler
---      ["%d Hapless Hogs left"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["+%d health"] = "", -- Mutant
 --      ["%d-Hit Combo! +%d points!"] = "", -- Space_Invasion
 --      ["Did anyone follow you?"] = "", -- A_Classic_Fairytale:united
@@ -497,16 +499,15 @@
 --      ["Did you see him coming?"] = "", -- A_Classic_Fairytale:shadow
 --      ["Did you warn the village?"] = "", -- A_Classic_Fairytale:shadow
 --      ["Die, die, die!"] = "Вмри, вмри, вмри!", -- A_Classic_Fairytale:dragon
---      ["Difficulty: "] = "Складність: ", -- Continental_supplies
 --      ["Difficulty: Easy"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Difficulty: Hard"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Difficulty: "] = "Складність: ", -- Continental_supplies
 --      ["Dimitry"] = "", -- 
 --      ["%d invaders have been destroyed in this game."] = "", -- Space_Invasion
 --      ["Disabled"] = "", -- WxW
 --      ["Disguise as a Rockhopper Penguin"] = "", -- Continental_supplies
 --      ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies
 --      ["Displacer"] = "", -- 
---      ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Diver"] = "", -- User_Mission_-_Diver
 --      ["%d ms"] = "", -- HedgeEditor
 --      ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen
@@ -523,8 +524,8 @@
 --      ["Don't hit yourself!"] = "", -- Basic_Training_-_Bazooka
 --      ["Don't touch the flames!"] = "", -- ClimbHome
 --      ["Don't you dare harming our tribe!"] = "", -- A_Classic_Fairytale:queen
+        ["Double Kill!"] = "Подвійне Вбивство!",
 --      ["Double kill!"] = "Подвійне вбивство!", -- Mutant
-        ["Double Kill!"] = "Подвійне Вбивство!",
 --      ["Do you have any idea how bad an exploding arrow hurts?"] = "", -- A_Classic_Fairytale:queen
 --      ["Do you have any idea how valuable grass is?"] = "", -- A_Classic_Fairytale:enemy
 --      ["Do you have any idea what it's like in the village for a woman?"] = "", -- A_Classic_Fairytale:queen
@@ -593,10 +594,8 @@
 --      ["Elderbot"] = "", -- A_Classic_Fairytale:family
 --      ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape
         ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Знищіть всі цілі до закінчення часу.|У вас безмежні боєприпаси.", --Bazooka, Shotgun, SniperRifle
---      ["Eliminate the Blue Team before the time runs out."] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Eliminate the enemy before the time runs out."] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree
         ["Eliminate the enemy hogs to win."] = "Знешкодьте ворожих їжаків щоб перемогти.",
-        ["Eliminate the enemy specialists."] = "Знешкодьте ворожих спеціалістів.",
 --      ["Eliminate the enemy."] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh
 --      ["Eliminate Unit 3378."] = "", -- User_Mission_-_Teamwork
 --      ["Eliminate WatchBot 4000."] = "", -- User_Mission_-_Teamwork_2
@@ -621,13 +620,14 @@
 --      ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab
 --      ["Except me, of course! I just saved a whole planet!"] = "", -- A_Space_Adventure:final
 --      ["Experienced beginner"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Explore the tunnel with the other hedgehogs and search for the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Explore the tunnel with the other hedgehogs and search for the device."] = "", -- A_Space_Adventure:fruit02
 --      ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02
 --      ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey
 --      ["Fair Wind"] = "", -- 
 --      ["Fall Damage"] = "", -- Basic_Training_-_Movement
 --      ["Fallen Angel"] = "", -- Tentacle_Terror
 --      ["Family Reunion"] = "", -- A_Classic_Fairytale:family
+--      ["Fastest escape: %d turns"] = "", -- A_Space_Adventure:desert02
 --      ["Fastest lap: %.3fs by %s"] = "", -- TrophyRace
         ["Fastest lap: "] = "Найшвидша партія: ",
         ["Feeble Resistance"] = "Жалюгідні Повстанці",
@@ -647,11 +647,12 @@
 --      ["Final result"] = "", -- Mutant
 --      ["Final Targets"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
 --      ["Final team scores:"] = "", -- Space_Invasion
+--      ["Find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Find a way to detonate all the explosives and stay alive!"] = "", -- A_Space_Adventure:final
 --      ["Find your tribe!|Cross the lake!"] = "", -- A_Classic_Fairytale:dragon
 --      ["Finish this challenge as fast as possible to earn bonus points."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Finish waypoint placement"] = "", -- Racer
---      ["Finish your training|Hint: Animations can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Finish your training."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Finite Ropes"] = "", -- Basic_Training_-_Rope
 --      ["Fire a rocket with napalm."] = "", -- Continental_supplies
 --      ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler
@@ -679,6 +680,7 @@
 --      ["Flying Saucer Training"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Fly into space to fight off the invaders with barrels!"] = "", -- Space_Invasion
 --      ["Fly to the meteorite and detonate the explosives"] = "", -- A_Space_Adventure:cosmos
+--      ["Follow the path and destroy the next target."] = "", -- Basic_Training_-_Rope
 --      ["Forgetfulness: You will lose all your weapons each turn."] = "", -- Continental_supplies
 --      ["For the next crate, you have to do back jumps."] = "", -- Basic_Training_-_Movement
 --      ["Four Eyes"] = "", -- 
@@ -698,9 +700,7 @@
 --      ["“g=150”, where 150 is 150% of normal gravity."] = "", -- Gravity
 --      ["“g=50, g2=150, period=4000” for gravity changing|from 50 to 150 and back with period of 4000 ms."] = "", -- Gravity
 --      ["Galaxy Guardians"] = "Охоронці Галактики", -- Big_Armory
-        ["Game Modifiers: "] = "Модифікатори Гри: ",
 --      ["Game over!"] = "Кінець гри!", -- Space_Invasion
-        ["GAME OVER!"] = "КІНЕЦЬ ГРИ!",
         ["Game Started!"] = "Гра почалась!",
         ["Game? Was this a game to you?!"] = "Гра? Це для тебе була лише гра?!", -- A_Classic_Fairytale:enemy
 --      ["Gangsters"] = "Гангстери", -- 
@@ -709,8 +709,6 @@
 --      ["Gasp! A smuggler!"] = "", -- A_Space_Adventure:desert01
 --      ["Gasp!"] = "", -- A_Space_Adventure:desert01
 --      ["Gathering fruits all day long."] = "", -- A_Classic_Fairytale:queen
---      ["Gear information hidden"] = "", -- HedgeEditor
---      ["Gear information shown"] = "", -- HedgeEditor
 --      ["Gear Placement Tool"] = "", -- HedgeEditor
 --      ["General information"] = "", -- Continental_supplies
 --      ["General information:"] = "", -- Continental_supplies
@@ -720,7 +718,7 @@
 --      ["Get Dense Cloud out of the pit!"] = "", -- A_Classic_Fairytale:journey
 --      ["Get him, Spike!"] = "", -- A_Space_Adventure:desert01
         ["Get on over there and take him out!"] = "Залізь туди і прикінчи його!",
---      ["Get on the head of the mole"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Get on the head of the mole."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Get past the flower."] = "", -- A_Classic_Fairytale:journey
 --      ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01
 --      ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood
@@ -758,7 +756,6 @@
         ["GO! GO! GO!"] = "ДАВАЙ! ДАВАЙ! РУХАЙСЯ!",
         ["Good birdy......"] = "Гарна пташка......",
 --      ["Good bye!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Good Dude"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Good idea, they'll never find us there!"] = "", -- A_Classic_Fairytale:united
 --      ["Good job!"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Good job! Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -769,7 +766,7 @@
         ["Good so far!"] = "Покищо добре!",
         ["Good to go!"] = "Так тримати!",
 --      ["Good! You now control Cappy."] = "", -- Basic_Training_-_Movement
-        ["Go on top of the flower"] = "Йди на верхівку квітки", -- A_Classic_Fairytale:first_blood
+--      ["Go on top of the flower."] = "", -- A_Classic_Fairytale:first_blood
         ["Go, quick!"] = "Йди, швидше!", -- A_Classic_Fairytale:backstab
 --      ["Gorkij"] = "", -- A_Classic_Fairytale:journey
 --      ["Go surf!"] = "", -- WxW
@@ -792,7 +789,6 @@
 --      ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow
 --      ["Green"] = "", -- 
 --      ["Green Bananas"] = "", -- A_Space_Adventure:fruit01
---      ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Green double rings also give you a new flying saucer."] = "", -- A_Space_Adventure:ice02
 --      ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01
 --      ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01
@@ -802,11 +798,8 @@
 --      ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Greetings from the Navy, %s (%s), for being a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["Greetings, %s!"] = "", -- A_Classic_Fairytale:dragon
---      ["Greg"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
---      ["Grenade Group"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard
 --      ["Grenades explode after 1 to 5 seconds (you decide)."] = "", -- Basic_Training_-_Grenade
 --      ["Grenades with high bounciness bounce a lot and behave chaotic."] = "", -- Basic_Training_-_Grenade
---      ["Grenade Team"] = "", -- Basic_Training_-_Grenade
 --      ["Grenade Training"] = "", -- Basic_Training_-_Grenade
 --      ["Grenadiers"] = "", -- Basic_Training_-_Grenade
 --      ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor
@@ -847,7 +840,6 @@
 --      ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion
 --      ["Health Modification Mode"] = "", -- HedgeEditor
 --      ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor
---      ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
 --      ["Heavenly Defense"] = "", -- Tentacle_Terror
 --      ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united
         ["Heavy"] = "В'ялий",
@@ -860,6 +852,7 @@
 --      ["Hedgehog Projectile"] = "", -- Continental_supplies
 --      ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies
 --      ["Hedgehogs can not be deleted."] = "", -- HedgeEditor
+--      ["Hedgehogs left: %d"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Hedgehogs will be revived after their death."] = "", -- Mutant
 --      ["Hedgehogs will start in the first waypoint."] = "", -- Racer
 --      ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab
@@ -875,7 +868,6 @@
 --      ["Help Enabled"] = "", -- HedgeEditor
 --      ["Helpers: Each team starts with %d helper points"] = "", -- Battalion
 --      ["Helpers: Hogs will get 1 out of 2 helpers randomly each turn"] = "", -- Battalion
---      ["Help Hog Solo to find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Help me, Leaks!"] = "", -- A_Classic_Fairytale:journey
         ["Help me, please!!!"] = "Допоможіть мені, будь ласка!!!", -- A_Classic_Fairytale:journey
         ["Help me, please!"] = "Допоможіть мені, будь ласка!", -- A_Classic_Fairytale:journey
@@ -890,20 +882,20 @@
 --      ["Here you will find the current mission instructions."] = "", -- Basic_Training_-_Movement
 --      ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Heroic Wind"] = "", -- Continental_supplies
-        ["Hero Team"] = "Команда героїв", -- User_Mission_-_The_Great_Escape
         ["He's so brave..."] = "Він такий сміливий...", -- A_Classic_Fairytale:first_blood
 --      ["He was the lab assistant of Dr. Goodhogan, the inventor of the anti-gravity device."] = "", -- A_Space_Adventure:moon02
 --      ["He won't be selling us out anymore!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey, don't forget us! We still need to climb up!"] = "", -- A_Classic_Fairytale:family
         ["Hey, guys!"] = "Гей, хлопці!", -- A_Classic_Fairytale:backstab
         ["Hey guys!"] = "Гей хлопці!", -- A_Classic_Fairytale:united
---      ["Hey, Hog Solo! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey! I was supposed to collect it!"] = "", -- A_Space_Adventure:fruit02
+--      ["Hey, %s! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey, %s! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hey! This is cheating!"] = "Ей! Так не чесно!", -- A_Classic_Fairytale:journey
 --      ["Hidden"] = "", -- portal
 --      ["High Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["High Jump: [Backspace]"] = "", -- Basic_Training_-_Movement
+--      ["High Jump: Tap the [Curvy Arrow] shortly"] = "", -- Basic_Training_-_Movement
 --      ["--- Highland ---"] = "", -- Battalion
 --      ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander
 --      ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion
@@ -914,20 +906,24 @@
 --      ["Hill Guard"] = "", -- Bazooka_Battlefield
 --      ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01
 --      ["--- Hint ---"] = "", -- Battalion
---      ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
 --      ["Hint: Drilling holes should solve everything."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: Hold down [M] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: If this mission panel disappears, you can|see it again by hitting the Pause or Quit key."] = "", -- Basic_Training_-_Movement
 --      ["Hint: It might be a good idea to place a girder before starting to drill. Just saying."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: It might be easier if you vary the angle only slightly."] = "", -- Basic_Training_-_Bazooka
+--      ["Hint: Just select the parachute, it opens automatically when you fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion
 --      ["Hint: Launch the bazooka horizontally at full power."] = "", -- Basic_Training_-_Bazooka
---      ["Hint: Press [Esc] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Pause the game to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Select the blow torch, aim and press [Fire]. Press [Fire] again to stop."] = "", -- A_Classic_Fairytale:journey
 --      ["Hint: Select the low gravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey
+--      ["Hint: Select the rope, [Up] or [Down] to aim, [Attack] to fire, directional keys to move."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Select the Shoryuken and hit [Attack].|P.S.: You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: %s needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family
 --      ["Hint: The rope only bends around objects.|When it doesn't hit anything, it's always straight."] = "", -- Basic_Training_-_Rope
 --      ["Hint: To jump higher, wait a bit before you hit “High Jump” a second time."] = "", -- Basic_Training_-_Movement
+--      ["Hint: To place a girder, select it,|then use [Left] and [Right] to select angle and length,|then choose a location for the girder."] = "", -- A_Classic_Fairytale:shadow
 --      ["Hint: Use the quit key to see the team’s continent."] = "", -- Continental_supplies
 --      ["Hint: When you shorten the rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope
 --      ["Hint: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey
@@ -961,24 +957,11 @@
 --      ["Hogminator"] = "", -- A_Classic_Fairytale:family
 --      ["Hog nueve"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog octo"] = "", -- A_Space_Adventure:fruit03
---      ["Hogonauts"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Hog onze"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog Saturn"] = "", -- A_Space_Adventure:fruit03
 --      ["Hogs in sight!"] = "", -- Continental_supplies
 --      ["Hog Solo and GB"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hog Solo"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01, A_Space_Adventure:moon02
---      ["Hog Solo couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo escaped successfully!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo has to reach the last crates"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo has to refuel his saucer."] = "", -- A_Space_Adventure:moon01
---      ["Hog Solo lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
---      ["Hog Solo wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["- Hogs will be revived"] = "", -- Capture_the_Flag
 --      ["- Hogs will drop the flag when killed"] = "", -- Capture_the_Flag
 --      ["Hog two"] = "", -- A_Space_Adventure:fruit03
@@ -988,12 +971,10 @@
 --      ["Homing Bee"] = "", -- Construction_Mode
 --      ["Honda"] = "", -- 
 --      ["Honest Lee"] = "", -- A_Classic_Fairytale:enemy
---      ["Hook"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
 --      ["Hooks"] = "", -- 
 --      ["Hooray! I actually did it! Hogera is safe!"] = "", -- A_Space_Adventure:final
 --      ["Hooray! I've found it, now I have to get back to Captain Lime!"] = "", -- A_Space_Adventure:fruit02
 --      ["Hooray! You are a champion!"] = "", -- A_Space_Adventure:ice02
-        ["Hooray!"] = "Урааа!",
 --      ["Hopeless case"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Hop on top of the next flower and advance to the left coast."] = "", -- A_Classic_Fairytale:journey
 --      ["Horns"] = "", -- 
@@ -1006,7 +987,7 @@
 --      ["However, if you fail to do so, she dies a most violent death, just like your friend! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, if you fail to do so, she dies a most violent death! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, my mates don't agree with me on letting you go..."] = "", -- A_Classic_Fairytale:dragon
---      ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
+--      ["However, the army of %s is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
 --      ["How to Rope"] = "", -- Basic_Training_-_Rope
 --      ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen
 --      ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen
@@ -1026,7 +1007,6 @@
 --      ["I can't believe what I'm hearing!"] = "", -- A_Classic_Fairytale:backstab
 --      ["I can't let you go further because …"] = "", -- A_Classic_Fairytale:queen
 --      ["I can't wait any more, I have to save myself!"] = "", -- A_Classic_Fairytale:shadow
---      ["Ice"] = "", -- Basic_Training_-_Movement
 --      ["Ice Jake"] = "", -- A_Space_Adventure:ice01
 --      ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family
 --      ["Icy Girder: [3]"] = "", -- HedgeEditor
@@ -1084,7 +1064,6 @@
 --      ["I just found out that they have captured your princess!"] = "", -- A_Classic_Fairytale:family
 --      ["I just want the strange device you found!"] = "", -- A_Space_Adventure:ice01
 --      ["I just wonder where Ramon and Spiky disappeared..."] = "", -- A_Classic_Fairytale:journey
---      ["Ikeda"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["I know and I'm terribly sorry!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know, my hero!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know that your resources are low due to the battle but I'll send two of my best hogs to assist you."] = "", -- A_Space_Adventure:fruit02
@@ -1112,6 +1091,7 @@
 --      ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen
 --      ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united
 --      ["IMPORTANT: To see the mission panel again, hold the mission panel key."] = "", -- Basic_Training_-_Movement
+--      ["IMPORTANT: To see the mission panel again, pause the game."] = "", -- Basic_Training_-_Movement
 --      ["Impressive...you are still dry as the corpse of a hawk after a week in the desert..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["%i ms"] = "", -- Gravity
 --      ["I'm so glad this is finally over!"] = "", -- A_Space_Adventure:final
@@ -1236,8 +1216,8 @@
 --      ["Jimmy"] = "", -- 
 --      ["Jingo"] = "", -- 
 --      ["Joe"] = "", -- A_Space_Adventure:moon01
+--      ["John Snow"] = "Джон Сноу", -- A_Space_Adventure:ice01
 --      ["John"] = "Джон", -- A_Classic_Fairytale:journey
---      ["John Snow"] = "Джон Сноу", -- A_Space_Adventure:ice01
 --      ["Jolly Roger"] = "", -- 
 --      ["Jones"] = "", -- 
 --      ["Judas"] = "", -- A_Classic_Fairytale:backstab
@@ -1268,10 +1248,9 @@
 --      ["Kill The Leader"] = "", -- WxW
 --      ["Kill The Leader: You must also hit the team with the most health."] = "", -- WxW
 --      ["Kill the traitor, %s, or spare his life!"] = "", -- A_Classic_Fairytale:backstab
+--      ["--- King Mode ---"] = "", -- Battalion
 --      ["--- King ---"] = "--- Король ---", -- Battalion
 --      ["King"] = "Король", -- Battalion
---      ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing
---      ["--- King Mode ---"] = "", -- Battalion
 --      ["Knight"] = "Лицар", -- Battalion
 --      ["Knives"] = "", -- 
 --      ["Knockball"] = "", -- Knockball
@@ -1289,7 +1268,7 @@
 --      ["Launch some bazookas to destroy the targets!"] = "", -- Basic_Training_-_Bazooka
 --      ["Leaderbot"] = "", -- A_Classic_Fairytale:queen
         ["Leader"] = "Лідер", -- A_Classic_Fairytale:enemy
---      ["Lead the Green Bananas to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
+--      ["Lead your allies to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
 --      ["Leaks A Lot"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Leaks A Lot, depressed for killing his loved one, failed to save the village..."] = "", -- A_Classic_Fairytale:journey
 --      ["Leaks A Lot gave his life for his tribe! He should have survived!"] = "", -- A_Classic_Fairytale:first_blood
@@ -1304,7 +1283,6 @@
 --      ["Left/right: Choose crate contents"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode
---      ["Left Tong"] = "", -- Bazooka_Battlefield
 --      ["Legs"] = "", -- 
 --      ["Less tools, more fun"] = "", -- Battalion
 --      ["Lestat"] = "", -- portal
@@ -1333,18 +1311,19 @@
         ["Lively Lifeguard"] = "Жвавий Рятівник",
 --      ["Lonely Cries"] = "", -- Continental_supplies
 --      ["Lonely Cries: [Rise the water if no hog is in the circle and deal 6 damage to all enemy hogs.]"] = "", -- Continental_supplies
---      ["Lonely Hog"] = "", -- ClimbHome
 --      ["Long Jump: [Enter]"] = "", -- Basic_Training_-_Movement
+--      ["Long Jump: Tap the [Curvy Arrow] button for long"] = "", -- Basic_Training_-_Movement, A_Classic_Fairytale:first_blood
 --      ["Long Live The Queen"] = "", -- A_Classic_Fairytale:queen
 --      ["Look around: [Mouse movement]"] = "", -- Basic_Training_-_Movement
+--      ["Look around: [Tap or swipe on the screen]"] = "", -- Basic_Training_-_Movement
 --      ["Look, boss! There is the target!"] = "", -- A_Space_Adventure:moon01
 --      ["Look, I had no choice!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! There's more of them!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! We're surrounded by cannibals!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Looks like the whole world is falling apart!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Look to the left and do a backwards jump towards the mushroom."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Loon"] = "", -- The_Specialists
 --      ["Loopy"] = "", -- 
---      ["Lord Evil"] = "", -- Tentacle_Terror
 --      ["Losing Condition: Destroy"] = "", -- HedgeEditor
 --      ["Low Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander
@@ -1364,7 +1343,6 @@
 --      ["Mario"] = "", -- 
 --      ["Mark gears for win/lose conditions"] = "", -- HedgeEditor
 --      ["Mark/unmark gear: [Left Click]"] = "", -- HedgeEditor
---      ["Mark"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
 --      ["- Massive weapon bonus on first turn"] = "", -- Continental_supplies
 --      ["Max Citrus"] = "", -- A_Space_Adventure:fruit01
 --      ["Maybe you should try an easier map next time."] = "", -- Racer
@@ -1379,7 +1357,6 @@
 --      ["Mega kill!"] = "", -- Mutant
 --      ["Meiwes"] = "", -- A_Classic_Fairytale:backstab
 --      ["mikade"] = "", -- 
---      ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer
 --      ["Mindy"] = "", -- A_Classic_Fairytale:united
         ["Mine Deployer"] = "Мінер",
 --      ["Mine Placement Mode"] = "", -- Construction_Mode
@@ -1398,12 +1375,12 @@
 --      ["Minion"] = "", -- A_Space_Adventure:moon01
 --      ["Minions"] = "", -- A_Space_Adventure:moon01
 --      ["Mission failed!"] = "", -- Big_Armory
-        ["MISSION FAILED"] = "МІСІЮ ПРОВАЛЕНО", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Mission failure in %d s"] = "", -- Big_Armory
+--      ["Mission"] = "", -- HedgeEditor
 --      ["Mission lost!"] = "", -- Basic_Training_-_Grenade
 --      ["Mission Panel"] = "", -- Basic_Training_-_Movement
 --      ["Mission panel: [M]"] = "", -- Basic_Training_-_Movement
-        ["MISSION SUCCESSFUL"] = "МІСІЮ ВИКОНАНО", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+--      ["Mission succeeded!"] = "", -- portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, SimpleMission, HedgeEditor
 --      ["Mission won!"] = "", -- Basic_Training_-_Grenade
 --      ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02
 --      ["Mixed %d"] = "", -- WxW
@@ -1419,7 +1396,6 @@
 --      ["Monster kill!"] = "", -- Mutant
 --      ["Monsters"] = "", -- 
 --      ["Mooney"] = "", -- 
---      ["More Natives"] = "", -- A_Classic_Fairytale:epil
 --      ["Morris"] = "", -- 
 --      ["Most mines are not active."] = "", -- A_Space_Adventure:desert02
 --      ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01
@@ -1439,13 +1415,11 @@
 --      ["Nade Boy"] = "", -- Basic_Training_-_Grenade
 --      ["Nah, probably everyone was just stupid."] = "", -- A_Space_Adventure:final
 --      ["Name"] = "", -- A_Classic_Fairytale:queen
-        ["Nameless Heroes"] = "Безіменні Герої",
 --      ["Nancy Screw"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:queen
 --      ["Napalm"] = "", -- Construction_Mode
 --      ["Napalm Rocket"] = "", -- Continental_supplies
 --      ["Napalm rocket: [Fire a bomb with napalm!]"] = "", -- Continental_supplies
 --      ["Naranja Jed"] = "", -- A_Space_Adventure:fruit01
---      ["Natives"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Naughty Ninja"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Near a PAotH base on the moon ..."] = "", -- A_Space_Adventure:moon01
 --      ["Near Secret Base 17 of PAotH in the rural Hogland ..."] = "", -- A_Space_Adventure:cosmos
@@ -1540,11 +1514,8 @@
 --      ["Oh, my!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oh, my! I forgot something!"] = "", -- A_Classic_Fairytale:queen
 --      ["Oh, my! This is even more entertaining than I've expected!"] = "", -- A_Classic_Fairytale:backstab
-        ["Oh no! Just try again!"] = "О, ні! Давай, спробуй ще раз!", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Oh no, not %s!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
---      ["Oh no, the Green Bananas have betrayed Hog Solo and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
-        ["Oh no! Time's up! Just try again."] = "О, ні! Час йде! Спробуй ще раз.", --Bazooka, Shotgun, SniperRifle
---      ["Oh no! You failed! Just try again."] = "", -- Basic_Training_-_Cluster_Bomb
+--      ["Oh no, the companions have betrayed %s and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
 --      ["Oh no! You have died. Try again!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Oh! Please spare me. You can take all my treasures!"] = "", -- A_Space_Adventure:ice01
 --      ["Oh, silly me! I forgot that I'm the shaman."] = "", -- A_Classic_Fairytale:backstab
@@ -1566,9 +1537,9 @@
 --      ["One shall not judge one by one's appearance!"] = "", -- A_Classic_Fairytale:epil
 --      ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oneye"] = "", -- portal
---      ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant
 --      ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant
+--      ["Only %s can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard
 --      ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01
@@ -1580,6 +1551,7 @@
 --      ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01
 --      ["Oops! You have selected the wrong hedgehog! Just try again."] = "", -- Basic_Training_-_Movement
 --      ["Open ammo menu: [Right click]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
+--      ["Open ammo menu: Tap the [Suitcase]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
 --      ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood
         ["Opposing Team: "] = "Команда-Противник: ",
 --      ["Orange"] = "", -- 
@@ -1599,16 +1571,15 @@
 --      ["PAotH has sent explosives but unfortunately the trigger mechanism seems to be faulty!"] = "", -- A_Space_Adventure:cosmos
 --      ["Parachute"] = "", -- Continental_supplies
 --      ["Patches"] = "", -- 
-        ["Pathetic Resistance"] = "Жалюгідний Опір", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02
 --      ["Pause: [P]"] = "", -- Basic_Training_-_Movement
+--      ["Pause: Tap the [Pause] button"] = "", -- Basic_Training_-_Movement
 --      ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW
 --      ["Penguin Roar"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hog’s health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Perfect! Now try to get the next crate without hurting yourself!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh
-        ["Per-Hog Ammo"] = "Боєприпаси на їжака",
 --      ["Personal best: %.3f seconds"] = "", -- A_Space_Adventure:ice02
 --      ["Per team weapons"] = "", -- Continental_supplies
 --      ["Pfew! That was close!"] = "", -- A_Classic_Fairytale:shadow
@@ -1616,7 +1587,6 @@
 --      ["Physicist"] = "", -- HedgeEditor
 --      ["Piano Strike"] = "", -- Construction_Mode
 --      ["Pikachu"] = "", -- 
---      ["Pincer Knights"] = "", -- Bazooka_Battlefield
 --      ["Pings left: %d"] = "", -- Space_Invasion
 --      ["Pink"] = "", -- 
 --      ["Pirates"] = "Пірати", -- 
@@ -1669,8 +1639,6 @@
 --      ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion
 --      ["--- Points ---"] = "", -- Battalion
 --      ["--- Points Mode ---"] = "", -- Battalion
---      ["point(s)"] = "", -- TargetPractice, Mutant
-        ["points"] = "очок", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
 --      ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02
 --      ["Poisonous, deals no damage."] = "", -- Continental_supplies
         ["Poison"] = "Смердюк",
@@ -1690,39 +1658,39 @@
 --      ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to fight"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos
-        ["Prepare yourself"] = "Приготуйся",
+--      ["Prepare yourself, %s!"] = "", -- The_Specialists
 --      ["Press [Attack] (space bar by default) to start,|repeadedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] (space bar by default) to start,|repeatedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] to begin."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Attack] to confirm."] = "", -- Continental_supplies
 --      ["Press [Attack] to select this continent!"] = "", -- Continental_supplies
 --      ["Press [Left] and [Right] to change the difficulty."] = "", -- A_Classic_Fairytale:first_blood
---      ["Press [Left] or [Right] to move around, [Enter] to jump"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Press [Left] or [Right] to move around, [Long Jump] to jump forwards."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW
 --      ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW
+--      ["Press [M] to see the mission texts"] = "", -- Basic_Training_-_Movement
         ["Press [Precise] to skip intro"] = "Натисніть [Приціл] щоб пропустити вступ",
 --      ["Press [Up] and [Down] to move between menu items.|Press [Attack], [Left], or [Right] to toggle."] = "", -- WxW
 --      ["Prestigious Pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Princess"] = "", -- A_Classic_Fairytale:family, A_Classic_Fairytale:journey
 --      ["Princess Peach"] = "", -- 
---      ["Private Nolak"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["Problems, dude? Chillax!"] = "", -- A_Classic_Fairytale:epil
 --      ["Professional pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professional stunt pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professor"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
 --      ["Professor Hogevil, then known as James Hogus, worked for PAotH back in my time."] = "", -- A_Space_Adventure:moon02
+--      ["Professor's Team"] = "", -- A_Space_Adventure:death01
 --      ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
---      ["Pro Killers"] = "", -- Big_Armory
 --      ["Protect the King: When the king dies, so does the team"] = "", -- Battalion
 --      ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Protect yourselves!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Purple"] = "", -- 
 --      ["Pyro"] = "", -- HedgeEditor, The_Specialists
 --      ["Pyromancer"] = "", -- Battalion
 --      ["Quit: [Esc]"] = "", -- Basic_Training_-_Movement
 --      ["Race complexity limit reached"] = "Досягнута межа складності гонки", -- Racer, TechRacer
+--      ["Race failed!"] = "", -- A_Space_Adventure:moon02
+--      ["Racer tool"] = "", -- Racer
 --      ["Racer"] = "Гонщик", -- Racer
---      ["Racer tool"] = "", -- Racer
 --      ["Race"] = "", -- TrophyRace
 --      ["Rachel"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen
 --      ["Radar: Off"] = "", -- WxW
@@ -1756,23 +1724,19 @@
 --      ["Replenishment: Weapons are restocked on turn start of a new hog"] = "", -- Highlander
 --      ["Repositioning Mode"] = "", -- HedgeEditor
 --      ["REPOSITIONING MODE"] = "", -- HedgeEditor
---      ["rescues"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Rescue the imprisoned PAotH team and get the fuel!"] = "", -- A_Space_Adventure:moon01
 --      ["Respawner"] = "", -- Construction_Mode
 --      ["Respawner: Resurrects dead hogs."] = "", -- Construction_Mode
 --      ["Resurrector"] = "", -- Construction_Mode
 --      ["Retract/Extend rope: [Up]/[Down]"] = "", -- Basic_Training_-_Rope
 --      ["- Return the enemy flag to your base to score"] = "", -- Capture_the_Flag
-        [" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = " - Поверніть ворожий прапор на свою базу щоб заробити очко | - Виграє команда з трьома очками | - Ви можете заробити очко лише коли ваш прапор на вашій базі | - Їжак покине прапор якщо потоне чи буде вбитий | - Покинутий прапор можна повернути або захопити знов | - Їжаки відновлюються після смерті",
 --      ["Return to Leaks A Lot!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Return to the mission menu by pressing the \"Go back\" button."] = "", -- A_Space_Adventure:cosmos
 --      ["Return to the Surface"] = "", -- A_Space_Adventure:fruit02
 --      ["Return to the training menu by pressing the “Go back” button."] = "", -- Basic_Training_-_Movement
---      ["Rhombus"] = "", -- Basic_Training_-_Movement
 --      ["Rider"] = "", -- portal
 --      ["Rifleman"] = "", -- Battalion
 --      ["Righteous Beard"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:queen, A_Classic_Fairytale:united
---      ["Right Tong"] = "", -- Bazooka_Battlefield
 --      ["Ripe"] = "", -- 
 --      ["Rise the water if nobody else is in the circle and deal 6 damage to all enemy hogs."] = "", -- Continental_supplies
 --      ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01
@@ -1781,8 +1745,8 @@
 --      ["Roof"] = "", -- WxW
 --      ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Rope Master"] = "", -- Basic_Training_-_Rope
---      ["Roper"] = "", -- SpeedShoppa
 --      ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
+--      ["Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Rope Team"] = "", -- Basic_Training_-_Rope
 --      ["Rope Training"] = "", -- Basic_Training_-_Rope
 --      ["Rope Weapons"] = "", -- Basic_Training_-_Rope
@@ -1796,7 +1760,6 @@
 --      ["Round limit:"] = "", -- TechRacer
 --      ["Rounds complete: %d/%d"] = "Раундів завершено: %d/%d", -- Racer, Space_Invasion, TechRacer
 --      ["Round's slowest lap: %.3fs by %s"] = "", -- TrophyRace
---      ["Rounds until Sudden Death: %d"] = "", -- Battalion
 --      ["RS1"] = "", -- A_Space_Adventure:fruit03
 --      ["RS2"] = "", -- A_Space_Adventure:fruit03
 --      ["Rubber"] = "", -- Construction_Mode, HedgeEditor
@@ -1822,10 +1785,17 @@
 --      ["Salvation was one step closer now..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Sam"] = "", -- A_Space_Adventure:cosmos
 --      ["Sandals?! I thought you left your ring!"] = "", -- A_Classic_Fairytale:queen
+--      ["%s and GB"] = "", -- A_Space_Adventure:fruit02
 --      ["%s and %s enter the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sandstorm"] = "", -- A_Space_Adventure:desert01
 --      ["Sandy"] = "", -- A_Space_Adventure:desert01
-        ["Save as many hapless hogs as possible!"] = "Врятуйте якнайбільше нещасних їжаків!",
+--      ["%s arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
+--      ["Save as many hogs as possible!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey
 --      ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow
 --      ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor
@@ -1837,9 +1807,9 @@
 --      ["Scallywag"] = "", -- 
 --      ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab
 --      ["Scenario"] = "", -- Big_Armory, portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape
---      ["Scenario failed!"] = "", -- SimpleMission
 --      ["Scientist"] = "", -- Battalion
 --      ["%s climbed home in %d seconds!"] = "", -- ClimbHome
+--      ["%s (contd.)"] = "", -- A_Classic_Fairytale:epil
 --      ["Score: %d"] = "", -- Space_Invasion
 --      ["Score goal: %d"] = "", -- Control
 --      ["Score graph"] = "", -- Mutant, Space_Invasion
@@ -1849,6 +1819,7 @@
 --      ["Scores"] = "", -- Mutant
 --      ["Scores:"] = "", -- Mutant
 --      ["Scoring: "] = "", -- Mutant
+--      ["%s couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
 --      ["Script parameter examples:"] = "", -- Gravity
 --      ["%s (+%d)"] = "", -- Battalion
 --      ["%s: %d"] = "", -- Capture_the_Flag, Control
@@ -1861,10 +1832,9 @@
 --      ["%s died … and lives again!"] = "", -- Construction_Mode
 --      ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome
 --      ["%s, %d sec"] = "", -- Continental_supplies
---      ["Search for the device with the help of the other hedgehogs "] = "", -- A_Space_Adventure:fruit02
+--      ["Search for the device with the help of the other hedgehogs."] = "", -- A_Space_Adventure:fruit02
 --      ["Searching in the dust"] = "", -- A_Space_Adventure:desert01
 --      ["Searching the stars!"] = "", -- A_Space_Adventure:cosmos
---      ["seconds"] = "", -- ClimbHome
 --      ["Seduction"] = "", -- Continental_supplies
 --      ["Seems like every time you take a \"walk\", the enemy finds us!"] = "", -- A_Classic_Fairytale:backstab
 --      ["See that crate farther on the right?"] = "", -- A_Classic_Fairytale:first_blood
@@ -1891,6 +1861,7 @@
 --      ["Select your continent with [Up]/[Down] or by selecting a representative weapon."] = "", -- Continental_supplies
 --      ["%s enters the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sergey"] = "", -- 
+--      ["%s escaped successfully!"] = "", -- A_Space_Adventure:fruit01
 --      ["Set bounciness: [Left Shift] + [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set detonation timer: [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set Health: [Left Click]"] = "", -- HedgeEditor
@@ -1914,10 +1885,12 @@
 --      ["%s has been killed before taking enough damage first."] = "", -- SimpleMission
 --      ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has been rescued from death"] = "", -- Construction_Mode
+--      ["%s has dropped the flag!"] = "", -- CTF_Blizzard
 --      ["%s has fallen victim to gravity."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has mutated! +2 points"] = "", -- Mutant
 --      ["%s has passed the best height of %s!"] = "", -- ClimbHome
 --      ["%s has scored!"] = "", -- Capture_the_Flag
+--      ["%s has to refuel the saucer."] = "", -- A_Space_Adventure:moon01
 --      ["%s hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil
 --      ["sheepluva"] = "", -- 
@@ -1934,8 +1907,6 @@
 --      ["Shinobi"] = "", -- 
 --      ["%s hit the ground."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Shoppa Love"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
---      ["Shoppa Union"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes, Challenge_-_Speed_Shoppa_-_ShoppaKing
---      ["Shoppers"] = "", -- SpeedShoppa
         ["Shotgun"] = "Рушниця", -- Continental_supplies
 --      ["Sigh."] = "", -- A_Classic_Fairytale:epil
         ["Silly"] = "Дурник",
@@ -1948,11 +1919,11 @@
 --      ["%s is now as poor as a church mouse"] = "", -- Construction_Mode
 --      ["%s is now a zombie hedgehog"] = "", -- Construction_Mode
 --      ["%s is suddenly low on ammo"] = "", -- Construction_Mode
---      ["Skip your turn to try again."] = "", -- Basic_Training_-_Rope
 --      ["Skulls"] = "", -- Bazooka_Battlefield
 --      ["Slimer"] = "", -- 
 --      ["Slippery"] = "", -- A_Classic_Fairytale:journey
 --      ["%s lost all the weapons"] = "", -- Construction_Mode
+--      ["%s lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
 --      ["Slot %d: %s"] = "", -- Frenzy
 --      ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy
 --      ["Slowpoke"] = "", -- 
@@ -1966,6 +1937,7 @@
 --      ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smugglers"] = "", -- A_Space_Adventure:desert01
+--      ["%s must collect the final crates."] = "", -- A_Space_Adventure:fruit02
 --      ["%s must skip this turn for rule violation."] = "", -- WxW
 --      ["Sneaks"] = "", -- Bazooka_Battlefield
 --      ["%s never got the ninja diploma."] = "", -- ClimbHome
@@ -1974,10 +1946,8 @@
 --      ["Sniper"] = "", -- HedgeEditor, The_Specialists
 --      ["Sniper Rifle"] = "", -- Continental_supplies
         ["Sniper Training"] = "Снайперське тренування",
---      ["Sniperz"] = "",
 --      ["So, as promised I have brought you where I think that the device you are looking for is hidden."] = "", -- A_Space_Adventure:fruit02
 --      ["So far, you had infinite ropes, but in the|real world, ropes are usually limited."] = "", -- Basic_Training_-_Rope
---      ["So Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["So, I believe that it's a good place to start."] = "", -- A_Space_Adventure:desert01
 --      ["So, I kindly ask for your help."] = "", -- A_Space_Adventure:fruit01
@@ -1987,11 +1957,12 @@
 --      ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03
 --      ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen
 --      ["Some weapons can be dropped from the rope."] = "", -- Basic_Training_-_Rope
---      ["Somewhere else on the planet of fruits, Captain Lime helps Hog Solo"] = "", -- A_Space_Adventure:fruit02
---      ["Somewhere else on the planet of fruits Hog Solo gets closer to the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, Captain Lime helps %s"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, %s gets closer to the device"] = "", -- A_Space_Adventure:fruit02
 --      ["Somewhere on the Planet of Fruits a terrible war is about to begin ..."] = "", -- A_Space_Adventure:fruit01
 --      ["Somewhere on the uninhabitable Death Planet ..."] = "", -- A_Space_Adventure:death01
 --      ["So, now I got the last part and I have your friends captured."] = "", -- A_Space_Adventure:death01
+--      ["So, %s, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So the princess was never heard of again ..."] = "", -- A_Classic_Fairytale:family
 --      ["So, uhmm, how did you manage to teleport them so far?"] = "", -- A_Classic_Fairytale:epil
 --      ["Sour"] = "", -- 
@@ -2092,8 +2063,6 @@
 --      ["Structure Placement Mode"] = "", -- Construction_Mode
 --      ["Structure Placer"] = "", -- Construction_Mode
 --      ["Stupid, stupid Hogerians!"] = "", -- A_Space_Adventure:final
---      ["Subject 1"] = "", -- portal
---      ["Subjects"] = "", -- portal
 --      ["Subtract %d"] = "", -- HedgeEditor
 --      ["--- Sudden Death ---"] = "", -- Battalion
 --      ["Summer Squash"] = "", -- A_Space_Adventure:fruit01
@@ -2110,7 +2079,7 @@
 --      ["Surfer! +15 points!"] = "", -- Space_Invasion
 --      ["Surfer!"] = "", -- WxW
 --      ["Surprise supplies: Get 1-3 random weapons each turn."] = "", -- Continental_supplies
---      ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:shadow
+--      ["Survive!"] = "", -- A_Classic_Fairytale:shadow
 --      ["%s violated the “All But Last” rule and will be penalized."] = "", -- WxW
 --      ["%s violated the “Kill The Leader” rule and will be penalized."] = "", -- WxW
 --      ["Swap place with a random enemy in the circle."] = "", -- Continental_supplies
@@ -2129,6 +2098,7 @@
 --      ["%s! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
 --      ["Swing, Leaks A Lot, on the wings of the wind!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Swing: [Left]/[Right]"] = "", -- Basic_Training_-_Rope
+--      ["%s wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome
 --      ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer
 --      ["switch"] = "", -- Continental_supplies
@@ -2142,6 +2112,7 @@
 --      ["Switch Hog"] = "", -- Construction_Mode
 --      ["Switch: Select weapon special"] = "", -- Continental_supplies
 --      ["Switch: Toggle crate radar"] = "", -- WxW
+--      ["%s won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Swords"] = "", -- Bazooka_Battlefield
 --      ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon
 --      ["%s, you may choose the rules."] = "", -- WxW
@@ -2150,6 +2121,8 @@
 --      ["Tails"] = "", -- 
 --      ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Tall Potato"] = "", -- A_Space_Adventure:fruit01
+--      ["Tap [Pause] to see the mission texts"] = "", -- Basic_Training_-_Movement
+--      ["Tap the “rotating arrow” button on the left|until you have selected Cappy, the hedgehog with the cap!"] = "", -- Basic_Training_-_Movement
 --      ["Target"] = "", -- HedgeEditor
 --      ["Target Placement Mode"] = "", -- Construction_Mode
 --      ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor
@@ -2163,17 +2136,20 @@
 --      ["Targets left: %d"] = "", -- TargetPractice
 --      ["Tatsujin"] = "", -- 
 --      ["Tatters"] = "", -- 
+        ["Team %d: "] = "Команда %d: ",
 --      ["Team %d"] = "Команда %d", -- SimpleMission
-        ["Team %d: "] = "Команда %d: ",
+--      ["Team highscore: %d"] = "", -- Utils
 --      ["Team Identity Mode"] = "", -- HedgeEditor
 --      ["TEAM IDENTITY MODE"] = "", -- HedgeEditor
---      ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
+--      ["Team lowscore: %d"] = "", -- Utils
 --      ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion
+--      ["Team's best time: %.3fs"] = "", -- Utils
 --      ["Team Scores:"] = "Очки Команди", -- Control
 --      ["Team scores:"] = "Очки команди", -- Space_Invasion
+--      ["Team's longest time: %.3fs"] = "", -- Utils
+--      ["Team's top accuracy: %d%"] = "", -- Utils
 --      ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2
 --      ["Teamwork"] = "", -- User_Mission_-_Teamwork
---      ["Team Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
 --      ["TechRacer"] = "", -- TechRacer
 --      ["Teleporation Node"] = "", -- Construction_Mode
 --      ["Teleportation Mode"] = "", -- Construction_Mode
@@ -2265,11 +2241,12 @@
 --      ["The forgotten continent"] = "", -- Continental_supplies
 --      ["The giant umbrella from the last crate should help break the fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Great Escape"] = "", -- User_Mission_-_The_Great_Escape
---      ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01
+--      ["- The green target must survive"] = "", -- HedgeEditor
+--      ["- The green targets must survive"] = "", -- HedgeEditor
 --      ["The guardian"] = "", -- A_Classic_Fairytale:shadow
 --      ["The hardships of the war turned %s (%s) into a killing machine: %d invaders destroyed in one round!"] = "", -- Space_Invasion
+--      ["The health of your current hedgehog|is shown at the top right corner."] = "", -- Basic_Training_-_Movement
 --      ["The hedgehog with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant
---      ["The Hogies"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["The Hospital"] = "", -- 
 --      ["The Individualist"] = "", -- A_Classic_Fairytale:shadow
 --      ["Their buildings were very primitive back then, even for an uncivilised island."] = "", -- A_Classic_Fairytale:united
@@ -2287,7 +2264,6 @@
 --      ["The Mutant has super-weapons and a lot of health."] = "", -- Mutant
 --      ["The Mutant loses health quickly, but gains health by killing."] = "", -- Mutant
 --      ["The Mutant loses health quickly if he doesn't keep scoring kills."] = "", -- Mutant
-        ["The Nameless One"] = "Безіменний",
 --      ["The Navy greets %s for managing to get in a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["The next 4 times you play the \"The last encounter\" mission you'll get 20 more hit points and a laser sight."] = "", -- A_Space_Adventure:death02
 --      ["The next crate is an utility crate."] = "", -- Basic_Training_-_Movement
@@ -2301,6 +2277,7 @@
 --      ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil
 --      ["The oppression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
 --      ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
+--      ["The other hog has died, he should have survived!"] = "", -- A_Space_Adventure:moon02
 --      ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Police"] = "", -- 
 --      ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -2325,7 +2302,7 @@
 --      ["The Showdown"] = "", -- A_Classic_Fairytale:shadow
 --      ["The Slaughter"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:first_blood
 --      ["The Society of Perfectionists greets %s (%s): No misses and %d hits in its best round."] = "", -- Space_Invasion
-        ["THE SPECIALISTS"] = "СПЕЦІАЛІСТИ",
+--      ["The Specialists: Each hedgehog starts with its own weapon set"] = "", -- The_Specialists
 --      ["The spinning arrows above your hedgehog show|which hedgehog is selected right now."] = "", -- Basic_Training_-_Movement
 --      ["The spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
@@ -2373,7 +2350,6 @@
 --      ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["This also increases the effectiveness of Medicine."] = "", -- Continental_supplies
 --      ["This game wasn’t really exciting."] = "", -- Space_Invasion
---      ["This Hog Solo is so naive! When he returns I'll shoot him and keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This is a new personal best, congratulations!"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert02, A_Space_Adventure:fruit03
 --      ["This is a new personal best time, congratulations!"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["This is Cappy."] = "", -- Basic_Training_-_Movement
@@ -2391,6 +2367,7 @@
         ["This rain is really something..."] = "Цей дощ дійсно дещо...",
 --      ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome
 --      ["This seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01
+--      ["This %s is so naive! I'm going to shoot this fool so I can keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This was an awesome performance! But this challenge can be finished with even just one RC plane. Can you figure out how?"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["This will be fun!"] = "", -- A_Classic_Fairytale:enemy
 --      ["This will be useful when I need a new platform or if I want to rise."] = "", -- portal
@@ -2431,11 +2408,11 @@
 --      ["To begin with the training, hit the attack key!"] = "", -- Basic_Training_-_Movement
 --      ["To begin with the training, select the bazooka from the ammo menu!"] = "", -- Basic_Training_-_Bazooka
 --      ["To begin with the training, select the grenade from the ammo menu!"] = "", -- Basic_Training_-_Grenade
+--      ["To begin with the training, tap the attack button!"] = "", -- Basic_Training_-_Movement
 --      ["To finish hedgehog selection, just do anything|with him, like walking."] = "", -- Basic_Training_-_Movement
 --      ["To get over the next obstacles, keep some distance from the wall before you back jump."] = "", -- Basic_Training_-_Movement
 --      ["To get over the water, you have to do multiple|rope shots and swings."] = "", -- Basic_Training_-_Rope
 --      ["Toggle Editing Weapons and Tools: [Precise]+[2]"] = "", -- HedgeEditor
---      ["Toggle Gear Information: [Precise]+[3]"] = "", -- HedgeEditor
 --      ["Toggle Help: [Precise]+[1]"] = "", -- HedgeEditor
 --      ["Toggle Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Toggle Shield: [Long jump]"] = "Перемкнути Щит [Довгий стрибок]", -- Space_Invasion
@@ -2445,14 +2422,14 @@
 --      ["Too bad! Then you should really leave!"] = "", -- A_Space_Adventure:fruit01
 --      ["Too slow! Try again ..."] = "", -- A_Space_Adventure:moon02
 --      ["Top-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"] = "", -- A_Classic_Fairytale:shadow
 --      ["To reach higher ground, walk to a ledge, look to the left, then do a back jump."] = "", -- Basic_Training_-_Movement
 --      ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey
 --      ["To the caves..."] = "", -- A_Classic_Fairytale:united
 --      ["Touch all waypoints as fast as you can!"] = "", -- Racer
---      ["To win the game, Hog Solo has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
+--      ["- Touch the sparkles near your base to teleport"] = "", -- CTF_Blizzard
+--      ["To win the game, %s has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
 --      ["To win the game you had to collect the 2 crates with no specific order."] = "", -- A_Space_Adventure:desert01
---      ["To win the game you have to eliminate all your enemies."] = "", -- A_Space_Adventure:death01
+--      ["To win the game you have to eliminate Professor Hogevil."] = "", -- A_Space_Adventure:death01
 --      ["To win the game you have to find the right crate."] = "", -- A_Space_Adventure:desert01
 --      ["To win the game you have to go next to Thanta."] = "", -- A_Space_Adventure:ice01
 --      ["To win the game you have to go to the surface."] = "", -- A_Space_Adventure:desert02
@@ -2460,13 +2437,10 @@
 --      ["To win the game you have to stand next to Thanta."] = "", -- A_Space_Adventure:ice01
         ["Toxic Team"] = "Токсична Команда", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Track completed!"] = "Трасу пройдено", -- Racer, TechRacer
---      ["Trainee"] = "", -- TargetPractice
+--      ["Training complete!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Training"] = "Тренування", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
---      ["Training complete!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Training Team"] = "", -- TargetPractice
 --      ["Traitors"] = "", -- A_Classic_Fairytale:epil
 --      ["Traitors don't get to shout around here!"] = "", -- A_Classic_Fairytale:epil
---      ["Trapped"] = "", -- Basic_Training_-_Movement
 --      ["Trapper"] = "", -- HedgeEditor
 --      ["Travel carefully as your fuel is limited"] = "", -- A_Space_Adventure:cosmos
 --      ["Travel to all the neighbor planets and collect all the pieces"] = "", -- A_Space_Adventure:cosmos
@@ -2483,7 +2457,6 @@
 --      ["Try to land softly, as you can still take fall damage!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Try to protect the chief! You won't lose if he dies, but it is advised that he survives."] = "", -- A_Classic_Fairytale:united
 --      ["Try to reach and destroy the next target quickly."] = "", -- Basic_Training_-_Rope
-        ["T_T"] = "Ааааа!!!",
 --      ["Tumbler"] = "", -- Tumbler
 --      ["Turn around: [Left Shift] + [Left]/[Right]"] = "", -- Basic_Training_-_Movement
 --      ["Turning Around"] = "", -- Basic_Training_-_Movement
@@ -2502,7 +2475,6 @@
 --      ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy
 --      ["Ukemi"] = "", -- 
 --      ["Ultra kill!"] = "", -- Mutant
---      ["Ultrasoldier"] = "", -- Big_Armory
 --      ["unC0Rr"] = "", -- 
 --      ["Under Construction"] = "", -- A_Classic_Fairytale:shadow
 --      ["Under normal circumstances we could easily defeat them but we have kindly sent most of our men to the Kingdom of Sand to help with the annual dusting of the king's palace."] = "", -- A_Space_Adventure:fruit01
@@ -2527,7 +2499,6 @@
         ["Unit"] = "Модуль",
 --      ["Unlike bazookas, grenades are not influenced by wind."] = "", -- Basic_Training_-_Grenade
 --      ["Unlimited Attacks: Attacks don't end your turn"] = "", -- User_Mission_-_Diver, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree
-        ["Unlimited Attacks"] = "Необмежені Атаки",
 --      ["Unlucky Sods"] = "", -- User_Mission_-_Rope_Knock_Challenge
         ["Unstoppable!"] = "Невпинний!",
 --      ["Unsuspecting Louts"] = "", -- User_Mission_-_Rope_Knock_Challenge
@@ -2542,13 +2513,14 @@
 --      ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood
         ["User Challenge"] = "Дуель між користувачами",
 --      ["!"] = "", -- User_Mission_-_Dangerous_Ducklings
+--      ["User Mission"] = "", -- HedgeEditor
 --      ["Use the attack key twice to change the flying saucer while being in air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the attack key twice to change the flying saucer while floating in mid-air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the bazooka and the flying saucer to get the freezer."] = "", -- A_Space_Adventure:ice01
 --      ["Use the flying saucer from the crate to fly to the moon."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly the other planets."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly to the other planets."] = "", -- A_Space_Adventure:cosmos
---      ["Use the parachute ([Space] while in air) to get the next crate"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Use the parachute to get the next crate."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Use the portal gun to get to the next crate, then use the new gun to get to the final destination!|"] = "", -- A_Classic_Fairytale:dragon
 --      ["Use the RC plane and destroy the all the targets."] = "", -- A_Space_Adventure:desert03
 --      ["Use the rope in order to catch the blue hedgehog"] = "", -- A_Space_Adventure:moon02
@@ -2582,7 +2554,6 @@
 --      ["Victory Condition: Collect"] = "", -- HedgeEditor
 --      ["Victory Condition: Destroy"] = "", -- HedgeEditor
 --      ["Victory for %s!"] = "", -- Capture_the_Flag
-        ["Victory for the "] = "Перемога для ", -- CTF_Blizzard, Capture_the_Flag
 --      ["Violence is not the answer to your problems!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos
 --      ["Vladimir"] = "", -- 
@@ -2601,9 +2572,6 @@
 --      ["Walls left: %d"] = "", -- WxW
 --      ["Wall to wall"] = "", -- WxW
 --      ["Waluigi"] = "", -- 
---      ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Wannabe Ropers"] = "", -- Basic_Training_-_Rope
---      ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Wario"] = "", -- 
 --      ["Warming Up"] = "", -- Basic_Training_-_Grenade
 --      ["Warning: Fire cake detected"] = "", -- ClimbHome
@@ -2633,7 +2601,6 @@
 --      ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion
 --      ["Weapon specials: Some weapons have special modes (see weapon description)."] = "", -- Continental_supplies
 --      ["Weapons reset: The weapons are reset after each turn."] = "", -- WxW
-        ["Weapons Reset"] = "Скидання Зброї",
 --      ["We are indeed."] = "", -- A_Classic_Fairytale:backstab
 --      ["We can't defeat them!"] = "", -- A_Classic_Fairytale:shadow
 --      ["We can't hold them up much longer!"] = "", -- A_Classic_Fairytale:united
@@ -2649,9 +2616,9 @@
 --      ["We have to hurry! Are you armed?"] = "", -- A_Space_Adventure:moon01
 --      ["We have to protect the village!"] = "", -- A_Classic_Fairytale:united
 --      ["We have to unite and defeat those cylergs!"] = "", -- A_Classic_Fairytale:enemy
---      ["Welcome Hog Solo, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome home! Please take a seat"] = "", -- ClimbHome
 --      ["Welcome, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey
+--      ["Welcome, %s, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome to the Death Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
@@ -2818,16 +2785,16 @@
 --      ["You can’t open a portal on the blue surface."] = "", -- portal
 --      ["You can use the other 2 hogs to assist you."] = "", -- A_Space_Adventure:fruit02
 --      ["You can use the rope to reach new places."] = "", -- Basic_Training_-_Rope
---      ["You choose well, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You choose well, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You completed the mission in %.3f seconds."] = "", -- A_Space_Adventure:ice02
 --      ["You completed the mission in %d rounds."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03
---      ["You couldn't have come to a worse time, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You couldn't have come to a worse time, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You couldn't possibly believe that after refusing my offer I'd just let you go!"] = "", -- A_Classic_Fairytale:journey
         ["You'd almost swear the water was rising!"] = "Ти ледь не присягався, що вода піднімається!",
 --      ["You'd better watch your steps..."] = "", -- A_Classic_Fairytale:journey
 --      ["You defended yourself against Captain Lime."] = "", -- A_Space_Adventure:fruit02
---      ["You defended yourself against the Fruit Assassins."] = "", -- A_Space_Adventure:fruit02
---      ["You did great, Hog Solo! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
+--      ["You defended yourself against %s."] = "", -- A_Space_Adventure:fruit02
+--      ["You did great, %s! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
 --      ["You did not make it in time, try again!"] = "", -- Basic_Training_-_Rope
 --      ["You don't deserve my sacrifice!"] = "", -- A_Classic_Fairytale:queen
 --      ["You drove Professor Hogevil away."] = "", -- A_Space_Adventure:moon01
@@ -2843,12 +2810,12 @@
 --      ["You got me!"] = "", -- A_Space_Adventure:moon02
 --      ["You had %.1fs remaining on the clock (+%d points)."] = "", -- TargetPractice
 --      ["You had %.2fs remaining on the clock (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle
---      ["You had %d additional flying saucers left."] = "", -- A_Space_Adventure:ice02
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: you might want to use some mines..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: You might want to use some mines ..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01
 --      ["You have activated Switch Hedgehog!"] = "", -- Basic_Training_-_Movement
 --      ["You have beaten the challenge!"] = "", -- ClimbHome
+--      ["You have beaten the team record, congratulations!"] = "", -- Utils
 --      ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab
 --      ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united
 --      ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01
@@ -2867,7 +2834,6 @@
 --      ["You have eliminated all visible enemy hedgehogs!"] = "", -- A_Space_Adventure:fruit01
 --      ["You have eliminated Professor Hogevil."] = "", -- A_Space_Adventure:moon01
 --      ["You have eliminated the evil minions."] = "", -- A_Space_Adventure:moon01
---      ["You have eliminated the whole evil team. You're pretty tough!"] = "", -- A_Space_Adventure:moon01
 --      ["You have escaped successfully."] = "", -- A_Space_Adventure:desert02
 --      ["You have failed to complete your task, young one!"] = "", -- A_Classic_Fairytale:journey
 --      ["You have failed to save the tribe!"] = "", -- A_Classic_Fairytale:backstab
@@ -2921,6 +2887,7 @@
 --      ["You have to travel again"] = "", -- A_Space_Adventure:cosmos
 --      ["You have to try again!"] = "", -- A_Space_Adventure:cosmos
 --      ["You have triggered the secret Do-Not-Rope-to-the-Moon Defense System."] = "", -- A_Space_Adventure:cosmos
+--      ["You have unlocked the target radar!"] = "", -- TargetPractice
 --      ["You have used %d flying saucers."] = "", -- A_Space_Adventure:ice02
 --      ["You have used %d RC planes."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["You have used only 1 RC plane. Outstanding!"] = "", -- User_Mission_-_RCPlane_Challenge
@@ -2939,10 +2906,9 @@
 --      ["You'll have only 2 watermelon bombs during the game."] = "", -- A_Space_Adventure:fruit03
 --      ["You'll have only one RC plane at the start of the mission."] = "", -- A_Space_Adventure:desert03
 --      ["You'll have to eliminate Captain Lime at the end."] = "", -- A_Space_Adventure:fruit02
---      ["You'll have to eliminate the Fruit Assassins at the end."] = "", -- A_Space_Adventure:fruit02
+--      ["You'll have to eliminate %s at the end."] = "", -- A_Space_Adventure:fruit02
 --      ["You'll lose if you die or if your time is up."] = "", -- A_Space_Adventure:moon02
         ["You'll see what I mean!"] = "Ти побачиш про що я!", -- A_Classic_Fairytale:enemy
---      ["You lose!"] = "", -- Basic_Training_-_Sniper_Rifle, Big_Armory, Basic_Training_-_Bazooka, TargetPractice, ClimbHome
 --      ["You lost your target, try again!"] = "", -- TargetPractice
 --      ["You may find it handy."] = "", -- A_Space_Adventure:cosmos
 --      ["You may only attack from a rope!"] = "", -- WxW
@@ -2964,8 +2930,7 @@
 --      ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice
 --      ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice
 --      ["Your ammo is limited this time."] = "", -- Basic_Training_-_Bazooka
---      ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy
---      ["Your deaths will be avenged, Natives!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Your deaths will be avenged, %s!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Your death will not be in vain, Dense Cloud!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You're a coward!"] = "", -- A_Classic_Fairytale:queen
         ["You're...alive!? But we saw you die!"] = "Ти...живий!? Але ми бачили як ти помер!", -- A_Classic_Fairytale:backstab
@@ -2993,21 +2958,21 @@
 --      ["Your next task is to collect some crates by using the rope!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Your personal best time so far: %.3f seconds"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["Your rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["You saved %d of 8 Hapless Hogs."] = "", -- User_Mission_-_That_Sinking_Feeling
+--      ["Your rope is gone! Try again!"] = "", -- Basic_Training_-_Rope
+--      ["You saved %d of 8 hegehogs."] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen
 --      ["You see the wind strength at the bottom right corner."] = "", -- Basic_Training_-_Bazooka
+--      ["You see the wind strength at the top."] = "", -- Basic_Training_-_Bazooka
 --      ["You should have known that we don't rely on meatbags!"] = "", -- A_Classic_Fairytale:queen
 --      ["You should know this more than anyone, Leaks!"] = "", -- A_Classic_Fairytale:queen
 --      ["You speak great truth, Hannibal. Here, take a sip!"] = "", -- A_Classic_Fairytale:epil
 --      ["You've been assaulting us, we have been just defending ourselves!"] = "", -- A_Classic_Fairytale:enemy
-        ["You've failed. Try again."] = "Спроба не вдалась. Спробуйте знов.",
         ["You've reached the goal!| |Time: "] = "Ви досягли мети!| |Час: ",
 --      ["You will be avenged!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You will fail if you run out of ammo and there are still targets available."] = "", -- A_Space_Adventure:desert03
 --      ["You will gain some extra ammo from the crates the next time you play the \"Getting to the device\" mission."] = "", -- A_Space_Adventure:fruit03
 --      ["You will play every 3 turns."] = "", -- A_Space_Adventure:fruit01
 --      ["- You will recieve 2-4 weapons on each kill! (Even on own hogs)"] = "", -- Continental_supplies
---      ["You win!"] = "", -- Big_Armory
 --      ["You won't believe what happened to me!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Yuck! I bet they'll keep worshipping her even after I save the village!"] = "", -- A_Classic_Fairytale:family
 --      ["Yumme Gunpowder"] = "", -- 
@@ -3015,7 +2980,8 @@
 --      ["Zombie"] = "", -- 
 --      ["Zombi"] = "", -- portal
         ["'Zooka Team"] = "Команда 'Zooka",
---      ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
+--      ["Zoom: [Pinch] with 2 fingers"] = "", -- Basic_Training_-_Movement
+--      ["Zoom: [Rotate mouse wheel]"] = "", -- Basic_Training_-_Movement
 --      ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen
         ["!!!"] = "Я!",
 }
--- a/share/hedgewars/Data/Locale/zh_CN.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/zh_CN.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -26,7 +26,6 @@
 --      ["Above-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Accuracy Bonus! +15 points"] = "", -- Space_Invasion
 --      ["Accuracy bonus: +%d points"] = "", -- Basic_Training_-_Sniper_Rifle
---      ["Ace"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge
 --      ["Achievement gotten: %s"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_That_Sinking_Feeling, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, Basic_Training_-_Rope, Tumbler
 --      ["A Classic Fairytale"] = "", -- A_Classic_Fairytale:first_blood
 --      ["A crate critical to this mission has been destroyed."] = "", -- SimpleMission
@@ -46,7 +45,6 @@
 --      ["Again with the 'cannibals' thing!"] = "", -- A_Classic_Fairytale:enemy
 --      ["A Hedgewars minigame"] = "", -- Capture_the_Flag
 --      ["A Hedgewars mini-game"] = "", -- Racer, Space_Invasion, TechRacer, Tumbler
---      ["a Hedgewars mini-game"] = "", -- Space_Invasion, The_Specialists
 --      ["A Hedgewars tag game"] = "", -- Mutant
 --      ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome
 --      ["Aim at the ceiling and hold [Attack] pressed until the rope attaches."] = "", -- Basic_Training_-_Rope
@@ -141,13 +139,14 @@
 --      ["As you've seen, the dropped grenade roughly fell into your flying direction."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Athlete"] = "", -- Battalion
 --      ["Attack: Activate"] = "", -- Racer
---      ["Attack Captain Lime before he attacks back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack Captain Lime before he attacks back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack From Rope: %s"] = "", -- WxW
 --      ["Attack From Rope: You may only attack from a rope."] = "", -- WxW
 --      ["Attack rule: %s"] = "", -- WxW
 --      ["Attack: Select this continent"] = "", -- Continental_supplies
 --      ["Attack: [Space]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
---      ["Attack the assassins before they attack back"] = "", -- A_Space_Adventure:fruit02
+--      ["Attack: Tap the [Bomb]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
+--      ["Attack the assassins before they attack back."] = "", -- A_Space_Adventure:fruit02
 --      ["Attack: Throw ball"] = "", -- Knockball
 --      ["At the end of the game your health was %d."] = "", -- A_Space_Adventure:ice01
 --      ["At the start of the game each enemy hog has only the weapon that he is named after."] = "", -- A_Space_Adventure:death02
@@ -155,16 +154,18 @@
 --      ["Available weapon specials:"] = "", -- Continental_supplies
 --      ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion
---      ["Avoid the mines!"] = "", -- Basic_Training_-_Rope
 --      ["Axes"] = "", -- Bazooka_Battlefield
 --      ["Aye! Fellow! Let me exit this chamber of doom!"] = "", -- A_Classic_Fairytale:epil
 --      ["Back Breaker"] = "", -- A_Classic_Fairytale:backstab
 --      ["Back in the village, after telling the villagers about the threat..."] = "", -- A_Classic_Fairytale:united
 --      ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil
 --      ["Back Jump: [Backspace] ×2"] = "", -- Basic_Training_-_Movement
+--      ["Back Jump: Double-tap the [Curvy Arrow]"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (1/2)"] = "", -- Basic_Training_-_Movement
 --      ["Back Jumping (2/2)"] = "", -- Basic_Training_-_Movement
 --      ["Backstab"] = "", -- A_Classic_Fairytale:backstab
+--      ["Backwards jump: Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Backwards jump: Tap the [Curvy Arrow] twice"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Bacon"] = "", -- 
 --      ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Badmad"] = "", -- portal
@@ -197,7 +198,6 @@
 --      ["Bazooka Battlefield"] = "", -- Bazooka_Battlefield
 --      ["Bazooka Master"] = "", -- Basic_Training_-_Bazooka
 --      ["Bazookas are influenced by wind."] = "", -- Basic_Training_-_Bazooka
---      ["Bazooka Team"] = "", -- Basic_Training_-_Bazooka
       ["Bazooka Training"] = "火箭筒训练",
 --      ["Bearded Beast"] = "", -- 
 --      ["Be careful, the future of Hogera is in your hands!"] = "", -- A_Space_Adventure:cosmos
@@ -231,7 +231,6 @@
 --      ["Bloodpie"] = "", -- A_Classic_Fairytale:backstab
 --      ["Bloodrocutor"] = "", -- A_Classic_Fairytale:shadow
 --      ["Bloodsucker"] = "", -- A_Classic_Fairytale:shadow
-      ["Bloody Rookies"] = "雉儿飞", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 --      ["Blue"] = "", -- 
 --      ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Bob"] = "", -- A_Space_Adventure:cosmos
@@ -314,7 +313,9 @@
 --      ["Challenge objectives"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit03, A_Space_Adventure:moon02
 --      ["Challenge over!"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa, ClimbHome
+--      ["Change bounciness: Tap [B]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Content: [Left], [Right]"] = "", -- HedgeEditor
+--      ["Change detonation timer: Tap the [Clock]"] = "", -- Basic_Training_-_Grenade, A_Classic_Fairytale:shadow
 --      ["Change direction: [Left]/[Right]"] = "", -- Basic_Training_-_Grenade
 --      ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Change Health: [Left], [Right]"] = "", -- HedgeEditor
@@ -334,6 +335,8 @@
 --      ["Chicken"] = "", -- 
 --      ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01
 --      ["Chikorita"] = "", -- 
+--      ["Choose location: Left click"] = "", -- A_Classic_Fairytale:shadow
+--      ["Choose location: Tap the [Target] button, then tap on the spot you want to choose"] = "", -- A_Classic_Fairytale:shadow
 --      ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Choose your continent wisely, as your decision will be permanent."] = "", -- Continental_supplies
 --      ["Choose your side! If you want to join the strange man, walk up to him.|Otherwise, walk away from him. If you decide to att...nevermind..."] = "", -- A_Classic_Fairytale:shadow
@@ -342,7 +345,6 @@
 --      ["Cleaver"] = "", -- Construction_Mode
 --      ["Cleaver Placement Mode"] = "", -- Construction_Mode
 --      ["CLEAVER PLACEMENT MODE"] = "", -- HedgeEditor
---      ["Climber"] = "", -- ClimbHome
 --      ["Climb Home"] = "", -- ClimbHome
 --      ["Closing in"] = "", -- A_Classic_Fairytale:queen
 --      ["Clown"] = "", -- HedgeEditor
@@ -352,11 +354,13 @@
 --      ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb
 --      ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey
 --      ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey
+--      ["- Collect all the blue crates"] = "", -- HedgeEditor
 --      ["Collect all the crates, but remember, our time in this life is limited!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect or destroy all the health crates."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Collect or destroy the final crate to finish the training."] = "", -- Basic_Training_-_Flying_Saucer
+--      ["- Collect the blue crate"] = "", -- HedgeEditor
 --      ["Collect the crate and attack!"] = "", -- WxW
---      ["Collect the crate on the right.|Hint: Select the rope, [Up] or [Down] to aim, [Space] to fire, directional keys to move.|Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Collect the crate on the right."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the crates within the time limit!|If you fail, you'll have to try again."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Collect the first crate to begin!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Collect the freezer and get the device part from Thanta."] = "", -- A_Space_Adventure:ice01
@@ -424,7 +428,6 @@
 --      ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Crates per turn: %d"] = "", -- WxW
---      ["crate(s)"] = "", -- SpeedShoppa
 --      ["Crazy Gravity: Gravity randomly changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity
 --      ["Crazy Runner"] = "", -- A_Space_Adventure:moon02
 --      ["Cricket Time"] = "", -- Continental_supplies
@@ -457,11 +460,10 @@
 --      ["Deals 15 damage to all enemies in the circle."] = "", -- Continental_supplies
 --      ["Deer"] = "", -- 
 --      ["Defeat all enemies!"] = "", -- portal
+--      ["Defeat!"] = "", -- HedgeEditor
 --      ["Defeat Professor Hogevil!"] = "", -- A_Space_Adventure:death01
---      ["Defeat the cannibals"] = "", -- A_Classic_Fairytale:backstab
---      ["Defeat the cannibals!|"] = "", -- A_Classic_Fairytale:united
+--      ["Defeat the cannibals!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cannibals!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Defeat the cannibals!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Defeat the cyborgs!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen
 --      ["Delete Waypoint"] = "", -- HedgeEditor
@@ -482,11 +484,11 @@
 --      ["Destroyer of planes"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Destroy him, Leaks A Lot! He is responsible for the deaths of many of us!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion
+--      ["- Destroy the enemy"] = "", -- HedgeEditor
+--      ["- Destroy the red target"] = "", -- HedgeEditor
+--      ["- Destroy the red targets"] = "", -- HedgeEditor
 --      ["Destroy the targets!"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
---      ["Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
---      ["Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"] = "", -- A_Classic_Fairytale:first_blood
 --      ["+%d flamer fuel!"] = "", -- Tumbler
---      ["%d Hapless Hogs left"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["+%d health"] = "", -- Mutant
 --      ["%d-Hit Combo! +%d points!"] = "", -- Space_Invasion
 --      ["Did anyone follow you?"] = "", -- A_Classic_Fairytale:united
@@ -507,7 +509,6 @@
 --      ["Disguise as a Rockhopper Penguin"] = "", -- Continental_supplies
 --      ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies
 --      ["Displacer"] = "", -- 
---      ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Diver"] = "", -- User_Mission_-_Diver
 --      ["%d ms"] = "", -- HedgeEditor
 --      ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen
@@ -594,10 +595,8 @@
 --      ["Elderbot"] = "", -- A_Classic_Fairytale:family
 --      ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape
       ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "时间限制内清除全部目标。弹药无限。", --Bazooka, Shotgun, SniperRifle
---      ["Eliminate the Blue Team before the time runs out."] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Eliminate the enemy before the time runs out."] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree
 --      ["Eliminate the enemy hogs to win."] = "",
---      ["Eliminate the enemy specialists."] = "",
 --      ["Eliminate the enemy."] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh
 --      ["Eliminate Unit 3378."] = "", -- User_Mission_-_Teamwork
 --      ["Eliminate WatchBot 4000."] = "", -- User_Mission_-_Teamwork_2
@@ -622,13 +621,14 @@
 --      ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab
 --      ["Except me, of course! I just saved a whole planet!"] = "", -- A_Space_Adventure:final
 --      ["Experienced beginner"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Explore the tunnel with the other hedgehogs and search for the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Explore the tunnel with the other hedgehogs and search for the device."] = "", -- A_Space_Adventure:fruit02
 --      ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02
 --      ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey
 --      ["Fair Wind"] = "", -- 
 --      ["Fall Damage"] = "", -- Basic_Training_-_Movement
 --      ["Fallen Angel"] = "", -- Tentacle_Terror
 --      ["Family Reunion"] = "", -- A_Classic_Fairytale:family
+--      ["Fastest escape: %d turns"] = "", -- A_Space_Adventure:desert02
 --      ["Fastest lap: %.3fs by %s"] = "", -- TrophyRace
       ["Fastest lap: "] = "最快记录:",
       ["Feeble Resistance"] = "反抗者",
@@ -648,11 +648,12 @@
 --      ["Final result"] = "", -- Mutant
 --      ["Final Targets"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade
 --      ["Final team scores:"] = "", -- Space_Invasion
+--      ["Find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Find a way to detonate all the explosives and stay alive!"] = "", -- A_Space_Adventure:final
 --      ["Find your tribe!|Cross the lake!"] = "", -- A_Classic_Fairytale:dragon
 --      ["Finish this challenge as fast as possible to earn bonus points."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Finish waypoint placement"] = "", -- Racer
---      ["Finish your training|Hint: Animations can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Finish your training."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Finite Ropes"] = "", -- Basic_Training_-_Rope
 --      ["Fire a rocket with napalm."] = "", -- Continental_supplies
 --      ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler
@@ -680,6 +681,7 @@
 --      ["Flying Saucer Training"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Fly into space to fight off the invaders with barrels!"] = "", -- Space_Invasion
 --      ["Fly to the meteorite and detonate the explosives"] = "", -- A_Space_Adventure:cosmos
+--      ["Follow the path and destroy the next target."] = "", -- Basic_Training_-_Rope
 --      ["Forgetfulness: You will lose all your weapons each turn."] = "", -- Continental_supplies
 --      ["For the next crate, you have to do back jumps."] = "", -- Basic_Training_-_Movement
 --      ["Four Eyes"] = "", -- 
@@ -699,9 +701,7 @@
 --      ["“g=150”, where 150 is 150% of normal gravity."] = "", -- Gravity
 --      ["“g=50, g2=150, period=4000” for gravity changing|from 50 to 150 and back with period of 4000 ms."] = "", -- Gravity
 --      ["Galaxy Guardians"] = "", -- Big_Armory
---      ["Game Modifiers: "] = "",
 --      ["Game over!"] = "", -- Space_Invasion
-      ["GAME OVER!"] = "结束了!",
       ["Game Started!"] = "开始",
 --      ["Game? Was this a game to you?!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Gangsters"] = "", -- 
@@ -710,8 +710,6 @@
 --      ["Gasp! A smuggler!"] = "", -- A_Space_Adventure:desert01
 --      ["Gasp!"] = "", -- A_Space_Adventure:desert01
 --      ["Gathering fruits all day long."] = "", -- A_Classic_Fairytale:queen
---      ["Gear information hidden"] = "", -- HedgeEditor
---      ["Gear information shown"] = "", -- HedgeEditor
 --      ["Gear Placement Tool"] = "", -- HedgeEditor
 --      ["General information"] = "", -- Continental_supplies
 --      ["General information:"] = "", -- Continental_supplies
@@ -721,7 +719,7 @@
 --      ["Get Dense Cloud out of the pit!"] = "", -- A_Classic_Fairytale:journey
 --      ["Get him, Spike!"] = "", -- A_Space_Adventure:desert01
       ["Get on over there and take him out!"] = "上去把它拉下来!",
---      ["Get on the head of the mole"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Get on the head of the mole."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Get past the flower."] = "", -- A_Classic_Fairytale:journey
 --      ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01
 --      ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood
@@ -759,7 +757,6 @@
       ["GO! GO! GO!"] = "上!",
       ["Good birdy......"] = "乖鸟儿",
 --      ["Good bye!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Good Dude"] = "", -- User_Mission_-_The_Great_Escape
 --      ["Good idea, they'll never find us there!"] = "", -- A_Classic_Fairytale:united
 --      ["Good job!"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Good job! Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -770,7 +767,7 @@
 --      ["Good so far!"] = "",
 --      ["Good to go!"] = "",
 --      ["Good! You now control Cappy."] = "", -- Basic_Training_-_Movement
---      ["Go on top of the flower"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Go on top of the flower."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Go, quick!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Gorkij"] = "", -- A_Classic_Fairytale:journey
 --      ["Go surf!"] = "", -- WxW
@@ -793,7 +790,6 @@
 --      ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow
 --      ["Green"] = "", -- 
 --      ["Green Bananas"] = "", -- A_Space_Adventure:fruit01
---      ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Green double rings also give you a new flying saucer."] = "", -- A_Space_Adventure:ice02
 --      ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01
 --      ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01
@@ -803,11 +799,8 @@
 --      ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Greetings from the Navy, %s (%s), for being a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["Greetings, %s!"] = "", -- A_Classic_Fairytale:dragon
---      ["Greg"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
---      ["Grenade Group"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard
 --      ["Grenades explode after 1 to 5 seconds (you decide)."] = "", -- Basic_Training_-_Grenade
 --      ["Grenades with high bounciness bounce a lot and behave chaotic."] = "", -- Basic_Training_-_Grenade
---      ["Grenade Team"] = "", -- Basic_Training_-_Grenade
 --      ["Grenade Training"] = "", -- Basic_Training_-_Grenade
 --      ["Grenadiers"] = "", -- Basic_Training_-_Grenade
 --      ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor
@@ -848,7 +841,6 @@
 --      ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion
 --      ["Health Modification Mode"] = "", -- HedgeEditor
 --      ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor
---      ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
 --      ["Heavenly Defense"] = "", -- Tentacle_Terror
 --      ["Heavy"] = "",
 --      ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united
@@ -861,6 +853,7 @@
 --      ["Hedgehog Projectile"] = "", -- Continental_supplies
 --      ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies
 --      ["Hedgehogs can not be deleted."] = "", -- HedgeEditor
+--      ["Hedgehogs left: %d"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Hedgehogs will be revived after their death."] = "", -- Mutant
 --      ["Hedgehogs will start in the first waypoint."] = "", -- Racer
 --      ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab
@@ -876,7 +869,6 @@
 --      ["Help Enabled"] = "", -- HedgeEditor
 --      ["Helpers: Each team starts with %d helper points"] = "", -- Battalion
 --      ["Helpers: Hogs will get 1 out of 2 helpers randomly each turn"] = "", -- Battalion
---      ["Help Hog Solo to find all the parts of the anti-gravity device."] = "", -- A_Space_Adventure:cosmos
 --      ["Help me, Leaks!"] = "", -- A_Classic_Fairytale:journey
 --      ["Help me, please!!!"] = "", -- A_Classic_Fairytale:journey
 --      ["Help me, please!"] = "", -- A_Classic_Fairytale:journey
@@ -891,20 +883,20 @@
 --      ["Here you will find the current mission instructions."] = "", -- Basic_Training_-_Movement
 --      ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Heroic Wind"] = "", -- Continental_supplies
---      ["Hero Team"] = "", -- User_Mission_-_The_Great_Escape
 --      ["He's so brave..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["He was the lab assistant of Dr. Goodhogan, the inventor of the anti-gravity device."] = "", -- A_Space_Adventure:moon02
 --      ["He won't be selling us out anymore!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey, don't forget us! We still need to climb up!"] = "", -- A_Classic_Fairytale:family
 --      ["Hey, guys!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Hey guys!"] = "", -- A_Classic_Fairytale:united
---      ["Hey, Hog Solo! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey! I was supposed to collect it!"] = "", -- A_Space_Adventure:fruit02
+--      ["Hey, %s! Finally you have come!"] = "", -- A_Space_Adventure:moon01
 --      ["Hey, %s! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey
 --      ["Hidden"] = "", -- portal
 --      ["High Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["High Jump: [Backspace]"] = "", -- Basic_Training_-_Movement
+--      ["High Jump: Tap the [Curvy Arrow] shortly"] = "", -- Basic_Training_-_Movement
 --      ["--- Highland ---"] = "", -- Battalion
 --      ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander
 --      ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion
@@ -915,20 +907,24 @@
 --      ["Hill Guard"] = "", -- Bazooka_Battlefield
 --      ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01
 --      ["--- Hint ---"] = "", -- Battalion
---      ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow
 --      ["Hint: Drilling holes should solve everything."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: Hold down [M] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: If this mission panel disappears, you can|see it again by hitting the Pause or Quit key."] = "", -- Basic_Training_-_Movement
 --      ["Hint: It might be a good idea to place a girder before starting to drill. Just saying."] = "", -- A_Classic_Fairytale:family
 --      ["Hint: It might be easier if you vary the angle only slightly."] = "", -- Basic_Training_-_Bazooka
+--      ["Hint: Just select the parachute, it opens automatically when you fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion
 --      ["Hint: Launch the bazooka horizontally at full power."] = "", -- Basic_Training_-_Bazooka
---      ["Hint: Press [Esc] to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Pause the game to review the mission texts."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: Select the blow torch, aim and press [Fire]. Press [Fire] again to stop."] = "", -- A_Classic_Fairytale:journey
 --      ["Hint: Select the low gravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey
+--      ["Hint: Select the rope, [Up] or [Down] to aim, [Attack] to fire, directional keys to move."] = "", -- A_Classic_Fairytale:first_blood
+--      ["Hint: Select the Shoryuken and hit [Attack].|P.S.: You can use it mid-air."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Hint: %s needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family
 --      ["Hint: The rope only bends around objects.|When it doesn't hit anything, it's always straight."] = "", -- Basic_Training_-_Rope
 --      ["Hint: To jump higher, wait a bit before you hit “High Jump” a second time."] = "", -- Basic_Training_-_Movement
+--      ["Hint: To place a girder, select it,|then use [Left] and [Right] to select angle and length,|then choose a location for the girder."] = "", -- A_Classic_Fairytale:shadow
 --      ["Hint: Use the quit key to see the team’s continent."] = "", -- Continental_supplies
 --      ["Hint: When you shorten the rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope
 --      ["Hint: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey
@@ -962,24 +958,11 @@
 --      ["Hogminator"] = "", -- A_Classic_Fairytale:family
 --      ["Hog nueve"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog octo"] = "", -- A_Space_Adventure:fruit03
---      ["Hogonauts"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Hog onze"] = "", -- A_Space_Adventure:fruit03
 --      ["Hog Saturn"] = "", -- A_Space_Adventure:fruit03
 --      ["Hogs in sight!"] = "", -- Continental_supplies
 --      ["Hog Solo and GB"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
---      ["Hog Solo arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
 --      ["Hog Solo"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01, A_Space_Adventure:moon02
---      ["Hog Solo couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo escaped successfully!"] = "", -- A_Space_Adventure:fruit01
---      ["Hog Solo has to reach the last crates"] = "", -- A_Space_Adventure:fruit02
---      ["Hog Solo has to refuel his saucer."] = "", -- A_Space_Adventure:moon01
---      ["Hog Solo lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
---      ["Hog Solo wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["- Hogs will be revived"] = "", -- Capture_the_Flag
 --      ["- Hogs will drop the flag when killed"] = "", -- Capture_the_Flag
 --      ["Hog two"] = "", -- A_Space_Adventure:fruit03
@@ -989,12 +972,10 @@
 --      ["Homing Bee"] = "", -- Construction_Mode
 --      ["Honda"] = "", -- 
 --      ["Honest Lee"] = "", -- A_Classic_Fairytale:enemy
---      ["Hook"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
 --      ["Hooks"] = "", -- 
 --      ["Hooray! I actually did it! Hogera is safe!"] = "", -- A_Space_Adventure:final
 --      ["Hooray! I've found it, now I have to get back to Captain Lime!"] = "", -- A_Space_Adventure:fruit02
 --      ["Hooray! You are a champion!"] = "", -- A_Space_Adventure:ice02
-      ["Hooray!"] = "呼!",
 --      ["Hopeless case"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Hop on top of the next flower and advance to the left coast."] = "", -- A_Classic_Fairytale:journey
 --      ["Horns"] = "", -- 
@@ -1007,7 +988,7 @@
 --      ["However, if you fail to do so, she dies a most violent death, just like your friend! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, if you fail to do so, she dies a most violent death! Muahahaha!"] = "", -- A_Classic_Fairytale:journey
 --      ["However, my mates don't agree with me on letting you go..."] = "", -- A_Classic_Fairytale:dragon
---      ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
+--      ["However, the army of %s is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01
 --      ["How to Rope"] = "", -- Basic_Training_-_Rope
 --      ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen
 --      ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen
@@ -1027,7 +1008,6 @@
 --      ["I can't believe what I'm hearing!"] = "", -- A_Classic_Fairytale:backstab
 --      ["I can't let you go further because …"] = "", -- A_Classic_Fairytale:queen
 --      ["I can't wait any more, I have to save myself!"] = "", -- A_Classic_Fairytale:shadow
---      ["Ice"] = "", -- Basic_Training_-_Movement
 --      ["Ice Jake"] = "", -- A_Space_Adventure:ice01
 --      ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family
 --      ["Icy Girder: [3]"] = "", -- HedgeEditor
@@ -1085,7 +1065,6 @@
 --      ["I just found out that they have captured your princess!"] = "", -- A_Classic_Fairytale:family
 --      ["I just want the strange device you found!"] = "", -- A_Space_Adventure:ice01
 --      ["I just wonder where Ramon and Spiky disappeared..."] = "", -- A_Classic_Fairytale:journey
---      ["Ikeda"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["I know and I'm terribly sorry!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know, my hero!"] = "", -- A_Classic_Fairytale:epil
 --      ["I know that your resources are low due to the battle but I'll send two of my best hogs to assist you."] = "", -- A_Space_Adventure:fruit02
@@ -1113,6 +1092,7 @@
 --      ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen
 --      ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united
 --      ["IMPORTANT: To see the mission panel again, hold the mission panel key."] = "", -- Basic_Training_-_Movement
+--      ["IMPORTANT: To see the mission panel again, pause the game."] = "", -- Basic_Training_-_Movement
 --      ["Impressive...you are still dry as the corpse of a hawk after a week in the desert..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["%i ms"] = "", -- Gravity
 --      ["I'm so glad this is finally over!"] = "", -- A_Space_Adventure:final
@@ -1271,7 +1251,6 @@
 --      ["Kill the traitor, %s, or spare his life!"] = "", -- A_Classic_Fairytale:backstab
 --      ["--- King ---"] = "", -- Battalion
 --      ["King"] = "", -- Battalion
---      ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing
 --      ["--- King Mode ---"] = "", -- Battalion
 --      ["Knight"] = "", -- Battalion
 --      ["Knives"] = "", -- 
@@ -1290,7 +1269,7 @@
 --      ["Launch some bazookas to destroy the targets!"] = "", -- Basic_Training_-_Bazooka
 --      ["Leader"] = "", -- A_Classic_Fairytale:enemy
 --      ["Leaderbot"] = "", -- A_Classic_Fairytale:queen
---      ["Lead the Green Bananas to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
+--      ["Lead your allies to battle and eliminate all the enemies!"] = "", -- A_Space_Adventure:fruit01
 --      ["Leaks A Lot"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Leaks A Lot, depressed for killing his loved one, failed to save the village..."] = "", -- A_Classic_Fairytale:journey
 --      ["Leaks A Lot gave his life for his tribe! He should have survived!"] = "", -- A_Classic_Fairytale:first_blood
@@ -1305,7 +1284,6 @@
 --      ["Left/right: Choose crate contents"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type"] = "", -- Construction_Mode
 --      ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode
---      ["Left Tong"] = "", -- Bazooka_Battlefield
 --      ["Legs"] = "", -- 
 --      ["Less tools, more fun"] = "", -- Battalion
 --      ["Lestat"] = "", -- portal
@@ -1334,18 +1312,19 @@
 --      ["Lively Lifeguard"] = "",
 --      ["Lonely Cries"] = "", -- Continental_supplies
 --      ["Lonely Cries: [Rise the water if no hog is in the circle and deal 6 damage to all enemy hogs.]"] = "", -- Continental_supplies
---      ["Lonely Hog"] = "", -- ClimbHome
 --      ["Long Jump: [Enter]"] = "", -- Basic_Training_-_Movement
+--      ["Long Jump: Tap the [Curvy Arrow] button for long"] = "", -- Basic_Training_-_Movement, A_Classic_Fairytale:first_blood
 --      ["Long Live The Queen"] = "", -- A_Classic_Fairytale:queen
 --      ["Look around: [Mouse movement]"] = "", -- Basic_Training_-_Movement
+--      ["Look around: [Tap or swipe on the screen]"] = "", -- Basic_Training_-_Movement
 --      ["Look, boss! There is the target!"] = "", -- A_Space_Adventure:moon01
 --      ["Look, I had no choice!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! There's more of them!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Look out! We're surrounded by cannibals!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Looks like the whole world is falling apart!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Look to the left and do a backwards jump towards the mushroom."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Loon"] = "", -- The_Specialists
 --      ["Loopy"] = "", -- 
---      ["Lord Evil"] = "", -- Tentacle_Terror
 --      ["Losing Condition: Destroy"] = "", -- HedgeEditor
 --      ["Low Gravity: Gravity is %i%%"] = "", -- Gravity
 --      ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander
@@ -1365,7 +1344,6 @@
 --      ["Mario"] = "", -- 
 --      ["Mark gears for win/lose conditions"] = "", -- HedgeEditor
 --      ["Mark/unmark gear: [Left Click]"] = "", -- HedgeEditor
---      ["Mark"] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork
 --      ["- Massive weapon bonus on first turn"] = "", -- Continental_supplies
 --      ["Max Citrus"] = "", -- A_Space_Adventure:fruit01
 --      ["Maybe you should try an easier map next time."] = "", -- Racer
@@ -1380,7 +1358,6 @@
 --      ["Mega kill!"] = "", -- Mutant
 --      ["Meiwes"] = "", -- A_Classic_Fairytale:backstab
 --      ["mikade"] = "", -- 
---      ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer
 --      ["Mindy"] = "", -- A_Classic_Fairytale:united
 --      ["Mine Deployer"] = "",
 --      ["Mine Placement Mode"] = "", -- Construction_Mode
@@ -1399,12 +1376,12 @@
 --      ["Minion"] = "", -- A_Space_Adventure:moon01
 --      ["Minions"] = "", -- A_Space_Adventure:moon01
 --      ["Mission failed!"] = "", -- Big_Armory
-      ["MISSION FAILED"] = "任务失败", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Mission failure in %d s"] = "", -- Big_Armory
+--      ["Mission"] = "", -- HedgeEditor
 --      ["Mission lost!"] = "", -- Basic_Training_-_Grenade
 --      ["Mission Panel"] = "", -- Basic_Training_-_Movement
 --      ["Mission panel: [M]"] = "", -- Basic_Training_-_Movement
-      ["MISSION SUCCESSFUL"] = "任务成功", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+--      ["Mission succeeded!"] = "", -- portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, SimpleMission, HedgeEditor
 --      ["Mission won!"] = "", -- Basic_Training_-_Grenade
 --      ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02
 --      ["Mixed %d"] = "", -- WxW
@@ -1420,7 +1397,6 @@
 --      ["Monster kill!"] = "", -- Mutant
 --      ["Monsters"] = "", -- 
 --      ["Mooney"] = "", -- 
---      ["More Natives"] = "", -- A_Classic_Fairytale:epil
 --      ["Morris"] = "", -- 
 --      ["Most mines are not active."] = "", -- A_Space_Adventure:desert02
 --      ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01
@@ -1440,13 +1416,11 @@
 --      ["Nade Boy"] = "", -- Basic_Training_-_Grenade
 --      ["Nah, probably everyone was just stupid."] = "", -- A_Space_Adventure:final
 --      ["Name"] = "", -- A_Classic_Fairytale:queen
---      ["Nameless Heroes"] = "",
 --      ["Nancy Screw"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:queen
 --      ["Napalm"] = "", -- Construction_Mode
 --      ["Napalm Rocket"] = "", -- Continental_supplies
 --      ["Napalm rocket: [Fire a bomb with napalm!]"] = "", -- Continental_supplies
 --      ["Naranja Jed"] = "", -- A_Space_Adventure:fruit01
---      ["Natives"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united
 --      ["Naughty Ninja"] = "", -- User_Mission_-_Dangerous_Ducklings
 --      ["Near a PAotH base on the moon ..."] = "", -- A_Space_Adventure:moon01
 --      ["Near Secret Base 17 of PAotH in the rural Hogland ..."] = "", -- A_Space_Adventure:cosmos
@@ -1541,11 +1515,8 @@
 --      ["Oh, my!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oh, my! I forgot something!"] = "", -- A_Classic_Fairytale:queen
 --      ["Oh, my! This is even more entertaining than I've expected!"] = "", -- A_Classic_Fairytale:backstab
-      ["Oh no! Just try again!"] = "不!重新再来。", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Oh no, not %s!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
---      ["Oh no, the Green Bananas have betrayed Hog Solo and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
-      ["Oh no! Time's up! Just try again."] = "不!到点了,需要重新来。", --Bazooka, Shotgun, SniperRifle
---      ["Oh no! You failed! Just try again."] = "", -- Basic_Training_-_Cluster_Bomb
+--      ["Oh no, the companions have betrayed %s and stole the anti-gravity device part!"] = "", -- A_Space_Adventure:fruit02
 --      ["Oh no! You have died. Try again!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Oh! Please spare me. You can take all my treasures!"] = "", -- A_Space_Adventure:ice01
 --      ["Oh, silly me! I forgot that I'm the shaman."] = "", -- A_Classic_Fairytale:backstab
@@ -1567,9 +1538,9 @@
 --      ["One shall not judge one by one's appearance!"] = "", -- A_Classic_Fairytale:epil
 --      ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Oneye"] = "", -- portal
---      ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant
 --      ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant
+--      ["Only %s can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02
 --      ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard
 --      ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01
@@ -1581,6 +1552,7 @@
 --      ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01
 --      ["Oops! You have selected the wrong hedgehog! Just try again."] = "", -- Basic_Training_-_Movement
 --      ["Open ammo menu: [Right click]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
+--      ["Open ammo menu: Tap the [Suitcase]"] = "", -- Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Movement, Basic_Training_-_Rope
 --      ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood
       ["Opposing Team: "] = "对方队伍",
 --      ["Orange"] = "", -- 
@@ -1602,15 +1574,14 @@
 --      ["Patches"] = "", -- 
       ["Pathetic Hog #1"] = "可怜刺猬一号",
       ["Pathetic Hog #2"] = "可怜刺猬二号",
---      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
 --      ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02
 --      ["Pause: [P]"] = "", -- Basic_Training_-_Movement
+--      ["Pause: Tap the [Pause] button"] = "", -- Basic_Training_-_Movement
 --      ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW
 --      ["Penguin Roar"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hog’s health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Penguin roar: [Deal 15 damage + 10% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies
 --      ["Perfect! Now try to get the next crate without hurting yourself!"] = "", -- A_Classic_Fairytale:first_blood
---      ["Per-Hog Ammo"] = "",
 --      ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh
 --      ["Personal best: %.3f seconds"] = "", -- A_Space_Adventure:ice02
 --      ["Per team weapons"] = "", -- Continental_supplies
@@ -1619,7 +1590,6 @@
 --      ["Physicist"] = "", -- HedgeEditor
 --      ["Piano Strike"] = "", -- Construction_Mode
 --      ["Pikachu"] = "", -- 
---      ["Pincer Knights"] = "", -- Bazooka_Battlefield
 --      ["Pings left: %d"] = "", -- Space_Invasion
 --      ["Pink"] = "", -- 
 --      ["Pirates"] = "", -- 
@@ -1670,10 +1640,8 @@
 --      ["Please, stop releasing your \"smoke signals\"!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Please wait …"] = "", -- WxW
 --      ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion
---      ["points"] =
 --      ["--- Points ---"] = "", -- Battalion
 --      ["--- Points Mode ---"] = "", -- Battalion
---      ["point(s)"] = "", -- TargetPractice, Mutant
 --      ["Poison"] =
 --      ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02
 --      ["Poisonous, deals no damage."] = "", -- Continental_supplies
@@ -1693,37 +1661,37 @@
 --      ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to fight"] = "", -- A_Space_Adventure:moon01
 --      ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos
---      ["Prepare yourself"] = "",
+--      ["Prepare yourself, %s!"] = "", -- The_Specialists
 --      ["Press [Attack] (space bar by default) to start,|repeadedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] (space bar by default) to start,|repeatedly tap the up, left and right movement keys to accelerate."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Press [Attack] to begin."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Attack] to confirm."] = "", -- Continental_supplies
 --      ["Press [Attack] to select this continent!"] = "", -- Continental_supplies
 --      ["Press [Left] and [Right] to change the difficulty."] = "", -- A_Classic_Fairytale:first_blood
---      ["Press [Left] or [Right] to move around, [Enter] to jump"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Press [Left] or [Right] to move around, [Long Jump] to jump forwards."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Press [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW
 --      ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW
+--      ["Press [M] to see the mission texts"] = "", -- Basic_Training_-_Movement
 --      ["Press [Precise] to skip intro"] = "",
 --      ["Press [Up] and [Down] to move between menu items.|Press [Attack], [Left], or [Right] to toggle."] = "", -- WxW
 --      ["Prestigious Pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Princess"] = "", -- A_Classic_Fairytale:family, A_Classic_Fairytale:journey
 --      ["Princess Peach"] = "", -- 
---      ["Private Nolak"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["Problems, dude? Chillax!"] = "", -- A_Classic_Fairytale:epil
 --      ["Professional pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professional stunt pilot"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["Professor"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
 --      ["Professor Hogevil, then known as James Hogus, worked for PAotH back in my time."] = "", -- A_Space_Adventure:moon02
+--      ["Professor's Team"] = "", -- A_Space_Adventure:death01
 --      ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01
---      ["Pro Killers"] = "", -- Big_Armory
 --      ["Protect the King: When the king dies, so does the team"] = "", -- Battalion
 --      ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
---      ["Protect yourselves!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow
 --      ["Purple"] = "", -- 
 --      ["Pyro"] = "", -- HedgeEditor, The_Specialists
 --      ["Pyromancer"] = "", -- Battalion
 --      ["Quit: [Esc]"] = "", -- Basic_Training_-_Movement
 --      ["Race complexity limit reached"] = "", -- Racer, TechRacer
+--      ["Race failed!"] = "", -- A_Space_Adventure:moon02
 --      ["Racer"] = "", -- Racer
 --      ["Racer tool"] = "", -- Racer
 --      ["Race"] = "", -- TrophyRace
@@ -1759,23 +1727,19 @@
 --      ["Replenishment: Weapons are restocked on turn start of a new hog"] = "", -- Highlander
 --      ["Repositioning Mode"] = "", -- HedgeEditor
 --      ["REPOSITIONING MODE"] = "", -- HedgeEditor
---      ["rescues"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Rescue the imprisoned PAotH team and get the fuel!"] = "", -- A_Space_Adventure:moon01
 --      ["Respawner"] = "", -- Construction_Mode
 --      ["Respawner: Resurrects dead hogs."] = "", -- Construction_Mode
 --      ["Resurrector"] = "", -- Construction_Mode
 --      ["Retract/Extend rope: [Up]/[Down]"] = "", -- Basic_Training_-_Rope
 --      ["- Return the enemy flag to your base to score"] = "", -- Capture_the_Flag
-        [" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = "-带回敌人旗帜得分| -第一支3次夺旗队伍获胜| - 只有旗帜在己方基地才算| -带旗刺猬消逝则旗帜落下| -落下的旗帜使用方式不变| -损失的刺猬瞬间还原",
 --      ["Return to Leaks A Lot!"] = "", -- A_Classic_Fairytale:shadow
 --      ["Return to the mission menu by pressing the \"Go back\" button."] = "", -- A_Space_Adventure:cosmos
 --      ["Return to the Surface"] = "", -- A_Space_Adventure:fruit02
 --      ["Return to the training menu by pressing the “Go back” button."] = "", -- Basic_Training_-_Movement
---      ["Rhombus"] = "", -- Basic_Training_-_Movement
 --      ["Rider"] = "", -- portal
 --      ["Rifleman"] = "", -- Battalion
 --      ["Righteous Beard"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:queen, A_Classic_Fairytale:united
---      ["Right Tong"] = "", -- Bazooka_Battlefield
 --      ["Ripe"] = "", -- 
 --      ["Rise the water if nobody else is in the circle and deal 6 damage to all enemy hogs."] = "", -- Continental_supplies
 --      ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01
@@ -1784,8 +1748,8 @@
 --      ["Roof"] = "", -- WxW
 --      ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Rope Master"] = "", -- Basic_Training_-_Rope
---      ["Roper"] = "", -- SpeedShoppa
 --      ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes
+--      ["Ropes can be fired again in the air!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Rope Team"] = "", -- Basic_Training_-_Rope
 --      ["Rope Training"] = "", -- Basic_Training_-_Rope
 --      ["Rope Weapons"] = "", -- Basic_Training_-_Rope
@@ -1799,7 +1763,6 @@
 --      ["Round limit:"] = "", -- TechRacer
 --      ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer
 --      ["Round's slowest lap: %.3fs by %s"] = "", -- TrophyRace
---      ["Rounds until Sudden Death: %d"] = "", -- Battalion
 --      ["RS1"] = "", -- A_Space_Adventure:fruit03
 --      ["RS2"] = "", -- A_Space_Adventure:fruit03
 --      ["Rubber"] = "", -- Construction_Mode, HedgeEditor
@@ -1825,10 +1788,17 @@
 --      ["Salvation was one step closer now..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Sam"] = "", -- A_Space_Adventure:cosmos
 --      ["Sandals?! I thought you left your ring!"] = "", -- A_Classic_Fairytale:queen
+--      ["%s and GB"] = "", -- A_Space_Adventure:fruit02
 --      ["%s and %s enter the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sandstorm"] = "", -- A_Space_Adventure:desert01
 --      ["Sandy"] = "", -- A_Space_Adventure:desert01
---      ["Save as many hapless hogs as possible!"] = "",
+--      ["%s arrived at the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Ice Planet!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the meteorite!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the moon!"] = "", -- A_Space_Adventure:cosmos
+--      ["%s arrived at the Planet of Death!"] = "", -- A_Space_Adventure:cosmos
+--      ["Save as many hogs as possible!"] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey
 --      ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow
 --      ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor
@@ -1840,9 +1810,9 @@
 --      ["Scallywag"] = "", -- 
 --      ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab
 --      ["Scenario"] = "", -- Big_Armory, portal, User_Mission_-_Bamboo_Thicket, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork_2, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape
---      ["Scenario failed!"] = "", -- SimpleMission
 --      ["Scientist"] = "", -- Battalion
 --      ["%s climbed home in %d seconds!"] = "", -- ClimbHome
+--      ["%s (contd.)"] = "", -- A_Classic_Fairytale:epil
 --      ["Score: %d"] = "", -- Space_Invasion
 --      ["Score goal: %d"] = "", -- Control
 --      ["Score graph"] = "", -- Mutant, Space_Invasion
@@ -1852,6 +1822,7 @@
 --      ["Scores"] = "", -- Mutant
 --      ["Scores:"] = "", -- Mutant
 --      ["Scoring: "] = "", -- Mutant
+--      ["%s couldn't escape, try again!"] = "", -- A_Space_Adventure:fruit01
 --      ["Script parameter examples:"] = "", -- Gravity
 --      ["%s (+%d)"] = "", -- Battalion
 --      ["%s: %d"] = "", -- Capture_the_Flag, Control
@@ -1864,10 +1835,9 @@
 --      ["%s died … and lives again!"] = "", -- Construction_Mode
 --      ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome
 --      ["%s, %d sec"] = "", -- Continental_supplies
---      ["Search for the device with the help of the other hedgehogs "] = "", -- A_Space_Adventure:fruit02
+--      ["Search for the device with the help of the other hedgehogs."] = "", -- A_Space_Adventure:fruit02
 --      ["Searching in the dust"] = "", -- A_Space_Adventure:desert01
 --      ["Searching the stars!"] = "", -- A_Space_Adventure:cosmos
---      ["seconds"] = "", -- ClimbHome
 --      ["Seduction"] = "", -- Continental_supplies
 --      ["Seems like every time you take a \"walk\", the enemy finds us!"] = "", -- A_Classic_Fairytale:backstab
 --      ["See that crate farther on the right?"] = "", -- A_Classic_Fairytale:first_blood
@@ -1894,6 +1864,7 @@
 --      ["Select your continent with [Up]/[Down] or by selecting a representative weapon."] = "", -- Continental_supplies
 --      ["%s enters the battlefield"] = "", -- A_Space_Adventure:fruit01
 --      ["Sergey"] = "", -- 
+--      ["%s escaped successfully!"] = "", -- A_Space_Adventure:fruit01
 --      ["Set bounciness: [Left Shift] + [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set detonation timer: [1]-[5]"] = "", -- Basic_Training_-_Grenade
 --      ["Set Health: [Left Click]"] = "", -- HedgeEditor
@@ -1917,10 +1888,12 @@
 --      ["%s has been killed before taking enough damage first."] = "", -- SimpleMission
 --      ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has been rescued from death"] = "", -- Construction_Mode
+--      ["%s has dropped the flag!"] = "", -- CTF_Blizzard
 --      ["%s has fallen victim to gravity."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["%s has mutated! +2 points"] = "", -- Mutant
 --      ["%s has passed the best height of %s!"] = "", -- ClimbHome
 --      ["%s has scored!"] = "", -- Capture_the_Flag
+--      ["%s has to refuel the saucer."] = "", -- A_Space_Adventure:moon01
 --      ["%s hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil
 --      ["sheepluva"] = "", -- 
@@ -1937,8 +1910,6 @@
 --      ["Shinobi"] = "", -- 
 --      ["%s hit the ground."] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Shoppa Love"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
---      ["Shoppa Union"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes, Challenge_-_Speed_Shoppa_-_ShoppaKing
---      ["Shoppers"] = "", -- SpeedShoppa
 --      ["Shotgun"] = "", -- Continental_supplies
 --      ["Sigh."] = "", -- A_Classic_Fairytale:epil
 --      ["Silly"] = "",
@@ -1951,11 +1922,11 @@
 --      ["%s is now as poor as a church mouse"] = "", -- Construction_Mode
 --      ["%s is now a zombie hedgehog"] = "", -- Construction_Mode
 --      ["%s is suddenly low on ammo"] = "", -- Construction_Mode
---      ["Skip your turn to try again."] = "", -- Basic_Training_-_Rope
 --      ["Skulls"] = "", -- Bazooka_Battlefield
 --      ["Slimer"] = "", -- 
 --      ["Slippery"] = "", -- A_Classic_Fairytale:journey
 --      ["%s lost all the weapons"] = "", -- Construction_Mode
+--      ["%s lost, try again!"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:death02, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:desert03, A_Space_Adventure:final, A_Space_Adventure:fruit01, A_Space_Adventure:fruit02, A_Space_Adventure:fruit03, A_Space_Adventure:ice01, A_Space_Adventure:moon01
 --      ["Slot %d: %s"] = "", -- Frenzy
 --      ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy
 --      ["Slowpoke"] = "", -- 
@@ -1969,6 +1940,7 @@
 --      ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy
 --      ["Smugglers"] = "", -- A_Space_Adventure:desert01
+--      ["%s must collect the final crates."] = "", -- A_Space_Adventure:fruit02
 --      ["%s must skip this turn for rule violation."] = "", -- WxW
 --      ["Sneaks"] = "", -- Bazooka_Battlefield
 --      ["%s never got the ninja diploma."] = "", -- ClimbHome
@@ -1977,10 +1949,8 @@
 --      ["Sniper"] = "", -- HedgeEditor, The_Specialists
 --      ["Sniper Rifle"] = "", -- Continental_supplies
       ["Sniper Training"] = "狙击训练",
-      ["Sniperz"] = "狙击手",
 --      ["So, as promised I have brought you where I think that the device you are looking for is hidden."] = "", -- A_Space_Adventure:fruit02
 --      ["So far, you had infinite ropes, but in the|real world, ropes are usually limited."] = "", -- Basic_Training_-_Rope
---      ["So Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["So, I believe that it's a good place to start."] = "", -- A_Space_Adventure:desert01
 --      ["So, I kindly ask for your help."] = "", -- A_Space_Adventure:fruit01
@@ -1990,11 +1960,12 @@
 --      ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03
 --      ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen
 --      ["Some weapons can be dropped from the rope."] = "", -- Basic_Training_-_Rope
---      ["Somewhere else on the planet of fruits, Captain Lime helps Hog Solo"] = "", -- A_Space_Adventure:fruit02
---      ["Somewhere else on the planet of fruits Hog Solo gets closer to the device"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, Captain Lime helps %s"] = "", -- A_Space_Adventure:fruit02
+--      ["Somewhere else on the planet of fruits, %s gets closer to the device"] = "", -- A_Space_Adventure:fruit02
 --      ["Somewhere on the Planet of Fruits a terrible war is about to begin ..."] = "", -- A_Space_Adventure:fruit01
 --      ["Somewhere on the uninhabitable Death Planet ..."] = "", -- A_Space_Adventure:death01
 --      ["So, now I got the last part and I have your friends captured."] = "", -- A_Space_Adventure:death01
+--      ["So, %s, here we are ..."] = "", -- A_Space_Adventure:cosmos
 --      ["So the princess was never heard of again ..."] = "", -- A_Classic_Fairytale:family
 --      ["So, uhmm, how did you manage to teleport them so far?"] = "", -- A_Classic_Fairytale:epil
 --      ["Sour"] = "", -- 
@@ -2095,8 +2066,6 @@
 --      ["Structure Placement Mode"] = "", -- Construction_Mode
 --      ["Structure Placer"] = "", -- Construction_Mode
 --      ["Stupid, stupid Hogerians!"] = "", -- A_Space_Adventure:final
---      ["Subject 1"] = "", -- portal
---      ["Subjects"] = "", -- portal
 --      ["Subtract %d"] = "", -- HedgeEditor
 --      ["--- Sudden Death ---"] = "", -- Battalion
 --      ["Summer Squash"] = "", -- A_Space_Adventure:fruit01
@@ -2113,7 +2082,7 @@
 --      ["Surfer! +15 points!"] = "", -- Space_Invasion
 --      ["Surfer!"] = "", -- WxW
 --      ["Surprise supplies: Get 1-3 random weapons each turn."] = "", -- Continental_supplies
---      ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:shadow
+--      ["Survive!"] = "", -- A_Classic_Fairytale:shadow
 --      ["%s violated the “All But Last” rule and will be penalized."] = "", -- WxW
 --      ["%s violated the “Kill The Leader” rule and will be penalized."] = "", -- WxW
 --      ["Swap place with a random enemy in the circle."] = "", -- Continental_supplies
@@ -2132,6 +2101,7 @@
 --      ["%s! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united
 --      ["Swing, Leaks A Lot, on the wings of the wind!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Swing: [Left]/[Right]"] = "", -- Basic_Training_-_Rope
+--      ["%s wins, congratulations!"] = "", -- A_Space_Adventure:moon01
 --      ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome
 --      ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer
 --      ["switch"] = "", -- Continental_supplies
@@ -2145,6 +2115,7 @@
 --      ["Switch Hog"] = "", -- Construction_Mode
 --      ["Switch: Select weapon special"] = "", -- Continental_supplies
 --      ["Switch: Toggle crate radar"] = "", -- WxW
+--      ["%s won!"] = "", -- A_Space_Adventure:fruit01
 --      ["Swords"] = "", -- Bazooka_Battlefield
 --      ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon
 --      ["%s, you may choose the rules."] = "", -- WxW
@@ -2153,6 +2124,8 @@
 --      ["Tails"] = "", -- 
 --      ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon
 --      ["Tall Potato"] = "", -- A_Space_Adventure:fruit01
+--      ["Tap [Pause] to see the mission texts"] = "", -- Basic_Training_-_Movement
+--      ["Tap the “rotating arrow” button on the left|until you have selected Cappy, the hedgehog with the cap!"] = "", -- Basic_Training_-_Movement
 --      ["Target"] = "", -- HedgeEditor
 --      ["Target Placement Mode"] = "", -- Construction_Mode
 --      ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor
@@ -2168,15 +2141,18 @@
 --      ["Tatters"] = "", -- 
 --      ["Team %d"] = "", -- SimpleMission
       ["Team %d: "] = "队伍 %d",
+--      ["Team highscore: %d"] = "", -- Utils
 --      ["Team Identity Mode"] = "", -- HedgeEditor
 --      ["TEAM IDENTITY MODE"] = "", -- HedgeEditor
---      ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove
+--      ["Team lowscore: %d"] = "", -- Utils
 --      ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion
+--      ["Team's best time: %.3fs"] = "", -- Utils
 --      ["Team Scores:"] = "", -- Control
 --      ["Team scores:"] = "", -- Space_Invasion
+--      ["Team's longest time: %.3fs"] = "", -- Utils
+--      ["Team's top accuracy: %d%"] = "", -- Utils
 --      ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2
 --      ["Teamwork"] = "", -- User_Mission_-_Teamwork
---      ["Team Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
 --      ["TechRacer"] = "", -- TechRacer
 --      ["Teleporation Node"] = "", -- Construction_Mode
 --      ["Teleportation Mode"] = "", -- Construction_Mode
@@ -2268,11 +2244,12 @@
 --      ["The forgotten continent"] = "", -- Continental_supplies
 --      ["The giant umbrella from the last crate should help break the fall."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Great Escape"] = "", -- User_Mission_-_The_Great_Escape
---      ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01
+--      ["- The green target must survive"] = "", -- HedgeEditor
+--      ["- The green targets must survive"] = "", -- HedgeEditor
 --      ["The guardian"] = "", -- A_Classic_Fairytale:shadow
 --      ["The hardships of the war turned %s (%s) into a killing machine: %d invaders destroyed in one round!"] = "", -- Space_Invasion
+--      ["The health of your current hedgehog|is shown at the top right corner."] = "", -- Basic_Training_-_Movement
 --      ["The hedgehog with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant
---      ["The Hogies"] = "", -- Target_Practice_-_Cluster_Bomb
 --      ["The Hospital"] = "", -- 
 --      ["The Individualist"] = "", -- A_Classic_Fairytale:shadow
 --      ["Their buildings were very primitive back then, even for an uncivilised island."] = "", -- A_Classic_Fairytale:united
@@ -2290,7 +2267,6 @@
 --      ["The Mutant has super-weapons and a lot of health."] = "", -- Mutant
 --      ["The Mutant loses health quickly, but gains health by killing."] = "", -- Mutant
 --      ["The Mutant loses health quickly if he doesn't keep scoring kills."] = "", -- Mutant
---      ["The Nameless One"] = "",
 --      ["The Navy greets %s for managing to get in a distance of %d away from the mainland!"] = "", -- ClimbHome
 --      ["The next 4 times you play the \"The last encounter\" mission you'll get 20 more hit points and a laser sight."] = "", -- A_Space_Adventure:death02
 --      ["The next crate is an utility crate."] = "", -- Basic_Training_-_Movement
@@ -2304,6 +2280,7 @@
 --      ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil
 --      ["The oppression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
 --      ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen
+--      ["The other hog has died, he should have survived!"] = "", -- A_Space_Adventure:moon02
 --      ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The Police"] = "", -- 
 --      ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen
@@ -2328,7 +2305,7 @@
 --      ["The Showdown"] = "", -- A_Classic_Fairytale:shadow
 --      ["The Slaughter"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:first_blood
 --      ["The Society of Perfectionists greets %s (%s): No misses and %d hits in its best round."] = "", -- Space_Invasion
---      ["THE SPECIALISTS"] = "",
+--      ["The Specialists: Each hedgehog starts with its own weapon set"] = "", -- The_Specialists
 --      ["The spinning arrows above your hedgehog show|which hedgehog is selected right now."] = "", -- Basic_Training_-_Movement
 --      ["The spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
 --      ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood
@@ -2376,7 +2353,6 @@
 --      ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer
 --      ["This also increases the effectiveness of Medicine."] = "", -- Continental_supplies
 --      ["This game wasn’t really exciting."] = "", -- Space_Invasion
---      ["This Hog Solo is so naive! When he returns I'll shoot him and keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This is a new personal best, congratulations!"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert02, A_Space_Adventure:fruit03
 --      ["This is a new personal best time, congratulations!"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["This is Cappy."] = "", -- Basic_Training_-_Movement
@@ -2394,6 +2370,7 @@
 --      ["This rain is really something..."] = "",
 --      ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome
 --      ["This seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01
+--      ["This %s is so naive! I'm going to shoot this fool so I can keep that device for myself!"] = "", -- A_Space_Adventure:fruit02
 --      ["This was an awesome performance! But this challenge can be finished with even just one RC plane. Can you figure out how?"] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["This will be fun!"] = "", -- A_Classic_Fairytale:enemy
 --      ["This will be useful when I need a new platform or if I want to rise."] = "", -- portal
@@ -2434,11 +2411,11 @@
 --      ["To begin with the training, hit the attack key!"] = "", -- Basic_Training_-_Movement
 --      ["To begin with the training, select the bazooka from the ammo menu!"] = "", -- Basic_Training_-_Bazooka
 --      ["To begin with the training, select the grenade from the ammo menu!"] = "", -- Basic_Training_-_Grenade
+--      ["To begin with the training, tap the attack button!"] = "", -- Basic_Training_-_Movement
 --      ["To finish hedgehog selection, just do anything|with him, like walking."] = "", -- Basic_Training_-_Movement
 --      ["To get over the next obstacles, keep some distance from the wall before you back jump."] = "", -- Basic_Training_-_Movement
 --      ["To get over the water, you have to do multiple|rope shots and swings."] = "", -- Basic_Training_-_Rope
 --      ["Toggle Editing Weapons and Tools: [Precise]+[2]"] = "", -- HedgeEditor
---      ["Toggle Gear Information: [Precise]+[3]"] = "", -- HedgeEditor
 --      ["Toggle Help: [Precise]+[1]"] = "", -- HedgeEditor
 --      ["Toggle Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor
 --      ["Toggle Shield: [Long jump]"] = "", -- Space_Invasion
@@ -2448,14 +2425,14 @@
 --      ["Too bad! Then you should really leave!"] = "", -- A_Space_Adventure:fruit01
 --      ["Too slow! Try again ..."] = "", -- A_Space_Adventure:moon02
 --      ["Top-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"] = "", -- A_Classic_Fairytale:shadow
 --      ["To reach higher ground, walk to a ledge, look to the left, then do a back jump."] = "", -- Basic_Training_-_Movement
 --      ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey
 --      ["To the caves..."] = "", -- A_Classic_Fairytale:united
 --      ["Touch all waypoints as fast as you can!"] = "", -- Racer
---      ["To win the game, Hog Solo has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
+--      ["- Touch the sparkles near your base to teleport"] = "", -- CTF_Blizzard
+--      ["To win the game, %s has to get the bottom crates and come back to the surface."] = "", -- A_Space_Adventure:fruit02
 --      ["To win the game you had to collect the 2 crates with no specific order."] = "", -- A_Space_Adventure:desert01
---      ["To win the game you have to eliminate all your enemies."] = "", -- A_Space_Adventure:death01
+--      ["To win the game you have to eliminate Professor Hogevil."] = "", -- A_Space_Adventure:death01
 --      ["To win the game you have to find the right crate."] = "", -- A_Space_Adventure:desert01
 --      ["To win the game you have to go next to Thanta."] = "", -- A_Space_Adventure:ice01
 --      ["To win the game you have to go to the surface."] = "", -- A_Space_Adventure:desert02
@@ -2463,13 +2440,10 @@
 --      ["To win the game you have to stand next to Thanta."] = "", -- A_Space_Adventure:ice01
       ["Toxic Team"] = "腐坏的队伍", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["Track completed!"] = "", -- Racer, TechRacer
---      ["Trainee"] = "", -- TargetPractice
 --      ["Training"] = "", -- Basic_Training_-_Flying_Saucer, Basic_Training_-_Rope
 --      ["Training complete!"] = "", -- Basic_Training_-_Flying_Saucer
---      ["Training Team"] = "", -- TargetPractice
 --      ["Traitors"] = "", -- A_Classic_Fairytale:epil
 --      ["Traitors don't get to shout around here!"] = "", -- A_Classic_Fairytale:epil
---      ["Trapped"] = "", -- Basic_Training_-_Movement
 --      ["Trapper"] = "", -- HedgeEditor
 --      ["Travel carefully as your fuel is limited"] = "", -- A_Space_Adventure:cosmos
 --      ["Travel to all the neighbor planets and collect all the pieces"] = "", -- A_Space_Adventure:cosmos
@@ -2486,7 +2460,6 @@
 --      ["Try to land softly, as you can still take fall damage!"] = "", -- Basic_Training_-_Flying_Saucer
 --      ["Try to protect the chief! You won't lose if he dies, but it is advised that he survives."] = "", -- A_Classic_Fairytale:united
 --      ["Try to reach and destroy the next target quickly."] = "", -- Basic_Training_-_Rope
-      ["T_T"] = "T_T",
 --      ["Tumbler"] = "", -- Tumbler
 --      ["Turn around: [Left Shift] + [Left]/[Right]"] = "", -- Basic_Training_-_Movement
 --      ["Turning Around"] = "", -- Basic_Training_-_Movement
@@ -2505,7 +2478,6 @@
 --      ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy
 --      ["Ukemi"] = "", -- 
 --      ["Ultra kill!"] = "", -- Mutant
---      ["Ultrasoldier"] = "", -- Big_Armory
 --      ["unC0Rr"] = "", -- 
 --      ["Under Construction"] = "", -- A_Classic_Fairytale:shadow
 --      ["Under normal circumstances we could easily defeat them but we have kindly sent most of our men to the Kingdom of Sand to help with the annual dusting of the king's palace."] = "", -- A_Space_Adventure:fruit01
@@ -2529,7 +2501,6 @@
 --      ["Unit 883"] = "", -- 
 --      ["United We Stand"] = "", -- A_Classic_Fairytale:united
 --      ["Unlike bazookas, grenades are not influenced by wind."] = "", -- Basic_Training_-_Grenade
---      ["Unlimited Attacks"] = "",
 --      ["Unlimited Attacks: Attacks don't end your turn"] = "", -- User_Mission_-_Diver, User_Mission_-_Nobody_Laugh, User_Mission_-_Spooky_Tree
 --      ["Unlucky Sods"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Unstoppable!"] = "",
@@ -2545,13 +2516,14 @@
 --      ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["User Challenge"] = "",
 --      ["!"] = "", -- User_Mission_-_Dangerous_Ducklings
+--      ["User Mission"] = "", -- HedgeEditor
 --      ["Use the attack key twice to change the flying saucer while being in air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the attack key twice to change the flying saucer while floating in mid-air."] = "", -- A_Space_Adventure:ice02
 --      ["Use the bazooka and the flying saucer to get the freezer."] = "", -- A_Space_Adventure:ice01
 --      ["Use the flying saucer from the crate to fly to the moon."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly the other planets."] = "", -- A_Space_Adventure:cosmos
 --      ["Use the flying saucer to fly to the other planets."] = "", -- A_Space_Adventure:cosmos
---      ["Use the parachute ([Space] while in air) to get the next crate"] = "", -- A_Classic_Fairytale:first_blood
+--      ["Use the parachute to get the next crate."] = "", -- A_Classic_Fairytale:first_blood
 --      ["Use the portal gun to get to the next crate, then use the new gun to get to the final destination!|"] = "", -- A_Classic_Fairytale:dragon
 --      ["Use the RC plane and destroy the all the targets."] = "", -- A_Space_Adventure:desert03
 --      ["Use the rope in order to catch the blue hedgehog"] = "", -- A_Space_Adventure:moon02
@@ -2585,7 +2557,6 @@
 --      ["Victory Condition: Collect"] = "", -- HedgeEditor
 --      ["Victory Condition: Destroy"] = "", -- HedgeEditor
 --      ["Victory for %s!"] = "", -- Capture_the_Flag
-      ["Victory for the "] = "胜利属于",
 --      ["Violence is not the answer to your problems!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos
 --      ["Vladimir"] = "", -- 
@@ -2604,9 +2575,6 @@
 --      ["Walls left: %d"] = "", -- WxW
 --      ["Wall to wall"] = "", -- WxW
 --      ["Waluigi"] = "", -- 
---      ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["Wannabe Ropers"] = "", -- Basic_Training_-_Rope
---      ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge
 --      ["Wario"] = "", -- 
 --      ["Warming Up"] = "", -- Basic_Training_-_Grenade
 --      ["Warning: Fire cake detected"] = "", -- ClimbHome
@@ -2635,7 +2603,6 @@
 --      ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion
 --      ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion
 --      ["Weapon specials: Some weapons have special modes (see weapon description)."] = "", -- Continental_supplies
---      ["Weapons Reset"] = "",
 --      ["Weapons reset: The weapons are reset after each turn."] = "", -- WxW
 --      ["We are indeed."] = "", -- A_Classic_Fairytale:backstab
 --      ["We can't defeat them!"] = "", -- A_Classic_Fairytale:shadow
@@ -2652,9 +2619,9 @@
 --      ["We have to hurry! Are you armed?"] = "", -- A_Space_Adventure:moon01
 --      ["We have to protect the village!"] = "", -- A_Classic_Fairytale:united
 --      ["We have to unite and defeat those cylergs!"] = "", -- A_Classic_Fairytale:enemy
---      ["Welcome Hog Solo, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome home! Please take a seat"] = "", -- ClimbHome
 --      ["Welcome, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey
+--      ["Welcome, %s, surprised to see me?"] = "", -- A_Space_Adventure:death01
 --      ["Welcome to the Death Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Desert Planet!"] = "", -- A_Space_Adventure:cosmos
 --      ["Welcome to the Fruit Planet!"] = "", -- A_Space_Adventure:cosmos
@@ -2821,16 +2788,16 @@
 --      ["You can’t open a portal on the blue surface."] = "", -- portal
 --      ["You can use the other 2 hogs to assist you."] = "", -- A_Space_Adventure:fruit02
 --      ["You can use the rope to reach new places."] = "", -- Basic_Training_-_Rope
---      ["You choose well, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You choose well, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You completed the mission in %.3f seconds."] = "", -- A_Space_Adventure:ice02
 --      ["You completed the mission in %d rounds."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03
---      ["You couldn't have come to a worse time, Hog Solo!"] = "", -- A_Space_Adventure:fruit01
+--      ["You couldn't have come to a worse time, %s!"] = "", -- A_Space_Adventure:fruit01
 --      ["You couldn't possibly believe that after refusing my offer I'd just let you go!"] = "", -- A_Classic_Fairytale:journey
 --      ["You'd almost swear the water was rising!"] = "",
 --      ["You'd better watch your steps..."] = "", -- A_Classic_Fairytale:journey
 --      ["You defended yourself against Captain Lime."] = "", -- A_Space_Adventure:fruit02
---      ["You defended yourself against the Fruit Assassins."] = "", -- A_Space_Adventure:fruit02
---      ["You did great, Hog Solo! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
+--      ["You defended yourself against %s."] = "", -- A_Space_Adventure:fruit02
+--      ["You did great, %s! However, we aren't out of danger yet!"] = "", -- A_Space_Adventure:cosmos
 --      ["You did not make it in time, try again!"] = "", -- Basic_Training_-_Rope
 --      ["You don't deserve my sacrifice!"] = "", -- A_Classic_Fairytale:queen
 --      ["You drove Professor Hogevil away."] = "", -- A_Space_Adventure:moon01
@@ -2846,12 +2813,12 @@
 --      ["You got me!"] = "", -- A_Space_Adventure:moon02
 --      ["You had %.1fs remaining on the clock (+%d points)."] = "", -- TargetPractice
 --      ["You had %.2fs remaining on the clock (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle
---      ["You had %d additional flying saucers left."] = "", -- A_Space_Adventure:ice02
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: you might want to use some mines..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: You might want to use some mines ..."] = "", -- A_Classic_Fairytale:backstab
 --      ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01
 --      ["You have activated Switch Hedgehog!"] = "", -- Basic_Training_-_Movement
 --      ["You have beaten the challenge!"] = "", -- ClimbHome
+--      ["You have beaten the team record, congratulations!"] = "", -- Utils
 --      ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab
 --      ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united
 --      ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01
@@ -2870,7 +2837,6 @@
 --      ["You have eliminated all visible enemy hedgehogs!"] = "", -- A_Space_Adventure:fruit01
 --      ["You have eliminated Professor Hogevil."] = "", -- A_Space_Adventure:moon01
 --      ["You have eliminated the evil minions."] = "", -- A_Space_Adventure:moon01
---      ["You have eliminated the whole evil team. You're pretty tough!"] = "", -- A_Space_Adventure:moon01
 --      ["You have escaped successfully."] = "", -- A_Space_Adventure:desert02
 --      ["You have failed to complete your task, young one!"] = "", -- A_Classic_Fairytale:journey
 --      ["You have failed to save the tribe!"] = "", -- A_Classic_Fairytale:backstab
@@ -2924,6 +2890,7 @@
 --      ["You have to travel again"] = "", -- A_Space_Adventure:cosmos
 --      ["You have to try again!"] = "", -- A_Space_Adventure:cosmos
 --      ["You have triggered the secret Do-Not-Rope-to-the-Moon Defense System."] = "", -- A_Space_Adventure:cosmos
+--      ["You have unlocked the target radar!"] = "", -- TargetPractice
 --      ["You have used %d flying saucers."] = "", -- A_Space_Adventure:ice02
 --      ["You have used %d RC planes."] = "", -- User_Mission_-_RCPlane_Challenge
 --      ["You have used only 1 RC plane. Outstanding!"] = "", -- User_Mission_-_RCPlane_Challenge
@@ -2942,10 +2909,9 @@
 --      ["You'll have only 2 watermelon bombs during the game."] = "", -- A_Space_Adventure:fruit03
 --      ["You'll have only one RC plane at the start of the mission."] = "", -- A_Space_Adventure:desert03
 --      ["You'll have to eliminate Captain Lime at the end."] = "", -- A_Space_Adventure:fruit02
---      ["You'll have to eliminate the Fruit Assassins at the end."] = "", -- A_Space_Adventure:fruit02
+--      ["You'll have to eliminate %s at the end."] = "", -- A_Space_Adventure:fruit02
 --      ["You'll lose if you die or if your time is up."] = "", -- A_Space_Adventure:moon02
 --      ["You'll see what I mean!"] = "", -- A_Classic_Fairytale:enemy
---      ["You lose!"] = "", -- Basic_Training_-_Sniper_Rifle, Big_Armory, Basic_Training_-_Bazooka, TargetPractice, ClimbHome
 --      ["You lost your target, try again!"] = "", -- TargetPractice
 --      ["You may find it handy."] = "", -- A_Space_Adventure:cosmos
 --      ["You may only attack from a rope!"] = "", -- WxW
@@ -2967,8 +2933,7 @@
 --      ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice
 --      ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice
 --      ["Your ammo is limited this time."] = "", -- Basic_Training_-_Bazooka
---      ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy
---      ["Your deaths will be avenged, Natives!"] = "", -- A_Classic_Fairytale:enemy
+--      ["Your deaths will be avenged, %s!"] = "", -- A_Classic_Fairytale:enemy
 --      ["Your death will not be in vain, Dense Cloud!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You're a coward!"] = "", -- A_Classic_Fairytale:queen
 --      ["You're...alive!? But we saw you die!"] = "", -- A_Classic_Fairytale:backstab
@@ -2996,21 +2961,21 @@
 --      ["Your next task is to collect some crates by using the rope!"] = "", -- A_Classic_Fairytale:first_blood
 --      ["Your personal best time so far: %.3f seconds"] = "", -- A_Space_Adventure:ice02, A_Space_Adventure:moon02
 --      ["Your rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge
---      ["You saved %d of 8 Hapless Hogs."] = "", -- User_Mission_-_That_Sinking_Feeling
+--      ["Your rope is gone! Try again!"] = "", -- Basic_Training_-_Rope
+--      ["You saved %d of 8 hegehogs."] = "", -- User_Mission_-_That_Sinking_Feeling
 --      ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen
 --      ["You see the wind strength at the bottom right corner."] = "", -- Basic_Training_-_Bazooka
+--      ["You see the wind strength at the top."] = "", -- Basic_Training_-_Bazooka
 --      ["You should have known that we don't rely on meatbags!"] = "", -- A_Classic_Fairytale:queen
 --      ["You should know this more than anyone, Leaks!"] = "", -- A_Classic_Fairytale:queen
 --      ["You speak great truth, Hannibal. Here, take a sip!"] = "", -- A_Classic_Fairytale:epil
 --      ["You've been assaulting us, we have been just defending ourselves!"] = "", -- A_Classic_Fairytale:enemy
-      ["You've failed. Try again."] = "失败了。再尝试吧。",
       ["You've reached the goal!| |Time: "] = "目标达成| |时间:",
 --      ["You will be avenged!"] = "", -- A_Classic_Fairytale:shadow
 --      ["You will fail if you run out of ammo and there are still targets available."] = "", -- A_Space_Adventure:desert03
 --      ["You will gain some extra ammo from the crates the next time you play the \"Getting to the device\" mission."] = "", -- A_Space_Adventure:fruit03
 --      ["You will play every 3 turns."] = "", -- A_Space_Adventure:fruit01
 --      ["- You will recieve 2-4 weapons on each kill! (Even on own hogs)"] = "", -- Continental_supplies
---      ["You win!"] = "", -- Big_Armory
 --      ["You won't believe what happened to me!"] = "", -- A_Classic_Fairytale:backstab
 --      ["Yuck! I bet they'll keep worshipping her even after I save the village!"] = "", -- A_Classic_Fairytale:family
 --      ["Yumme Gunpowder"] = "", -- 
@@ -3018,6 +2983,7 @@
 --      ["Zombie"] = "", -- 
 --      ["Zombi"] = "", -- portal
       ["'Zooka Team"] = "火箭队",
---      ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard
+--      ["Zoom: [Pinch] with 2 fingers"] = "", -- Basic_Training_-_Movement
+--      ["Zoom: [Rotate mouse wheel]"] = "", -- Basic_Training_-_Movement
 --      ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen
 }
--- a/share/hedgewars/Data/Locale/zh_CN.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/zh_CN.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -59,8 +59,10 @@
 00:56=菜刀
 00:57=橡皮筋
 00:58=浮空雷
+00:59=爬行者
+00:60=机枪
 
-; 01:00=Loading …
+01:00=载入中 …
 01:01=平手
 01:02= %1 胜!
 01:03=音量 %1%
--- a/share/hedgewars/Data/Locale/zh_TW.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Locale/zh_TW.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -30,7 +30,7 @@
 00:27=地獄禮花
 00:28=鑽地火箭
 00:29=彈珠槍
-00:30=燒夷彈
+00:30=凝固汽油彈
 00:31=遙控飛機
 00:32=低重力
 00:33=額外傷害
@@ -59,8 +59,10 @@
 00:56=菜刀
 00:57=橡皮筋
 00:58=浮空雷
+00:59=苦力怕
+00:60=機槍
 
-01:00=開戰!
+01:00=載入中 …
 01:01=平局
 01:02=%1 勝利!
 01:03=音量 %1%
@@ -74,7 +76,7 @@
 01:11=本武器/工具解凍中!
 01:12=意外死亡模式前,最後一回合!
 01:13=意外死亡模式前,倒數%1回合!
-01:14=預備,%1!
+01:14=%1,做好準備!
 01:15=輕微
 01:16=低
 01:17=正常
@@ -86,9 +88,36 @@
 01:23=關閉自動鏡頭功能
 01:24=啟動自動鏡頭功能
 01:25=按目標鍵來標記目標
+01:26=本工具在意外死亡模式下是不能使用的
+; E.g. “+25” when gaining health from crate or vampirism
+01:27=+%1
+01:28=空的!
+01:29=未知的關鍵
+01:30=%1 和 %2 勝利!
+01:31=%1, %2 和 %3 勝利!
+01:32=%1, %2, %3 和 %4 勝利!
+01:33=%1, %2, %3, %4 和 %5 勝利!
+01:34=%1, %2, %3, %4, %5 和 %6 勝利!
+01:35=%1, %2, %3, %4, %5, %6 和 %7 勝利!
+01:36=大家都贏了!
+01:37=%1離開了.
+01:38=%1回來了.
+01:39=%1自動跳過回合.
+01:40=%1 fps
+01:41=Lua解析:關閉
+01:42=Lua解析:開啟
+01:43=Lua解析不允許連網遊戲!
+; Ammo count in ammo menu
+01:44=%1×
+; Chat. %1 = player, %2 = message
+01:45=%1: %2
+; Clan chat. %1 = player, %2 = message
+01:46=[隊伍] %1: %2
+; Hedgehog chat. %1 = hog name, %2 = message
+01:47=[%1]: %2
 
 ; Event messages
-; Hog (%1) died
+; Normal hog (%1) died (0 health)
 02:00=%1 踢到了炸藥桶!
 02:00=%1 看到了聖光!
 02:00=%1 沒料到會這樣。。。
@@ -145,7 +174,7 @@
 02:00=%1 本該用另一條命的
 02:00=快打119!
 
-; Hog (%1) drowned
+; Normal hog (%1) drowned
 02:01=%1 以為自己是潛水艇!
 02:01=%1 學泰坦尼克去了!
 02:01=%1 石沉大海!
@@ -250,10 +279,10 @@
 02:02=勇敢前進!
 02:02=敢於征服!
 
-; Round ends (%1 wins)
+; Round ends and a team (%1) wins
 02:03=%1 勝利!
 
-; Round ends (draw)
+; Round ends in a draw
 02:04=平局
 
 ; New health crate
@@ -386,7 +415,7 @@
 02:09=%1 需要看看說明書了
 02:09=%1 的武器很明顯壞了
 
-; Hog shot an home run (using the bat and another hog)
+; Home run: Hog (%1) uses baseball bat to throw other hog far out of the left/right map bounds
 02:10=全壘打!
 02:10=看到鳥了!飛機!飛碟!
 02:10=那一位出局了!
@@ -458,6 +487,8 @@
 03:56=請使用或濫用
 03:57=工具
 03:58=浮空的鄰近觸發炸彈
+03:59=未完成的武器
+03:60=終極火器
 
 ; Weapon Descriptions (use | as line breaks)
 04:00=使用純手榴彈攻擊敵人.|定時器倒數到0就會爆炸.|1-5: 設定定時器|微調鍵+1-5: 設定彈跳強度|攻擊鍵: 按住蓄力.
@@ -513,12 +544,14 @@
 04:50=有人躲在地下嗎?|用鑽地火箭空襲將它挖出來!|定時器控制挖掘的深度.|左/右方向鍵: 決定攻擊方向|1-5: 設定定時器|游標: 選定目標
 04:51=使用泥球攻擊不會結束回合.|沒有攻擊力,但可以擊退刺蝟與物體.|攻擊鍵: 按住蓄力
 04:52=UNUSED
-04:53=離開隊友,進行一趟時空之旅.|準備隨時回歸,或強制回歸由於進入意外死亡模式,或只剩下一隻刺蝟.|注意,不能在以下狀況使用: 意外死亡模式,剩下一隻刺蝟時,與國王身上.|攻擊鍵: 激活
+04:53=離開隊友,進行一趟時空之旅.|準備隨時回歸,或強制回歸由於進入意外死亡模式,或只剩下一隻刺蝟.|注意,不能在以下狀況使用: 意外死亡模式,剩下一隻刺蝟時,與國王身上.|攻擊鍵: 激活
 04:54=噴灑一串神奇薄片來產生地形.|可用來: 搭建橋樑,埋葬敵人,封鎖隧道.|攻擊鍵: 激活|上/下方向鍵: 發射中移動準心|左/右方向鍵: 更改發射力道
 04:55=回到冰河時期!|可冷凍刺蝟,使地面變滑|或凍結水面避免淹死.|攻擊鍵: 激活/停止冷凍射線|上/下方向鍵: 發射中移動準心
 04:56=你可以丟兩把菜刀用來攻擊/擋住敵人|也可以用來擋住隧道或利用它來攀爬!|請小心!玩刀是很危險的.|攻擊鍵: 按住蓄力(兩次)
 04:57=建立一條非常有彈性的橡皮筋,|刺蝟或其他東西掉在上面會被彈開不會受傷.|左/右方向鍵: 旋轉|游標: 放置
 04:58=這顆接近觸發炸彈將浮在空中,|追蹤攻擊太靠近的刺蝟.|然而,它的爆炸威力弱於一般地雷.|攻擊鍵: 按住蓄力.
+04:59=這個武器還在實驗中尚未完成.|使用風險由您自行承擔!
+04:60=對你的敵人發動如雨般的攻擊!|他們以為躲在三層梁柱後面是安全的.|攻擊鍵: 全力射擊|上/下方向鍵: 繼續瞄準
 
 ; Game goal strings
 05:00=遊戲模式
--- a/share/hedgewars/Data/Maps/BambooPlinko/map.cfg	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/BambooPlinko/map.cfg	Fri Aug 16 10:59:50 2019 -0600
@@ -1,2 +1,2 @@
 Bamboo
-48
\ No newline at end of file
+64
\ No newline at end of file
--- a/share/hedgewars/Data/Maps/Basketball/credits.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/Basketball/credits.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -1,1 +1,1 @@
-Finn Brice
+John Dum
--- a/share/hedgewars/Data/Maps/Basketball/map.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/Basketball/map.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -10,7 +10,6 @@
 	CaseFreq = 0
 	MinesNum = 0
 	Explosives = 0
-	Delay = 500
     Map = 'BasketballField'
 	-- Disable Sudden Death
 	WaterRise = 0
--- a/share/hedgewars/Data/Maps/BasketballField/credits.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/BasketballField/credits.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -1,1 +1,1 @@
-Finn Brice
+John Dum
--- a/share/hedgewars/Data/Maps/Bubbleflow/credits.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/Bubbleflow/credits.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -1,1 +1,1 @@
-Finn Brice
+John Dum
--- a/share/hedgewars/Data/Maps/CTF_Blizzard/map.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/CTF_Blizzard/map.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -105,6 +105,7 @@
 						-- currently every 6 TURNS, should this work
 						-- on ROUNDS instead?
 local effectTimer = 0
+local gameEnded = false
 
 local ropeGear = nil
 
@@ -120,6 +121,11 @@
 local teamIndex = {} -- at what point in the hhs{} does each team begin
 local clanTeams = {} -- list of teams per clan
 
+local mostCapturesHogName = nil -- name of hog who holds the record of most flags captured
+local mostCapturesHogTeam = nil -- name of team who holds the record of most flags captured
+local mostCaptures = 0 -- number of most per-hog captures
+local capturesPerHog = {}
+
 -------------------
 -- flag variables
 -------------------
@@ -155,8 +161,8 @@
 --zone and teleporter variables
 --------------------------------
 
-local redTel
-local orangeTel
+local leftTel
+local rightTel
 
 local zXMin = {}
 local zWidth = {}
@@ -175,16 +181,18 @@
 	if effectTimer > 50 then
 		effectTimer = 0
 
-		for i = 0,1 do
-			local eX = 10 + zXMin[i] + GetRandom(zWidth[i]-10)
-			local eY = 50 + zYMin[i] + GetRandom(zHeight[i]-110)
+		local i = GetHogClan(CurrentHedgehog)
+		if i ~= 0 and i ~= 1 then
+			return
+		end
+		local eX = 10 + zXMin[i] + GetRandom(zWidth[i]-10)
+		local eY = 50 + zYMin[i] + GetRandom(zHeight[i]-110)
 
-			-- steam and smoke and DUST look good, smokering looks trippy
-			-- smoketrace and eviltrace are not effected by wind?
-			-- chunk is a LR falling gear
-			local tempE = AddVisualGear(eX, eY, vgtDust, 0, false)
-			SetVisualGearValues(tempE, eX, eY, nil, nil, nil, nil, nil, nil, nil, fCol[i])
-		end
+		-- steam and smoke and DUST look good, smokering looks trippy
+		-- smoketrace and eviltrace are not effected by wind?
+		-- chunk is a LR falling gear
+		local tempE = AddVisualGear(eX, eY, vgtDust, 0, false)
+		SetVisualGearValues(tempE, eX, eY, nil, nil, nil, nil, nil, nil, nil, fCol[i])
 	end
 end
 
@@ -228,14 +236,38 @@
 		alt = 0
 	end
 
-	if fCaptures[teamID] == 3 then
+	if fCaptures[teamID] == 3 and not gameEnded then
+		gameEnded = true
 		for i = 0, (numhhs-1) do
 			if GetHogClan(hhs[i]) == alt then
 				SetEffect(hhs[i], heResurrectable, 0)
 				SetHealth(hhs[i],0)
 			end
 		end
-		ShowMission(loc("GAME OVER!"), loc("Victory for the ") .. GetHogTeamName(CurrentHedgehog), loc("Hooray!"), 0, 0)
+		local victoryMsg = string.format(loc("Victory for %s!"), GetHogTeamName(CurrentHedgehog))
+		AddCaption(victoryMsg, capcolDefault, capgrpGameState)
+
+		-- Calculate team rankings
+		local teamList = {}
+		for i=0, TeamsCount-1 do
+			local name = GetTeamName(i)
+			local clan = GetTeamClan(name)
+			if fCaptures[clan] ~= nil then
+				table.insert(teamList, { score = fCaptures[clan], name = name, clan = clan })
+			end
+		end
+		local teamRank = function(a, b)
+			return a.score > b.score
+		end
+		table.sort(teamList, teamRank)
+
+		for i=1, #teamList do
+			SendStat(siPointType, "!POINTS")
+			SendStat(siPlayerKills, tostring(teamList[i].score), teamList[i].name)
+		end
+		if mostCaptures >= 2 then
+			SendStat(siCustomAchievement, string.format(loc("%s (%s) has captured the flag %d times."), mostCapturesHogName, mostCapturesHogTeam, mostCaptures))
+		end
 	end
 
 end
@@ -246,10 +278,9 @@
 
 		if fNeedsRespawn[i] == true then
 			fGear[i] = SpawnFakeAmmoCrate(fSpawnX[i],fSpawnY[i],false,false)
-			--fGear[i] = SpawnHealthCrate(fSpawnX[i],fSpawnY[i])
 			fNeedsRespawn[i] = false
 			fIsMissing[i] = false -- new, this should solve problems of a respawned flag being "returned" when a player tries to score
-			AddCaption(loc("Flag respawned!"))
+			AddCaption(loc("Flag respawned!"), capcolDefault, capgrpAmmoinfo)
 		end
 
 	end
@@ -259,7 +290,6 @@
 function FlagDeleted(gear)
 
 	local wtf, bbq
-	PlaySound(sndShotgunReload)
 	if (gear == fGear[0]) then
 		wtf = 0
 		bbq = 1
@@ -271,12 +301,13 @@
 	if CurrentHedgehog ~= nil then
 
 		--if the player picks up the flag
-		if CheckDistance(CurrentHedgehog, fGear[wtf]) < 1600 then
+		if band(GetGearMessage(gear), gmDestroy) ~= 0 then
 
 			fGear[wtf] = nil -- the flag has now disappeared and we shouldnt be pointing to it
 
 			-- player has successfully captured the enemy flag
 			if (GetHogClan(CurrentHedgehog) == wtf) and (CurrentHedgehog == fThief[bbq]) and (fIsMissing[wtf] == false) then
+				PlaySound(sndShotgunReload)
 				fIsMissing[wtf] = false
 				fNeedsRespawn[wtf] = true
 				fIsMissing[bbq] = false
@@ -288,25 +319,33 @@
 					SetTeamLabel(clanTeams[wtf][i], fCaptures[wtf])
 				end
 
+				capturesPerHog[CurrentHedgehog] = capturesPerHog[CurrentHedgehog] + 1
+				if capturesPerHog[CurrentHedgehog] > mostCaptures then
+					mostCaptures = capturesPerHog[CurrentHedgehog]
+					mostCapturesHogName = GetHogName(CurrentHedgehog)
+					mostCapturesHogTeam = GetHogTeamName(CurrentHedgehog)
+				end
+
 				PlaySound(sndHomerun)
 				fThief[bbq] = nil -- player no longer has the enemy flag
 				CheckScore(wtf)
 
 			--if the player is returning the flag
 			elseif GetHogClan(CurrentHedgehog) == wtf then
-
+				PlaySound(sndShotgunReload)
 				fNeedsRespawn[wtf] = true
 
 				-- NEW ADDIITON, does this work? Should make it possible to return your flag and then score in the same turn
 				if fIsMissing[wtf] == true then
 					HandleRespawns() -- this will set fIsMissing[wtf] to false :)
-					AddCaption(loc("Flag returned!"))
+					AddCaption(loc("Flag returned!"), capcolDefault, capgrpAmmoinfo)
 				elseif fIsMissing[wtf] == false then
 					AddCaption(loc("That was pointless. The flag will respawn next round."))
 				end
 
 			--if the player is taking the enemy flag
 			elseif GetHogClan(CurrentHedgehog) == bbq then
+				PlaySound(sndShotgunReload)
 				fIsMissing[wtf] = true
 				for i = 0,numhhs-1 do
 					if CurrentHedgehog == hhs[i] then
@@ -321,7 +360,7 @@
 
 			end
 
-		-- if flag has been destroyed, probably
+		-- if flag has been destroyed
 		else
 
 			if GetY(fGear[wtf]) > 2025 then
@@ -368,6 +407,7 @@
 		else
 			fGear[wtf] = SpawnFakeAmmoCrate(fThiefX[wtf],(fThiefY[wtf]-50),false,false)
 		end
+		AddCaption(string.format(loc("%s has dropped the flag!"), GetHogName(gear)), capcolDefault, capgrpAmmoinfo)
 
 		AddVisualGear(fThiefX[wtf], fThiefY[wtf], vgtBigExplosion, 0, false)
 		fThief[wtf] = nil
@@ -399,28 +439,15 @@
 -- general methods
 ------------------------
 
-function CheckDistance(gear1, gear2)
-
-	local g1X, g1Y = GetGearPosition(gear1)
-	local g2X, g2Y = GetGearPosition(gear2)
-
-	g1X = g1X - g2X
-	g1Y = g1Y - g2Y
-	local dist = (g1X*g1X) + (g1Y*g1Y)
-
-	return dist
-
-end
-
 function CheckTeleporters()
 
 	local teleportActive = false
 
-	if (GearIsInZone(CurrentHedgehog, redTel) == true) and (GetHogClan(CurrentHedgehog) == 0) then
+	if (GearIsInZone(CurrentHedgehog, leftTel) == true) and (GetHogClan(CurrentHedgehog) == 0) then
 		teleportActive = true
 		destinationX = 1402
 		destinationY = 321
-	elseif (GearIsInZone(CurrentHedgehog, orangeTel) == true) and (GetHogClan(CurrentHedgehog) == 1) then
+	elseif (GearIsInZone(CurrentHedgehog, rightTel) == true) and (GetHogClan(CurrentHedgehog) == 1) then
 		teleportActive = true
 		destinationX = 2692
 		destinationY = 321
@@ -438,6 +465,7 @@
 		elseif actionReset == 20 then
 			AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtBigExplosion, 0, false)
 			SetGearPosition(CurrentHedgehog,destinationX,destinationY)
+			PlaySound(sndWarp)
 			AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtBigExplosion, 0, false)
 		end
 
@@ -511,6 +539,7 @@
 		elseif r == 7 then
 			SpawnSupplyCrate(0,0,amPortalGun)
 		end
+		PlaySound(sndReinforce, CurrentHedgehog)
 
 	end
 
@@ -534,17 +563,26 @@
 	Map = "Blizzard" -- The map to be played
 	Theme = "Snow" -- The theme to be used
 
+	SendHealthStatsOff()
+	SendRankingStatsOff()
+
 end
 
 
 function onGameStart()
 
-	ShowMission(loc("CTF_Blizzard"), loc("Capture The Flag"), loc(" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"), 0, 0)
-
+	ShowMission(loc("CTF_Blizzard"), loc("Capture The Flag"),
+		loc("- Return the enemy flag to your base to score") .."|"..
+		string.format(loc("- First clan to score %d captures wins"), 3) .. "|"..
+		loc("- You may only score when your flag is in your base") .."|"..
+		loc("- Hogs will drop the flag when killed") .."|"..
+		loc("- Dropped flags may be returned or recaptured").."|"..
+		loc("- Hogs will be revived") .."|"..
+		loc("- Touch the sparkles near your base to teleport"), 11, 0)
 
 	-- initialize teleporters
-	redTel = CreateZone(342,1316,42,449)	-- red teleporter
-	orangeTel = CreateZone(3719,1330,45,449)	-- orange teleporter
+	leftTel = CreateZone(342,1316,42,449)	-- left teleporter (clan 0)
+	rightTel = CreateZone(3719,1330,45,449)	-- right teleporter (clan 1)
 
 
 	--new improved placement schematics aw yeah
@@ -616,6 +654,11 @@
 function onNewTurn()
 
 	HandleRespawns()
+
+end
+
+function onCaseDrop()
+
 	HandleCrateDrops()
 
 end
@@ -639,7 +682,9 @@
 	end
 
 	HandleCircles()
-	ManageTeleporterEffects()
+	if (CurrentHedgehog ~= nil) then
+		ManageTeleporterEffects()
+	end
 
 end
 
@@ -707,6 +752,7 @@
 
 	if GetGearType(gear) == gtHedgehog then
 
+		capturesPerHog[gear] = 0
 		if GetHogClan(gear) > 1 then
 			DeleteGear(gear)
 			if not excessHogsWarning then
--- a/share/hedgewars/Data/Maps/Cave/map.cfg	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/Cave/map.cfg	Fri Aug 16 10:59:50 2019 -0600
@@ -1,2 +1,2 @@
 Island
-48
+64
--- a/share/hedgewars/Data/Maps/ClimbHome/map.cfg	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/ClimbHome/map.cfg	Fri Aug 16 10:59:50 2019 -0600
@@ -1,4 +1,4 @@
 EarthRise
-48
+64
 Timeless
 locked
--- a/share/hedgewars/Data/Maps/ClimbHome/map.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/ClimbHome/map.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -32,7 +32,6 @@
 local addCake = true
 local takeASeat = false
 local Stars = {}
-local tauntNoo = false
 local jokeAwardNavy = nil
 local jokeAwardSpeed = nil
 local jokeAwardDamage = nil
@@ -128,9 +127,14 @@
 function onGameStart()
     --SetClanColor(ClansCount-1, 0x0000ffff) appears to be broken
     SendHealthStatsOff()
+    local recordInfo = ""
+    if isSinglePlayer then
+        recordInfo = getReadableChallengeRecord("Highscore")
+    end
     ShowMission(loc("Climb Home"),
                 loc("Challenge"),
-                loc("You are far from home, and the water is rising, climb up as high as you can!|Your score will be based on your height."),
+                loc("You are far from home, and the water is rising, climb up as high as you can!|Your score will be based on your height.")
+                .. "|" .. recordInfo,
                 -amRope, 0)
     local x = 1818
     for h,i in pairs(HH) do
@@ -184,7 +188,6 @@
     SetWaterLine(32768)
     YouWon = false
     YouLost = false
-    tauntNoo = false
     takeASeat = false
     recordBroken = false
     currTeam = GetHogTeamName(CurrentHedgehog)
@@ -419,7 +422,8 @@
             end
         end
 
-        local finishTime = (GameTime-startTime)/1000
+        local rawFinishTime = GameTime-startTime
+        local finishTime = rawFinishTime/1000
         local roundedFinishTime = math.ceil(math.floor(finishTime+0.5))
         if isSinglePlayer then
             if distanceFromWater < 0 and not YouLost and not YouWon then
@@ -428,21 +432,24 @@
             end
             -- FIXME: Hog is also in winning box if it just walks into the chair from the left, touching it. Intentional?
             if not YouWon and not YouLost and gearIsInBox(CurrentHedgehog, 1920, 252, 50, 50) then
+                SaveMissionVar("Won", "true")
                 AddCaption(loc("Victory!"), capcolDefault, capgrpGameState)
                 ShowMission(loc("Climb Home"),
                             loc("Made it!"),
                             string.format(loc("Ahhh, home, sweet home. Made it in %d seconds."), roundedFinishTime),
                             -amRope, 0)
                 PlaySound(sndVictory,CurrentHedgehog)
-                SetState(CurrentHedgehog, gstWinner)
                 SendStat(siGameResult, loc("You have beaten the challenge!"))
                 SendStat(siGraphTitle, loc("Your height over time"))
                 SendStat(siCustomAchievement, string.format(loc("%s reached home in %.3f seconds. Congratulations!"), GetHogName(CurrentHedgehog), finishTime))
+                updateChallengeRecord("TimeRecord", rawFinishTime, false)
                 SendStat(siCustomAchievement, string.format(loc("%s bravely climbed up to a dizzy height of %d to reach home."), GetHogName(CurrentHedgehog), getActualHeight(RecordHeight)))
-                SendStat(siPointType, loc("seconds"))
-                SendStat(siPlayerKills, tostring(roundedFinishTime), GetHogTeamName(CurrentHedgehog))
+                updateChallengeRecord("Highscore", getActualHeight(RecordHeight))
+                SendStat(siPointType, "!TIME")
+                SendStat(siPlayerKills, tostring(rawFinishTime), GetHogTeamName(CurrentHedgehog))
 
                 EndGame()
+                SetState(CurrentHedgehog, gstWinner)
                 onAchievementsDeclaration()
                 YouWon = true
             end
@@ -494,17 +501,6 @@
                 takeASeat = true
             end
     
-            -- play taunts
-            if not YouWon and not YouLost then
-                local nooDistance = 500
-                if ((x < -nooDistance and vx < 0) or (x > LAND_WIDTH+nooDistance and vx > 0)) then
-                    if (tauntNoo == false and distanceFromWater > 80) then
-                        PlaySound(sndNooo, CurrentHedgehog)
-                        tauntNoo = true
-                    end
-                end
-            end
-
             if addCake and CakeTries < 10 and y < 32600 and y > 3000 and Cake == nil then 
                 -- doing this just after the start the first time to take advantage of randomness sources
                 -- Pick a clear y to start with
@@ -663,7 +659,7 @@
 
 function makeSinglePlayerLoserStats()
     local actualHeight = getActualHeight(RecordHeight)
-    SendStat(siGameResult, loc("You lose!"))
+    SendStat(siGameResult, loc("Challenge over!"))
     SendStat(siGraphTitle, loc("Your height over time"))
     local text
     if actualHeight > 30000 then text = loc("%s was damn close to home.")
@@ -682,7 +678,9 @@
     else
         SendStat(siCustomAchievement, string.format(text, RecordHeightHogName))
     end
-    SendStat(siPointType, loc("points"))
+
+    updateChallengeRecord("Highscore", actualHeight)
+    SendStat(siPointType, "!POINTS")
     SendStat(siPlayerKills, actualHeight, GetHogTeamName(CurrentHedgehog))
     EndGame()
     onAchievementsDeclaration()
@@ -738,7 +736,7 @@
     end
     checkAwards()
     for i = #ranking, 1, -1 do
-	SendStat(siPointType, loc("points"))
+	SendStat(siPointType, "!POINTS")
         SendStat(siPlayerKills, tostring(ranking[i].score), ranking[i].name)
     end
 end
--- a/share/hedgewars/Data/Maps/Control/map.cfg	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/Control/map.cfg	Fri Aug 16 10:59:50 2019 -0600
@@ -1,4 +1,4 @@
 Deepspace
-48
+64
 Default
 Crazy
\ No newline at end of file
--- a/share/hedgewars/Data/Maps/Control/map.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/Control/map.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -1,61 +1,25 @@
---------------------------------
--- CONTROL 0.6
---------------------------------
-
----------
--- 0.2
----------
--- fixed score display errrors
--- added missing resurrection effects
--- moved hogs off control points if thats where they started
--- added sanity limit for the above
--- added tint tags to display clan score on each point as it scors
--- added gameflags filter
--- changed scoring rate
--- hogs now only score point DURING THEIR TURN
--- map now accepts custom weaponsets and themes 
--- changed win limit
-
----------
--- 0.3
----------
+-------------
+-- CONTROL --
+-------------
 
--- added translation support
-
---------
--- 0.4
---------
-
--- added scaling scoring based on clans: 300 points to win - 25 per team in game
-
---------
--- 0.5
---------
+-- Goal: Stand on pillars to score points over time.
+-- First clan to hit the score limit wins!
 
--- removed user branding
--- fixed infinite attack time exploit
-
---------
--- 0.6
---------
-
--- timebox fix
--- support for more players
--- remove version numbers
--- enable limited sudden death
--- using skip go generates as many points as you would have gotten had you sat and waited
+-- Rules:
+-- * Each pillar you control generates 1 point every 2 seconds.
+-- * If multiple clans compete for a pillar, no one generates points for this pillar.
+-- * If you skip turn, you win the same points as if you would have just waited out the turn
+-- * Hogs get revived.
 
 -----------------
---script begins
+-- script begins
 -----------------
 
 HedgewarsScriptLoad("/Scripts/Locale.lua")
 
 ---------------------------------------------------------------
-----------lots of bad variables and things
-----------because someone is too lazy
-----------to read about tables properly
------------------- "Oh well, they probably have the memory"
+-- lots variables and things
+---------------------------------------------------------------
 
 local TimeCounter = 0
 
@@ -89,7 +53,6 @@
 local numhhs = 0 -- store number of hedgehogs
 local hhs = {} -- store hedgehog gears
 
-local numTeams --  store the number of teams in the game
 local teamNameArr = {}	-- store the list of teams
 local teamClan = {}
 local teamSize = {}	-- store how many hogs per team
@@ -148,13 +111,13 @@
 	okay = true
 
 	for i = 0,(zCount-1) do
-				
+
 		for k = 0, (numhhs-1) do
 			if (hhs[k] ~= nil) then
-			if (GearIsInZone(hhs[k],i)) == true then
-				FindPlace(hhs[k], false, 0, LAND_WIDTH, true)
-				okay = false
-			end
+				if (GearIsInZone(hhs[k],i)) == true then
+					FindPlace(hhs[k], false, 0, LAND_WIDTH, true)
+					okay = false
+				end
 			end
 		end
 	end
@@ -169,53 +132,43 @@
 		SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], 0xffffffff)
 		cOwnerClan[i] = nil
 		for k = 0, (numhhs-1) do
-			if (hhs[k] ~= nil) then --and (GetGearType(hhs[k]) ~= nil) then
-                if (GearIsInZone(hhs[k],i)) == true then
+			if (hhs[k] ~= nil) then
+				if (GearIsInZone(hhs[k],i)) == true then
+					if cOwnerClan[i] ~= nil then
+						if cOwnerClan[i] ~= GetHogClan(hhs[k]) then
+							--if the hog now being compared is different to one that is also here and was previously compared
+							SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], 0xffffffff)
 
-                    if cOwnerClan[i] ~= nil then
-                        if cOwnerClan[i] ~= GetHogClan(hhs[k]) then 
-                            --if the hog now being compared is different to one that is also here and was previously compared
-                            
-                            SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], 0xffffffff)						
-                            --SetVisualGearValues(vCirc[i], 2739, 1378, 20, 255, 1, 10, 0, 300, 5, 0xffffffff)
-        
-                            cOwnerClan[i] = 10 -- this means conflicted
-                        end
-                    elseif cOwnerClan[i] == nil then
-                        cOwnerClan[i] = GetHogClan(hhs[k])
-                        --SetVisualGearValues(vCirc[i], 2739, 1378, 20, 255, 1, 10, 0, 300, 5, GetClanColor( GetHogClan(hhs[k])) )
-                        SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], GetClanColor( GetHogClan(hhs[k])))
-        
-                    end
+							cOwnerClan[i] = 10 -- this means conflicted
+						end
+					elseif cOwnerClan[i] == nil then
+						cOwnerClan[i] = GetHogClan(hhs[k])
+						SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], GetClanColor( GetHogClan(hhs[k])))
+					end
 
-                end
-           -- else hhs[k] = nil
+				end
 			end
 		end
-
 	end
 
 end
 
 function AwardPoints()
-		
+
 	for i = 0,(zCount-1) do
-		-- give score to all players controlling points		
-		--if (cOwnerClan[i] ~= nil) and (cOwnerClan[i] ~= 10) then
-		--	teamScore[cOwnerClan[i]] = teamScore[cOwnerClan[i]] + 1
-		--end
-		
-		-- only give score to the player currently in control		
-		if CurrentHedgehog ~= nil then		
+		-- give score to all players controlling points
+
+		-- only give score to the player currently in control
+		if CurrentHedgehog ~= nil then
 			if cOwnerClan[i] == GetHogClan(CurrentHedgehog) then
 				teamScore[cOwnerClan[i]] = teamScore[cOwnerClan[i]] + 1
 			end
 		end
 	end
 
-	-- i want to show all the tags at once as having the SAME score not 1,2,3,4 so alas, repeating the loop seems needed	
-	for i = 0,(zCount-1) do			
-		if CurrentHedgehog ~= nil then		
+	-- i want to show all the tags at once as having the SAME score not 1,2,3,4 so alas, repeating the loop seems needed
+	for i = 0,(zCount-1) do
+		if CurrentHedgehog ~= nil then
 			if cOwnerClan[i] == GetHogClan(CurrentHedgehog) then
 				local g = AddVisualGear(vCircX[i], vCircY[i]-100, vgtHealthTag, 100, false)
 				SetVisualGearValues(g, vCircX[i], vCircY[i]-100, 0, 0, 0, 0, 0, teamScore[cOwnerClan[i]], 1500, GetClanColor(cOwnerClan[i]))
@@ -223,10 +176,15 @@
 		end
 	end
 
-	-- Update team labels
+	-- Update team labels and graph
+	local clanGraphPointWritten = {}
 	for i = 0,(TeamsCount-1) do
 		if teamNameArr[i] ~= " " then
 			SetTeamLabel(teamNameArr[i], teamScore[teamClan[i]])
+			if not clanGraphPointWritten[teamClan[i]] then
+				SendStat(siClanHealth, teamScore[teamClan[i]], teamNameArr[i])
+				clanGraphPointWritten[teamClan[i]] = true
+			end
 		end
 	end
 
@@ -246,7 +204,7 @@
 		teamIndex[i] = 0
 		teamScore[i] = 0
 	end
-	numTeams = 0
+	local numTeams = 0
 
 	for i = 0, (numhhs-1) do
 
@@ -277,11 +235,11 @@
 	end
 
 	-- find out how many hogs per team, and the index of the first hog in hhs
-	for i = 0, (numTeams-1) do
+	for i = 0, TeamsCount-1 do
 		SetTeamLabel(GetTeamName(i), "0")
 		for z = 0, (numhhs-1) do
 			if GetHogTeamName(hhs[z]) == teamNameArr[i] then
-				teamClan[i] = GetHogClan(hhs[z])				
+				teamClan[i] = GetHogClan(hhs[z])
 				if teamSize[i] == 0 then
 					teamIndex[i] = z -- should give starting index
 				end
@@ -298,15 +256,12 @@
 -- game methods
 ------------------------
 
-function onAttack()
+function onSkipTurn()
 
 	if CurrentHedgehog ~= nil then
-		if GetCurAmmoType() == amSkip then
-			z = (TurnTimeLeft / 2000) - (TurnTimeLeft / 2000)%2 
-			--AddCaption("scored: " .. z,GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage2)
-			for i = 0, z do
-				AwardPoints()
-			end
+		z = (TurnTimeLeft / 2000) - (TurnTimeLeft / 2000)%2
+		for i = 0, z do
+			AwardPoints()
 		end
 	end
 
@@ -315,12 +270,15 @@
 function onGameInit()
 
 	-- Things we don't modify here will use their default values.
-	
+
 	EnableGameFlags(gfInfAttack, gfSolidLand)
 	DisableGameFlags(gfKing, gfAISurvival)
 	WaterRise = 0
 	HealthDecrease = 0
 
+	SendHealthStatsOff()
+	SendRankingStatsOff()
+
 end
 
 
@@ -340,8 +298,8 @@
 	vCircX[3], vCircY[3] = 1942, 77
 	vCircX[4], vCircY[4] = 3883, 89
 	vCircX[5], vCircY[5] = 2739, 1378
-	
-	for i = 0, 5 do	
+
+	for i = 0, 5 do
 		vCirc[i] = AddVisualGear(0,0,vgtCircle,0,true)
 		vCircMinA[i] = 20
 		vCircMaxA[i] = 255
@@ -355,76 +313,118 @@
 		SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], vCircCol[i])
 	end
 
-	--zxc = AddVisualGear(fSpawnX[i],fSpawnY[i],vgtCircle,0,true)
-	--SetVisualGearValues(zxc, 1000,1000, 20, 255, 1,    10,                     0,         100,        1,      GetClanColor(0))
-					--minO,max0 -glowyornot	--pulsate timer	 -- fuckall      -- radius -- width  -- colour
-
 	--new improved placement schematics aw yeah
 	RebuildTeamInfo()
 
-	for i = 0, (numTeams-1) do
+	for i = 0, ClansCount - 1 do
 		pointLimit = pointLimit - 25
 	end
 
 	missionHelp = loc("Control pillars to score points.") .. "|" ..
+		loc("Hedgehogs will be revived after their death.") .. "|" ..
 		string.format(loc("Score goal: %d"), pointLimit)
-	
+
 	-- reposition hogs if they are on control points until they are not or sanity limit kicks in
 	reN = 0
-	--zz = 0
 	while (reN < 10) do
 		if ZonesAreEmpty() == false then
-			reN = reN + 1	
-			--zz = zz + 1	
-			--SetGearPosition(hhs[0], 631, 82) -- put this in here to thwart attempts at repositioning and test sanity limit	
+			reN = reN + 1
 		else
-			reN = 15		
+			reN = 15
 		end
-		--AddCaption(zz) -- number of times it took to work
 	end
 
-	for h=1, numhhs do
+	for h=0, numhhs-1 do
 		-- Tardis screws up the game too much, teams might not get killed correctly after victory
 		-- if a hog is still in time-travel.
 		-- This could be fixed, removing the Tardis is just a simple and lazy fix.
 		AddAmmo(hhs[h], amTardis, 0)
 		-- Resurrector is pointless, all hogs are already automatically resurrected.
 		AddAmmo(hhs[h], amResurrector, 0)
+		-- Remove suicidal weapons as they might wipe out the team
+		AddAmmo(hhs[h], amKamikaze, 0)
+		AddAmmo(hhs[h], amPiano, 0)
 	end
 
 	ShowMission(missionName, missionCaption, missionHelp, 0, 0)
 
 end
 
+local RankTeams = function(teamList)
+	local teamRank = function(a, b)
+		if a.score ~= b.score then
+			return a.score > b.score
+		else
+			return a.clan > b.clan
+		end
+	end
+	table.sort(teamList, teamRank)
+	local rank, plusRank, score, clan
+	for i=1, #teamList do
+		if i == 1 then
+			rank = 1
+			plusRank = 1
+			score = teamList[i].score
+			clan = teamList[i].clan
+		end
+		if (teamList[i].score < score) then
+			rank = rank + plusRank
+			plusRank = 1
+		end
+		if (teamList[i].score == score and teamList[i].clan ~= clan) then
+			plusRank = plusRank + 1
+		end
+		teamList[i].rank = rank
+		score = teamList[i].score
+		clan = teamList[i].clan
+	end
+
+	for i=1, #teamList do
+		SendStat(siPointType, "!POINTS")
+		SendStat(siTeamRank, tostring(teamList[i].rank))
+		SendStat(siPlayerKills, tostring(teamList[i].score), teamList[i].name)
+	end
+end
 
 function onNewTurn()
 
-	-- reset the time counter so that it will get set to TurnTimeLeft in onGameTick	
+	-- reset the time counter so that it will get set to TurnTimeLeft in onGameTick
 	TimeCounter = 0
-		
+
 	if lastTeam ~= GetHogTeamName(CurrentHedgehog) then
 		lastTeam = GetHogTeamName(CurrentHedgehog)
 	end
 
 	if gameWon == false then
-	
-		for i = 0, (numTeams-1) do
+
+		for i = 0, TeamsCount - 1 do
 			if teamScore[i] >= pointLimit then --150
 				gameWon = true
-				winnerClan = i			
+				winnerClan = i
 			end
 		end
 
 		if gameWon == true then
 			for i = 0, (numhhs-1) do
-				if hhs[i] ~= nil then				
+				if hhs[i] ~= nil then
 					if GetHogClan(hhs[i]) ~= winnerClan then
 						SetEffect(hhs[i], heResurrectable, 0)
 						SetHealth(hhs[i],0)
 					end
-				end			
+				end
 			end
-			SetTurnTimeLeft(1)
+			EndTurn(true)
+
+			-- Rankings
+			local teamList = {}
+			for i=0, TeamsCount - 1 do
+				local name = GetTeamName(i)
+				local clan = GetTeamClan(name)
+				table.insert(teamList, { score = teamScore[teamClan[i]], name = name, clan = clan })
+			end
+			RankTeams(teamList)
+			SendStat(siGraphTitle, loc("Score graph"))
+
 		end
 
 	end
@@ -437,39 +437,32 @@
 	if (vCircCount >= 500) and (gameWon == false) then
 		vCircCount = 0
 		CheckZones()
-	end	
+	end
 
-	-- things we wanna check often
-	if (CurrentHedgehog ~= nil) then
-	--	AddCaption(GetX(CurrentHedgehog) .. "; " .. GetY(CurrentHedgehog))
-		--AddCaption(teamNameArr[0] .. " : " .. teamScore[0])
-		--AddCaption(GetHogTeamName(CurrentHedgehog) .. " : " .. teamScore[GetHogClan(CurrentHedgehog)]) -- this end up 1?
-		
-		-- huh? the first clan added seems to be clan 1, not 0 ??
-
+	-- set TimeCounter to starting time if it is uninitialised (from onNewTurn)
+	if (TimeCounter == 0) and (TurnTimeLeft > 0) then
+		TimeCounter = TurnTimeLeft
 	end
 
-	-- set TimeCounter to starting time if it is uninitialised (from onNewTurn)	
-	if (TimeCounter == 0) and (TurnTimeLeft > 0) then
-		TimeCounter = TurnTimeLeft	
-	end	
-	
-	-- has it ACTUALLY been 2 seconds since we last did this?	
+	-- has it ACTUALLY been 2 seconds since we last did this?
 	if (TimeCounter - TurnTimeLeft) >= 2000 then
 		TimeCounter = TurnTimeLeft
-		
+
 		if (gameWon == false) then
-			AwardPoints()		
-		end	
-	end	
-	
-	--AddCaption(TimeCounter)	
-	--hGCount = hGCount + 1
-	--if (hGCount >= 2000) and (gameWon == false) then
-	--	hGCount = 0
-	--	AwardPoints()
-	--end
+			AwardPoints()
+		end
+	end
+
+end
 
+function onHogAttack(ammoType)
+	-- Update TimeCounter after using extra time
+	if ammoType == amExtraTime then
+		if (TimeCounter == 0) and (TurnTimeLeft > 0) then
+			TimeCounter = TurnTimeLeft
+		end
+		TimeCounter = TimeCounter + 30000
+	end
 end
 
 function InABetterPlaceNow(gear)
@@ -480,23 +473,6 @@
 	end
 end
 
-function onHogHide(gear)
-	 InABetterPlaceNow(gear)
-end
-
-function onHogRestore(gear)
-	match = false
-	for i = 0, (numhhs-1) do
-		if (hhs[i] == nil) and (match == false) then
-			hhs[i] = gear
-			--AddCaption(GetHogName(gear) .. " has reappeared it seems!")
-			--FollowGear(gear)
-			match = true
-		end
-	end
-end
-
-
 function onGearAdd(gear)
 
 	if GetGearType(gear) == gtHedgehog then
--- a/share/hedgewars/Data/Maps/FlightJoust/credits.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/FlightJoust/credits.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -1,1 +1,1 @@
-Finn Brice
+John Dum
--- a/share/hedgewars/Data/Maps/FlightJoust/map.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/FlightJoust/map.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -31,7 +31,6 @@
     CaseFreq = 0 
     MinesNum = 0 
     Explosives = 0 
-    Delay = 500 
     SuddenDeathTurns = 99999 -- "disable" sudden death
     Theme = Compost
 end
--- a/share/hedgewars/Data/Maps/Hammock/credits.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/Hammock/credits.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -1,1 +1,1 @@
-Finn Brice
+John Dum
--- a/share/hedgewars/Data/Maps/Hedgewars/credits.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/Hedgewars/credits.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -1,1 +1,1 @@
-Finn Brice
+John Dum
--- a/share/hedgewars/Data/Maps/Hogville/map.cfg	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/Hogville/map.cfg	Fri Aug 16 10:59:50 2019 -0600
@@ -1,2 +1,2 @@
 Nature
-48
\ No newline at end of file
+64
\ No newline at end of file
--- a/share/hedgewars/Data/Maps/Islands/map.cfg	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/Islands/map.cfg	Fri Aug 16 10:59:50 2019 -0600
@@ -1,2 +1,2 @@
 Deepspace
-48
+64
--- a/share/hedgewars/Data/Maps/Knockball/map.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/Knockball/map.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -10,7 +10,6 @@
 	CaseFreq = 0
 	MinesNum = 0
 	Explosives = 0
-	Delay = 500
 	-- Disable Sudden Death
 	WaterRise = 0
 	HealthDecrease = 0
--- a/share/hedgewars/Data/Maps/Ropes/credits.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/Ropes/credits.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -1,1 +1,1 @@
-Finn Brice
+John Dum
--- a/share/hedgewars/Data/Maps/Ropes/map.cfg	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/Ropes/map.cfg	Fri Aug 16 10:59:50 2019 -0600
@@ -1,2 +1,2 @@
 Eyes
-48
\ No newline at end of file
+64
\ No newline at end of file
--- a/share/hedgewars/Data/Maps/SB_Bones/map.cfg	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/SB_Bones/map.cfg	Fri Aug 16 10:59:50 2019 -0600
@@ -1,2 +1,2 @@
 Desert
-48
+64
--- a/share/hedgewars/Data/Maps/SB_Grove/map.cfg	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/SB_Grove/map.cfg	Fri Aug 16 10:59:50 2019 -0600
@@ -1,2 +1,2 @@
 Nature
-48
+64
--- a/share/hedgewars/Data/Maps/SB_Oaks/map.cfg	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/SB_Oaks/map.cfg	Fri Aug 16 10:59:50 2019 -0600
@@ -1,2 +1,2 @@
 Nature
-48
+64
--- a/share/hedgewars/Data/Maps/SB_Shrooms/map.cfg	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/SB_Shrooms/map.cfg	Fri Aug 16 10:59:50 2019 -0600
@@ -1,2 +1,2 @@
 Nature
-48
+64
--- a/share/hedgewars/Data/Maps/ShoppaKing/map.cfg	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/ShoppaKing/map.cfg	Fri Aug 16 10:59:50 2019 -0600
@@ -1,2 +1,2 @@
 Castle
-48
\ No newline at end of file
+64
\ No newline at end of file
--- a/share/hedgewars/Data/Maps/Tree/credits.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/Tree/credits.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -1,1 +1,1 @@
-Finn Brice
+John Dum
--- a/share/hedgewars/Data/Maps/TrophyRace/map.cfg	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/TrophyRace/map.cfg	Fri Aug 16 10:59:50 2019 -0600
@@ -1,2 +1,2 @@
 Olympics
-48
\ No newline at end of file
+64
\ No newline at end of file
--- a/share/hedgewars/Data/Maps/TrophyRace/map.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/TrophyRace/map.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -139,11 +139,16 @@
         if not reached and x > goal_area[1] and x < goal_area[1] + goal_area[3] and y > goal_area[2] and y < goal_area[2] + goal_area[4] then -- hog is within goal rectangle
             reached = true
             local ttime = GameTime-startTime
+            local icon
             -- give it a sound ;)
             if ttime < besttime then
                 PlaySound (sndHomerun)
+                icon = 0
             elseif ttime > worsttime then
                 PlaySound (sndHellish)
+                icon = -amSkip
+            else
+                icon = 2
             end
             for i = 0, numhhs - 1 do
                 if hhs[i] == CurrentHedgehog then
@@ -194,7 +199,7 @@
             ShowMission(loc("TrophyRace"), loc("Status update"),
                 string.format(loc("Time: %.3fs by %s"), (ttime/1000), GetHogName(CurrentHedgehog))
                 .. hscore,
-                0, 0)
+                icon, 0)
             AddCaption(string.format(loc("Time: %.3fs"), (ttime/1000)), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpMessage2)
             AddCaption(loc("Track completed!"), capcolDefault, capgrpGameState)
             EndTurn(true)
--- a/share/hedgewars/Data/Maps/portal/map.cfg	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Maps/portal/map.cfg	Fri Aug 16 10:59:50 2019 -0600
@@ -1,2 +1,2 @@
 Hell
-48
+64
--- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/backstab.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/backstab.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -14,7 +14,7 @@
 - Player is instructed to decide what to do with the traitor
 | Player kills traitor
     - Cut scene: afterChoiceAnim
-| Player spares traitor
+| Player spares traitor (skips turn or moves too far away)
     - Cut scene: afterChoiceAnim (different)
 | Player kills any other hog or own hog
     > Game over
@@ -32,7 +32,7 @@
 - One hero is deployed near the circles
 - Player now only controls the hero, switch hog is removed
 - TBS
-- 3rd wave appears
+- 3rd wave appears at end of 7th turn
 - TBS
 - 3rd wave dead
 - Final cut scene
@@ -50,6 +50,7 @@
 
 HedgewarsScriptLoad("/Scripts/Locale.lua")
 HedgewarsScriptLoad("/Scripts/Animate.lua")
+HedgewarsScriptLoad("/Scripts/Utils.lua")
 
 -----------------------------Constants---------------------------------
 choiceAccepted = 1
@@ -82,7 +83,7 @@
 
 nativePos = {{887, 329}, {1050, 288}, {1731, 707},
              {830, 342}, {1001, 290}, {773, 340},
-             {953, 305}, {347, 648}, {314, 647}}
+             {953, 314}, {347, 648}, {314, 647}}
 
 nativeDir = {"Right", "Left", "Left", 
              "Right", "Left", "Right", 
@@ -104,7 +105,7 @@
 cyborgPos = {1369, 574}
 cyborgPos2 = {1308, 148}
 
-deployedPos = {2522, 1365}
+deployedPos = {2522, 1372}
 -----------------------------Variables---------------------------------
 natives = {}
 nativeDead = {}
@@ -128,7 +129,6 @@
 needToAct = 0
 
 m2Choice = 0
-m2DenseDead = 0
 m4DenseDead = 0
 m4BuffaloDead = 0
 m4WaterDead = 0
@@ -141,8 +141,14 @@
 stage = 0
 choice = 0
 highJumped = false
-TurnsLeft = 0
+wave3TurnsLeft = nil
 startNativesNum = 0
+nativesTeamName = nil
+tribeTeamName = nil
+cyborgTeamName = nil
+cannibalsTeamName1 = nil
+cannibalsTeamName2 = nil
+runawayX, runawayY = 1932, 829
 
 startAnim = {}
 afterChoiceAnim = {}
@@ -151,6 +157,8 @@
 wave3DeadAnim = {}
 
 vCircs = {}
+
+trackedNonCyborgGears = {}
 -----------------------------Animations--------------------------------
 function Wave2Reaction()
   local i = 1
@@ -373,6 +381,12 @@
   circlesPut = true
 end
 
+function DeleteCircles()
+  for i=1, #vCircs do
+    DeleteVisualGear(vCircs[i])
+  end
+end
+
 function SetupWave2DeadAnim()
   for i = 7, 1, -1 do
     if nativeDead[i] ~= true then
@@ -399,9 +413,11 @@
       table.insert(wave2DeadAnim, {func = AnimCustomFunction, args = {natives[wiseNum], RestoreCyborg, {}}})
       table.insert(wave2DeadAnim, {func = AnimOutOfNowhere, swh = false, args = {cyborg, cyborgPos2[1], cyborgPos2[2]}})
       table.insert(wave2DeadAnim, {func = AnimTurn, args = {cyborg, "Left"}})
-      table.insert(wave2DeadAnim, {func = AnimCustomFunction, args = {cyborg, IsolateNatives, {}}})
-      table.insert(wave2DeadAnim, {func = AnimCustomFunction, args = {cyborg, PutCGI, {}}})
-      table.insert(wave2DeadAnim, {func = AnimSay, args = {cyborg, loc("I want to see how it handles this!"), SAY_SAY, 6000}})
+      if nativesNum > 1 then
+        table.insert(wave2DeadAnim, {func = AnimCustomFunction, args = {cyborg, IsolateNatives, {}}})
+        table.insert(wave2DeadAnim, {func = AnimCustomFunction, args = {cyborg, PutCGI, {}}})
+        table.insert(wave2DeadAnim, {func = AnimSay, args = {cyborg, loc("I want to see how it handles this!"), SAY_SAY, 6000}})
+      end
       table.insert(wave2DeadAnim, {func = AnimSwitchHog, args = {deployedHog}})
       table.insert(wave2DeadAnim, {func = AnimDisappear, args = {cyborg, 0, 0}})
 --      table.insert(wave2DeadAnim, {func = AnimCustomFunction, args = {cyborg, DeployHog, {}}})
@@ -472,6 +488,14 @@
   end
 end
 
+-- Move camera to (x, y)
+function MoveCameraCustom(x, y)
+   -- We use a dummy gear to feed FollowGear
+   local cameraGear = AddGear(x, y, gtGenericFaller, 0, 0, 0, 5000)
+   SetState(cameraGear, bor(GetState(cameraGear), gstNoGravity+gstInvisible))
+   FollowGear(cameraGear)
+end
+
 function PutCGI()
   AddVisualGear(710, 299, vgtExplosion, 0, false)
   AddVisualGear(690, 299, vgtExplosion, 0, false)
@@ -588,7 +612,12 @@
   SetGearMessage(speakerHog, 0)
   SetState(speakerHog, 0)
   SetTurnTimeLeft(MAX_TURN_TIME)
-  ShowMission(loc("Backstab"), loc("The food bites back"), loc("Defeat the cannibals"), 1, 4000)
+  ShowMission(loc("Backstab"), loc("The food bites back"), loc("Defeat the cannibals!"), 1, 4000)
+  SetAmmoDelay(amBlowTorch, 0)
+  SetAmmoDelay(amGirder, 0)
+  SetAmmoDelay(amLandGun, 0)
+  SetAmmoDelay(amRope, 0)
+  SetAmmoDelay(amParachute, 0)
   SpawnCrates()
 end
 
@@ -607,10 +636,13 @@
 
 function SkipWave2DeadAnim()
   TeleportNatives()
+  TurnNatives()
   PutCircles()
   DeployHog()
-  IsolateNatives()
-  HideCyborg()
+  EndTurn(true)
+  if nativesNum > 1 then
+    IsolateNatives()
+  end
 end
 
 function SpawnPlatformCrates()
@@ -623,20 +655,19 @@
 end
 
 function AfterWave2DeadAnim()
-  TurnsLeft = 7
   stage = platformStage
   SpawnPlatformCrates()
   SetGearMessage(CurrentHedgehog, 0)
-  AddEvent(CheckTurnsOver, {}, DoTurnsOver, {3}, 0)
   AddEvent(CheckWaveDead, {3}, DoWaveDead, {3}, 0)
   AddEvent(CheckDeployedDead, {}, DoDeployedDead, {}, 0)
-  EndTurn(true)
+  HideCyborg()
   ShowMission(loc("Backstab"), loc("Drills"), loc("You have 7 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: You might want to use some mines ..."), 1, 12000)
 end
 
 function DoTurnsOver()
   stage = wave3Stage
-  RestoreWave(3)
+  RestoreWave(3, true)
+  DeleteCircles()
 end
 
 function SkipWave2Anim()
@@ -659,31 +690,27 @@
 
 function AfterStartAnim()
   AnimSwitchHog(natives[leaksNum])
-  EndTurn(true)
   stage = spyKillStage
   AddEvent(CheckChoice, {}, DoChoice, {}, 0)
   AddEvent(CheckKilledOther, {}, DoKilledOther, {}, 0)
   AddEvent(CheckChoiceRefuse, {}, DoChoiceRefuse, {}, 0)
+  AddEvent(CheckChoiceRunaway, {}, DoChoiceRefuse, {}, 0)
   ShowMission(loc("Backstab"), loc("Judas"),
     string.format(loc("Kill the traitor, %s, or spare his life!"), GetHogName(spyHog)) .. "|" ..
     loc("Kill him or skip your turn."),
-    1, 8000)
+    3, 8000)
 end
 
 -----------------------------Events------------------------------------
-function CheckTurnsOver()
-  return TurnsLeft == 0
-end
-
 function CheckDeployedDead()
   return deployedDead
 end
 
 function DoDeployedDead()
-  ShowMission(loc("Backstab"), loc("Brutus"), loc("You have failed to save the tribe!"), 0, 6000)
-  DismissTeam(loc("Natives"))
-  DismissTeam(loc("Tribe"))
-  DismissTeam(loc("011101001"))
+  ShowMission(loc("Backstab"), loc("Brutus"), loc("You have failed to save the tribe!"), -amSkip, 6000)
+  DismissTeam(nativesTeamName)
+  DismissTeam(tribeTeamName)
+  DismissTeam(cyborgTeamName)
   EndTurn(true)
 end
 
@@ -702,6 +729,7 @@
 
 function DoChoice()
   RemoveEventFunc(CheckChoiceRefuse)
+  RemoveEventFunc(CheckChoiceRunaway)
   SetGearMessage(CurrentHedgehog, 0)
   SetupAfterChoiceAnim()
   AddAnim(afterChoiceAnim)
@@ -709,7 +737,21 @@
 end
 
 function CheckChoiceRefuse()
-  return highJumped == true and StoppedGear(CurrentHedgehog)
+  return GetHealth(CurrentHedgehog) and highJumped == true and StoppedGear(CurrentHedgehog)
+end
+
+function CheckChoiceRunaway()
+  return GetHealth(CurrentHedgehog) and band(GetState(CurrentHedgehog), gstHHDriven) ~= 0 and GetHogTeamName(CurrentHedgehog) == nativesTeamName and GetX(CurrentHedgehog) >= runawayX and GetY(CurrentHedgehog) >= runawayY and StoppedGear(CurrentHedgehog)
+end
+
+function CheckChoiceRunawayAll()
+  for i= 1, 7 do
+    local hog = natives[i]
+    if hog ~= nil and GetHealth(hog) and hog ~= spyHog and GetX(hog) >= runawayX and GetY(hog) >= runawayY and StoppedGear(hog) then
+      return true
+    end
+  end
+  return false
 end
 
 function DoChoiceRefuse()
@@ -725,9 +767,9 @@
 end
 
 function DoKilledOther()
-  ShowMission(loc("Backstab"), loc("Brutus"), loc("You have killed an innocent hedgehog!"), 0, 6000)
-  DismissTeam(loc("Natives"))
-  DismissTeam(loc("Tribe"))
+  ShowMission(loc("Backstab"), loc("Brutus"), loc("You have killed an innocent hedgehog!"), -amSkip, 6000)
+  DismissTeam(nativesTeamName)
+  DismissTeam(tribeTeamName)
   EndTurn(true)
 end
 
@@ -746,6 +788,7 @@
 end
 
 function AddWave3DeadAnim()
+  SetSoundMask(sndBoring, true)
   AnimSwitchHog(deployedHog)
   AnimWait(deployedHog, 1)
   AddFunction({func = HideNatives, args = {}})
@@ -768,12 +811,15 @@
 function SetupWave3DeadAnim()
   table.insert(wave3DeadAnim, {func = AnimTurn, args = {deployedHog, "Left"}})
   table.insert(wave3DeadAnim, {func = AnimSay, args = {deployedHog, loc("That ought to show them!"), SAY_SAY, 4000}})
-  table.insert(wave3DeadAnim, {func = AnimSay, args = {deployedHog, loc("Guys, do you think there's more of them?"), SAY_SHOUT, 7000}})
+  table.insert(wave3DeadAnim, {func = AnimSay, args = {deployedHog, loc("Guys, do you think there's more of them?"), SAY_SHOUT, 5000}})
+  table.insert(wave3DeadAnim, {func = AnimCustomFunction, args = {deployedHog, MoveCameraCustom, {unpack(nativePos[wiseNum])}}})
   table.insert(wave3DeadAnim, {func = AnimVisualGear, args = {deployedHog, unpack(nativePos[wiseNum]), vgtFeather, 0, true, true}})
-  table.insert(wave3DeadAnim, {func = AnimWait, args = {deployedHog, 1000}})
+  table.insert(wave3DeadAnim, {func = AnimWait, args = {deployedHog, 1750}})
+  table.insert(wave3DeadAnim, {func = AnimCustomFunction, args = {deployedHog, FollowGear, {deployedHog}}})
+  table.insert(wave3DeadAnim, {func = AnimWait, args = {deployedHog, 100}})
   table.insert(wave3DeadAnim, {func = AnimSay, args = {deployedHog, loc("Where are they?!"), SAY_THINK, 3000}})
   table.insert(wave3DeadAnim, {func = AnimCustomFunction, args = {deployedHog, RestoreCyborg, {}}})
-  table.insert(wave3DeadAnim, {func = AnimOutOfNowhere, args = {cyborg, 4040, 782}})
+  table.insert(wave3DeadAnim, {func = AnimOutOfNowhere, args = {cyborg, 4040, 790}})
   table.insert(wave3DeadAnim, {func = AnimSay, args = {cyborg, loc("These primitive people are so funny!"), SAY_THINK, 6500}})
   table.insert(wave3DeadAnim, {func = AnimMove, args = {cyborg, "Right", 4060, 0, 7000}})
   table.insert(wave3DeadAnim, {func = AnimSwitchHog, args = {deployedHog}})
@@ -834,10 +880,10 @@
     end
   end
 
-  DismissTeam(loc("Tribe"))
-  DismissTeam(loc("Assault Team"))
-  DismissTeam(loc("Reinforcements"))
-  DismissTeam(loc("011101001"))
+  DismissTeam(tribeTeamName)
+  DismissTeam(cannibalsTeamName1)
+  DismissTeam(cannibalsTeamName2)
+  DismissTeam(cyborgTeamName)
   EndTurn(true)
 end
 
@@ -868,12 +914,16 @@
 end
 
 
-function RestoreWave(index)
+function RestoreWave(index, animate)
   for i = (index - 1) * 3 + 1, index * 3 do
     if cannibalHidden[i] == true then
       RestoreHog(cannibals[i])
-      AnimSetGearPosition(cannibals[i], unpack(cannibalPos[i]))
-      FollowGear(cannibals[i])
+      if animate then
+        AnimOutOfNowhere(cannibals[i], unpack(cannibalPos[i]))
+      else
+        AnimSetGearPosition(cannibals[i], unpack(cannibalPos[i]))
+        FollowGear(cannibals[i])
+      end
       cannibalHidden[i] = false
     end
   end
@@ -881,13 +931,12 @@
 
 function GetVariables()
   progress = tonumber(GetCampaignVar("Progress"))
-  m2DenseDead = tonumber(GetCampaignVar("M2DenseDead"))
   m2Choice = tonumber(GetCampaignVar("M2Choice")) or choiceRefused
-  m4DenseDead = tonumber(GetCampaignVar("M4DenseDead"))
-  m4LeaksDead = tonumber(GetCampaignVar("M4LeaksDead"))
-  m4ChiefDead = tonumber(GetCampaignVar("M4ChiefDead"))
-  m4WaterDead = tonumber(GetCampaignVar("M4WaterDead"))
-  m4BuffaloDead = tonumber(GetCampaignVar("M4BuffaloDead"))
+  m4DenseDead = tonumber(GetCampaignVar("M4DenseDead")) or 0
+  m4LeaksDead = tonumber(GetCampaignVar("M4LeaksDead")) or 0
+  m4ChiefDead = tonumber(GetCampaignVar("M4ChiefDead")) or 0
+  m4WaterDead = tonumber(GetCampaignVar("M4WaterDead")) or 0
+  m4BuffaloDead = tonumber(GetCampaignVar("M4BuffaloDead")) or 0
 end
 
 function HideCyborg()
@@ -901,6 +950,18 @@
   if cyborgHidden == true then
     RestoreHog(cyborg)
     cyborgHidden = false
+    -- Clear mines and crates around cyborg
+    local vaporized = 0
+    for gear, _ in pairs(trackedNonCyborgGears) do
+       if GetHealth(gear) and GetHealth(cyborg) and gearIsInBox(gear, GetX(cyborg) - 50, GetY(cyborg) - 50, 100, 100) == true then
+          AddVisualGear(GetX(gear), GetY(gear), vgtSmoke, 0, false)
+          DeleteGear(gear)
+          vaporized = vaporized + 1
+       end
+    end
+    if vaporized > 0 then
+       PlaySound(sndVaporize)
+    end
   end
 end
 
@@ -957,28 +1018,29 @@
 end
 
 function AddHogs()
-  AddTeam(loc("Tribe"), -2, "Bone", "Island", "HillBilly", "cm_birdy")
+  tribeTeamName = AddTeam(loc("Tribe"), -2, "Bone", "Island", "HillBilly_qau", "cm_birdy")
+  SetTeamPassive(tribeTeamName, true)
   for i = 8, 9 do
     natives[i] = AddHog(nativeNames[i], 0, 100, nativeHats[i])
   end
 
-  AddTeam(loc("Natives"), -2, "Bone", "Island", "HillBilly", "cm_birdy")
+  nativesTeamName = AddMissionTeam(-2)
   for i = 1, 7 do
     natives[i] = AddHog(nativeNames[i], 0, 100, nativeHats[i])
   end
   nativesNum = 7
 
-  AddTeam(loc("Assault Team"), -1, "skull", "Island", "Pirate", "cm_vampire")
+  cannibalsTeamName1 = AddTeam(loc("Assault Team"), -1, "skull", "Island", "Pirate_qau", "cm_vampire")
   for i = 1, 6 do
     cannibals[i] = AddHog(cannibalNames[i], 3, 50, "vampirichog")
   end
 
-  AddTeam(loc("Reinforcements"), -1, "skull", "Island", "Pirate", "cm_vampire")
+  cannibalsTeamName2 = AddTeam(loc("Reinforcements"), -1, "skull", "Island", "Pirate_qau", "cm_vampire")
   for i = 7, 9 do
     cannibals[i] = AddHog(cannibalNames[i], 2, 50, "vampirichog")
   end
 
-  AddTeam(loc("011101001"), -1, "ring", "UFO", "Robot", "cm_binary")
+  cyborgTeamName = AddTeam(loc("011101001"), -1, "ring", "UFO", "Robot_qau", "cm_binary")
   cyborg = AddHog(loc("Unit 334a$7%;.*"), 0, 200, "cyborg1")
 
   for i = 1, 9 do
@@ -1009,14 +1071,12 @@
 
 function onGameInit()
 	Seed = 2
-	-- gfTagTeam makes it easier to skip the Tribe team
-	GameFlags = gfSolidLand + gfTagTeam
+	GameFlags = gfSolidLand
 	TurnTime = 60000 
 	CaseFreq = 0
 	MinesNum = 0
 	MinesTime = 3000
 	Explosives = 0
-	Delay = 10 
 	Map = "Cave"
 	Theme = "Nature"
 	WaterRise = 0
@@ -1032,6 +1092,11 @@
   AnimationSetup()
   AddAnim(startAnim)
   AddFunction({func = AfterStartAnim, args = {}})
+  SetAmmoDelay(amBlowTorch, 9999)
+  SetAmmoDelay(amGirder, 9999)
+  SetAmmoDelay(amLandGun, 9999)
+  SetAmmoDelay(amRope, 9999)
+  SetAmmoDelay(amParachute, 9999)
 end
 
 function onGameTick()
@@ -1043,7 +1108,19 @@
   CheckEvents()
 end
 
+function onGearAdd(gear)
+  local gt = GetGearType(gear)
+  if gt == gtMine or gt == gtSMine or gt == gtAirMine or gt == gtCase then
+    trackedNonCyborgGears[gear] = true
+  end
+end
+
 function onGearDelete(gear)
+  local gt = GetGearType(gear)
+  if gt == gtMine or gt == gtSMine or gt == gtAirMine or gt == gtCase then
+    trackedNonCyborgGears[gear] = nil
+  end
+
   for i = 1, 7 do
     if gear == natives[i] then
       if nativeDead[i] ~= true then
@@ -1110,31 +1187,38 @@
     return
   end
 
-  if GetHogTeamName(CurrentHedgehog) == loc("Tribe") then
-    EndTurn(true)
-    return
-  end
-  TurnsLeft = TurnsLeft - 1
-  
   if stage == platformStage then
-    AddCaption(string.format(loc("Turns until arrival: %d"), TurnsLeft))
+    if wave3TurnsLeft == nil then
+      wave3TurnsLeft = 7
+    end
+    if wave3TurnsLeft > 0 then
+      -- Workaround for the FIXME below: Use capgrpAmmoinfo to overwrite the incorrect ammo display
+      AddCaption(string.format(loc("Turns until arrival: %d"), wave3TurnsLeft), capcolDefault, capgrpAmmoinfo)
+    end
   end
   if deployedHog then
-    if GetHogTeamName(CurrentHedgehog) == loc("Natives") then
+    if GetHogTeamName(CurrentHedgehog) == nativesTeamName then
+      -- FIXME: This screws up the selected weapon caption, as
+      -- this function does not update the selected display caption (workaround above)
       AnimSwitchHog(deployedHog)
     end
   end
 
   if stage == spyKillStage then
-    if CurrentHedgehog == spyHog or GetHogTeamName(CurrentHedgehog) ~= loc("Natives") then
+    if GetHogTeamName(CurrentHedgehog) ~= nativesTeamName then
       EndTurn(true)
     else
+      if CurrentHedgehog == spyHog then
+        AnimSwitchHog(natives[leaksNum])
+      end
       SetGearMessage(CurrentHedgehog, 0)
-      --AnimSwitchHog(natives[leaksNum])
       SetTurnTimeLeft(MAX_TURN_TIME)
+      if CheckChoiceRunawayAll() then
+        highJumped = true
+      end
     end
   else
-    if freshDead ~= nil and GetHogTeamName(CurrentHedgehog) == loc("Natives") then
+    if freshDead ~= nil and GetHogTeamName(CurrentHedgehog) == nativesTeamName then
       SetupHogDeadAnim(freshDead)
       AddAnim(hogDeadAnim)
       AddFunction({func = AfterHogDeadAnim, args = {}})
@@ -1158,6 +1242,15 @@
   end
 end
 
+function onEndTurn()
+  if stage == platformStage and wave3TurnsLeft ~= nil then
+    wave3TurnsLeft = wave3TurnsLeft - 1
+    if wave3TurnsLeft == 0 then
+      DoTurnsOver()
+    end
+  end
+end
+
 function onPrecise()
   if GameTime > 2500 and AnimInProgress() then
     SetAnimSkip(true)
@@ -1170,3 +1263,11 @@
     highJumped = true
   end
 end
+
+function onGameResult(winner)
+  if winner == GetTeamClan(nativesTeamName) then
+    SendStat(siGameResult, loc("Mission succeeded!"))
+  else
+    SendStat(siGameResult, loc("Mission failed!"))
+  end
+end
--- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/dragon.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/dragon.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -170,6 +170,8 @@
 cyborgsPos = {{2937, 831}, {2945, 1264}, {2335, 1701}, {448, 484}}
 cyborgsDir = {"Left", "Left", "Left", "Right"}
 
+cyborgTeamName, fighterTeamName, nativesTeamName = nil, nil, nil
+
 cratePos = {
             {{788, 1919, amGirder, 2}, true}, {{412, 1615, amGirder, 1}, true},
             {{209, 1474, amSniperRifle, 1}}, {{1178, 637, amDEagle, 1}},
@@ -210,6 +212,8 @@
 cratesTaken = false
 doneCyborgsDead = false
 
+timeAfterCratesTaken = nil
+
 annoyingGearsForPortalScene = {}
 -----------------------------Animations--------------------------------
 function EmitDenseClouds(dir)
@@ -381,7 +385,12 @@
 function AfterKillAnim()
   if not cyborgsKilledBeforeCrates then
     PutWeaponCrates()
-    SetTurnTimeLeft(TurnTime)
+    if timeAfterCratesTaken then
+      SetTurnTimeLeft(timeAfterCratesTaken)
+    else
+      SetTurnTimeLeft(TurnTime)
+    end
+    SetReadyTimeLeft(Ready)
     AddEvent(CheckCyborgsDead, {}, DoCyborgsDead, {}, 0)
     ShowMission(loc("Dragon's Lair"), loc("The Slaughter"), loc("Kill the aliens!").."|"..loc("Mines time: 5 seconds"), 1, 2000)
   end
@@ -396,7 +405,7 @@
 function AfterKilledAnim()
   -- Final mission segment with the portal gun
   HideHedge(cyborg)
-  SetTurnTimeLeft(TurnTime)
+  EndTurn(true)
   SetGearMessage(native, 0)
   SpawnSupplyCrate(1184, 399, amPortalGun, 100)
   SpawnSupplyCrate(2259, 755, amTeleport, 2)
@@ -458,6 +467,7 @@
 
 function DoCratesTaken()
   cratesTaken = true
+  timeAfterCratesTaken = TurnTimeLeft
   SetupKillAnim()
   SetGearMessage(CurrentHedgehog, 0)
   AddAnim(killAnim)
@@ -497,6 +507,7 @@
   end
   RestoreHedge(cyborg)
   DeleteGear(cyborg)
+  DismissTeam(fighterTeamName) -- just in case
   EndTurn(true)
 end
 
@@ -527,7 +538,7 @@
 function CyborgDeadReact()
   freshDead = nil
   if cyborgsLeft == 0 then
-    if not cratesTaken then
+    if (not cratesTaken) and (not CheckMissionFinished()) then
        AnimSay(native, loc("I still have to get rid of the crates."), SAY_THINK, 8000)
     end
     return
@@ -563,7 +574,10 @@
     end
   end
   HideHedge(cyborg)
+  -- Collect this crate to win
   jetCrate = SpawnSupplyCrate(3915, 1723, amJetpack)
+  -- Protect crate from damage, just in case
+  SetState(jetCrate, bor(GetState(jetCrate), gstNoDamage))
 
   --[[ Block the left entrance.
        Otherwise the player could rope out of the map and
@@ -625,17 +639,17 @@
 end
 
 function AddHogs()
-  AddTeam(loc("Natives"), -2, "Bone", "Island", "HillBilly", "cm_birdy")
+  nativesTeamName = AddMissionTeam(-2)
   for i = 1, 7 do
     natives[i] = AddHog(nativeNames[i], 0, 200, nativeHats[i])
     gearDead[natives[i]] = false
   end
 
-  AddTeam(loc("011101001"), -1, "ring", "UFO", "Robot", "cm_binary")
+  cyborgTeamName = AddTeam(loc("011101001"), -1, "ring", "UFO", "Robot_qau", "cm_binary")
   cyborg = AddHog(loc("Unit 334a$7%;.*"), 0, 200, "cyborg1")
   gearDead[cyborg] = false
 
-  AddTeam(loc("011101000"), -9, "ring", "UFO", "Robot", "cm_binary")
+  fighterTeamName = AddTeam(loc("011101000"), -9, "ring", "UFO", "Robot_qau", "cm_binary")
   for i = 1, 4 do
     cyborgs[i] = AddHog(cyborgNames[i], 2, 100, "cyborg2")
     gearDead[cyborgs[i]] = false
@@ -679,7 +693,8 @@
   Explosives = 0
   MapGen = mgDrawn
   Theme = "City"
-  SuddenDeathTurns = 25
+  WaterRise = 0
+  HealthDecrease = 0
 
   for i = 1, #map do
      ParseCommand('draw ' .. map[i])
@@ -695,7 +710,7 @@
   SetupPlace()
   AnimationSetup()
   SetupEvents()
-  ShowMission(loc("Dragon's Lair"), loc("Y Chwiliad"), loc("Find your tribe!|Cross the lake!"), 1, 0)
+  ShowMission(loc("Dragon's Lair"), loc("Y Chwiliad"), loc("Find your tribe!|Cross the lake!"), 10, 0)
 end
 
 function onGameTick()
@@ -710,7 +725,7 @@
 function onGearDelete(gear)
   gearDead[gear] = true
   if GetGearType(gear) == gtHedgehog then
-    if GetHogTeamName(gear) == loc("011101000") then
+    if GetHogTeamName(gear) == fighterTeamName then
       freshDead = GetHogName(gear)
       cyborgsLeft = cyborgsLeft - 1
     end
@@ -740,13 +755,13 @@
     AddFunction({func = AfterStartAnim, args = {}})
     firstTurn = false
   end
-  if GetHogTeamName(CurrentHedgehog) == loc("011101000") then
+  if GetHogTeamName(CurrentHedgehog) == fighterTeamName then
     if TotalRounds % 6 == 0 then
       AddAmmo(CurrentHedgehog, amSniperRifle, 1)
       AddAmmo(CurrentHedgehog, amDEagle, 1)
     end
     SetTurnTimeLeft(30000)
-  elseif GetHogTeamName(CurrentHedgehog) == loc("011101001") then
+  elseif GetHogTeamName(CurrentHedgehog) == cyborgTeamName then
     EndTurn(true)
   end
 end
@@ -756,3 +771,12 @@
     SetAnimSkip(true)
   end
 end
+
+function onGameResult(winner)
+  if winner == GetTeamClan(nativesTeamName) then
+    SendStat(siGameResult, loc("Mission succeeded!"))
+  else
+    SendStat(siGameResult, loc("Mission failed!"))
+  end
+end
+
--- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/enemy.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/enemy.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -9,8 +9,9 @@
 
 = FLOW CHART =
 - Cut scene: startAnim
-- Player starts with 3-4 natives and 4 cannibals
-- Player plays with 4 natives if m5DeployedNum ~= leaksNum and m8DeployedLeader == 0
+- Player starts with 3-5 natives and 4 cannibals
+- Mission adds 1 native if m5DeployedNum ~= leaksNum and m8DeployedLeader == 0
+- Mission adds 1 native (princess) if m8PrincessLeader == 0
 - Enemy starts with 5 cyborgs
 - TBS
 - Goal completed
@@ -21,6 +22,7 @@
 
 HedgewarsScriptLoad("/Scripts/Locale.lua")
 HedgewarsScriptLoad("/Scripts/Animate.lua")
+HedgewarsScriptLoad("/Scripts/Utils.lua")
 
 
 --------------------------------------------Constants------------------------------------
@@ -78,6 +80,12 @@
 leaderPos = {3474, 151}
 leaderDir = "Left"
 
+cyborgTeamName = nil
+nativesTeamName = nil
+cannibalsTeamName = nil
+hedgecogsTeamName = nil
+leaderTeamName = nil
+
 -----------------------------Variables---------------------------------
 natives = {}
 origNatives = {}
@@ -91,12 +99,16 @@
 
 gearDead = {}
 hedgeHidden = {}
+trackedMines = {}
 
 startAnim = {}
 finalAnim = {}
 -----------------------------Animations--------------------------------
 function CondNeedToTurn(hog1, hog2)
-  xl, xd = GetX(hog1), GetX(hog2)
+  if (not GetHealth(hog1)) or (not GetHealth(hog2)) then
+    return
+  end
+  local xl, xd = GetX(hog1), GetX(hog2)
   if xl > xd then
     AnimInsertStepNext({func = AnimTurn, args = {hog1, "Left"}})
     AnimInsertStepNext({func = AnimTurn, args = {hog2, "Right"}})
@@ -107,7 +119,10 @@
 end
 
 function CondNeedToTurn2(hog1, hog2)
-  xl, xd = GetX(hog1), GetX(hog2)
+  if (not GetHealth(hog1)) or (not GetHealth(hog2)) then
+    return
+  end
+  local xl, xd = GetX(hog1), GetX(hog2)
   if xl > xd then
     AnimTurn(hog1, "Left")
     AnimTurn(hog2, "Right")
@@ -198,7 +213,7 @@
     table.insert(startAnim, {func = AnimSay, args = {players[1], loc("And how am I alive?!"), SAY_SAY, 3000}})
   end
   local playerTalker
-  -- There are 3 or 4 natives in this mission. The last one takes part in the dialog
+  -- Number of natives varies in this mission. One of them takes part in the dialog
   if nativesNum >= 4 then
      playerTalker = players[4]
   else
@@ -404,6 +419,7 @@
 function FailedMission()
   RestoreHedge(cyborg)
   AnimOutOfNowhere(cyborg, unpack(cyborgPos[1]))
+  ClearMinesAroundCyborg()
   if CheckCyborgsDead() then
     AnimSay(cyborg, loc("Hmmm...it's a draw. How unfortunate!"), SAY_THINK, 6000)
   elseif leader ~= nil then
@@ -419,9 +435,9 @@
 end
 
 function LoseMission()
-  DismissTeam(loc("Natives"))
-  DismissTeam(loc("Cannibals"))
-  DismissTeam(loc("011101001"))
+  DismissTeam(nativesTeamName)
+  DismissTeam(cannibalsTeamName)
+  DismissTeam(cyborgTeamName)
   EndTurn(true)
 end
 
@@ -429,6 +445,7 @@
   RestoreHedge(cyborg)
   CondNeedToTurn2(cyborg, players[1])
   SetupFinalAnim()
+  ClearMinesAroundCyborg()
   AddAnim(finalAnim)
   AddFunction({func = WinMission, args = {}})
 end
@@ -437,7 +454,7 @@
   if progress and progress<9 then
     SaveCampaignVar("Progress", "9")
   end
-  DismissTeam(loc("011101001"))
+  DismissTeam(cyborgTeamName)
   EndTurn(true)
 end
 -----------------------------Misc--------------------------------------
@@ -455,31 +472,31 @@
   end
 end
 
+function ClearMinesAroundCyborg()
+  if GetHealth(cyborg) then
+    local vaporized = 0
+    for mine, _ in pairs(trackedMines) do
+       if GetHealth(mine) and GetHealth(cyborg) and gearIsInBox(mine, GetX(cyborg) - 50, GetY(cyborg) - 50, 100, 100) == true then
+          AddVisualGear(GetX(mine), GetY(mine), vgtSmoke, 0, false)
+          DeleteGear(mine)
+          vaporized = vaporized + 1
+       end
+    end
+    if vaporized > 0 then
+       PlaySound(sndVaporize)
+    end
+  end
+end
+
 function GetVariables()
   progress = tonumber(GetCampaignVar("Progress"))
   m5DeployedNum = tonumber(GetCampaignVar("M5DeployedNum")) or leaksNum
   m2Choice = tonumber(GetCampaignVar("M2Choice")) or choiceRefused
   m5Choice = tonumber(GetCampaignVar("M5Choice")) or choiceEliminate
-  m2DenseDead = tonumber(GetCampaignVar("M2DenseDead"))
-  m4DenseDead = tonumber(GetCampaignVar("M4DenseDead"))
-  m5DenseDead = tonumber(GetCampaignVar("M5DenseDead"))
-  m4LeaksDead = tonumber(GetCampaignVar("M4LeaksDead"))
-  m5LeaksDead = tonumber(GetCampaignVar("M5LeaksDead"))
-  m4ChiefDead = tonumber(GetCampaignVar("M4ChiefDead"))
-  m5ChiefDead = tonumber(GetCampaignVar("M5ChiefDead"))
-  m4WaterDead = tonumber(GetCampaignVar("M4WaterDead"))
-  m5WaterDead = tonumber(GetCampaignVar("M5WaterDead"))
-  m4BuffaloDead = tonumber(GetCampaignVar("M4BuffaloDead"))
-  m5BuffaloDead = tonumber(GetCampaignVar("M5BuffaloDead"))
-  m5WiseDead = tonumber(GetCampaignVar("M5WiseDead"))
-  m5GirlDead = tonumber(GetCampaignVar("M5GirlDead"))
-  m8DeployedDead = tonumber(GetCampaignVar("M8DeployedDead"))
-  m8PrincessDead = tonumber(GetCampaignVar("M8PrincessDead"))
-  m8RamonDead = tonumber(GetCampaignVar("M8RamonDead"))
-  m8SpikyDead = tonumber(GetCampaignVar("M8SpikyDead"))
+  m5LeaksDead = tonumber(GetCampaignVar("M5LeaksDead")) or 0
   m8DeployedLeader = tonumber(GetCampaignVar("M8DeployedLeader")) or 0
   m8PrincessLeader = tonumber(GetCampaignVar("M8PrincessLeader")) or 1
-  m8EnemyFled = tonumber(GetCampaignVar("M8EnemyFled"))
+  m8EnemyFled = tonumber(GetCampaignVar("M8EnemyFled")) or 0
   m8Scene = tonumber(GetCampaignVar("M8Scene")) or princessScene
 end
 
@@ -519,11 +536,11 @@
 end
 
 function AddHogs()
-  AddTeam(loc("011101001"), -1, "ring", "UFO", "Robot", "cm_binary")
+  cyborgTeamName = AddTeam(loc("011101001"), -1, "ring", "UFO", "Robot_qau", "cm_binary")
   cyborg = AddHog(loc("Unit 334a$7%;.*"), 0, 200, "cyborg1")
 
-  AddTeam(loc("Natives"), -2, "Bone", "Island", "HillBilly", "cm_birdy")
-  -- There are 3-4 natives in this mission
+  nativesTeamName = AddMissionTeam(-2)
+  -- There are 3-5 natives in this mission
   natives[1] = AddHog(nativeNames[leaksNum], 0, 100, nativeHats[leaksNum])
   if m5DeployedNum ~= leaksNum and m8DeployedLeader == 0 then
     natives[2] = AddHog(nativeNames[m5DeployedNum], 0, 100, nativeHats[m5DeployedNum])
@@ -540,7 +557,7 @@
     table.insert(players, natives[i])
   end
 
-  AddTeam(loc("Cannibals"), -2, "Bone", "Island", "HillBilly", "cm_birdy")
+  cannibalsTeamName = AddTeam(loc("Cannibals"), -2, "skull", "Island", "Pirate_qau", "cm_vampire")
   for i = 1, cannibalsNum do
     cannibals[i] = AddHog(cannibalNames[i], 0, 100, "Zombi")
     table.insert(players, cannibals[i])
@@ -548,13 +565,13 @@
   playersNum = #players
   playersLeft = playersNum
 
-  AddTeam(loc("Hedge-cogs"), -9, "ring", "UFO", "Robot", "cm_cyborg")
+  hedgecogsTeamName = AddTeam(loc("Hedge-cogs"), -9, "ring", "UFO", "Robot_qau", "cm_cyborg")
   for i = 1, cyborgsNum do
     cyborgs[i] = AddHog(cyborgNames[i], 2, 80, "cyborg2")
   end
 
   if m8EnemyFled == 1 then
-    AddTeam(loc("Leader"), -9, "ring", "UFO", "Robot", "cm_cyborg")
+    leaderTeamName = AddTeam(loc("Leader"), -9, "ring", "UFO", "Robot_qau", "cm_cyborg")
     if m8Scene == denseScene then
       leader = AddHog(loc("Dense Cloud"), 2, 200, nativeHats[denseNum])
     elseif m8Scene == waterScene then
@@ -598,10 +615,10 @@
 	MinesNum = 0
 	MinesTime = 3000
 	Explosives = 0
-	Delay = 10 
   Map = "Islands"
 	Theme = "EarthRise"
-  SuddenDeathTurns = 20
+  WaterRise = 0
+  HealthDecrease = 0
 
   GetVariables()
   AnimInit()
@@ -626,10 +643,21 @@
   CheckEvents()
 end
 
+function onGearAdd(gear)
+  local gt = GetGearType(gear)
+  if gt == gtMine or gt == gtSMine or gt == gtAirMine then
+    trackedMines[gear] = true
+  end
+end
+
 function onGearDelete(gear)
+  local gt = GetGearType(gear)
+  if gt == gtMine or gt == gtSMine or gt == gtAirMine then
+    trackedMines[gear] = nil
+  end
   gearDead[gear] = true
-  if GetGearType(gear) == gtHedgehog then
-    if GetHogTeamName(gear) == loc("Natives") then
+  if gt == gtHedgehog then
+    if GetHogTeamName(gear) == nativesTeamName then
       for i = 1, nativesLeft do
         if natives[i] == gear then
           table.remove(natives, i)
@@ -638,7 +666,7 @@
           playersLeft = playersLeft - 1
         end
       end
-    elseif GetHogTeamName(gear) == loc("Cannibals") then
+    elseif GetHogTeamName(gear) == cannibalsTeamName then
       for i = 1, cannibalsLeft do
         if cannibals[i] == gear then
           table.remove(cannibals, i)
@@ -647,7 +675,7 @@
           playersLeft = playersLeft - 1
         end
       end
-    elseif GetHogTeamName(gear) == loc("Hedge-cogs") then
+    elseif GetHogTeamName(gear) == hedgecogsTeamName then
       for i = 1, cyborgsLeft do
         if cyborgs[i] == gear then
           table.remove(cyborgs, i)
@@ -685,11 +713,11 @@
   elseif cyborgsDeadFresh then
     cyborgsDeadFresh = false
     WonMission()
-  elseif nativesDeadFresh and GetHogTeamName(CurrentHedgehog) == loc("Cannibals") then
-    AnimSay(CurrentHedgehog, loc("Your deaths will be avenged, Natives!"), SAY_SHOUT, 0)
+  elseif nativesDeadFresh and GetHogTeamName(CurrentHedgehog) == cannibalsTeamName then
+    AnimSay(CurrentHedgehog, string.format(loc("Your deaths will be avenged, %s!"), nativesTeamName), SAY_SHOUT, 0)
     nativesDeadFresh = false
-  elseif cannibalsDeadFresh and GetHogTeamName(CurrentHedgehog) == loc("Natives") then
-    AnimSay(CurrentHedgehog, loc("Your deaths will be avenged, Cannibals!"), SAY_SHOUT, 0)
+  elseif cannibalsDeadFresh and GetHogTeamName(CurrentHedgehog) == nativesTeamName then
+    AnimSay(CurrentHedgehog, string.format(loc("Your deaths will be avenged, %s!"), cannibalsTeamName), SAY_SHOUT, 0)
     cannibalsDeadFresh = false
   end
 end
@@ -699,3 +727,12 @@
     SetAnimSkip(true)
   end
 end
+
+function onGameResult(winner)
+  if winner == GetTeamClan(nativesTeamName) then
+    SendStat(siGameResult, loc("Mission succeeded!"))
+  else
+    SendStat(siGameResult, loc("Mission failed!"))
+  end
+end
+
--- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/epil.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/epil.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -113,6 +113,8 @@
 
 gearDead = {}
 hogDead = {}
+
+local traitorTeamName = loc("Traitors")
 --------------------------Anim skip functions--------------------------
 function SkipStartAnim()
   SetGearMessage(CurrentHedgehog, 0)
@@ -127,7 +129,7 @@
   ShowMission(loc("Epilogue"), loc("That's all, folks!"),
     loc("You have successfully finished the campaign!").."|"..
     loc("If you wish to replay, there are other possible endings, too!").."|"..
-    loc("You can practice moving around and using utilities in this mission.|However, it will never end!"), 1, 0)
+    loc("You can practice moving around and using utilities in this mission.|However, it will never end!"), 4, 0)
   SaveCampaignVar("Progress", "10")
   SaveCampaignVar("Won", "true")
 end
@@ -311,23 +313,25 @@
 end
 
 function AddHogs()
-	AddTeam(loc("Natives"), -2, "Bone", "Island", "HillBilly", "cm_birdy")
+  local nativesTeamName = AddMissionTeam(-2)
   for i = 1, 5 do
     natives[i] = AddHog(nativeNames[i], 0, 100, nativeHats[i])
   end
 
-	AddTeam(loc("More Natives"), -2, "Bone", "Island", "HillBilly", "cm_birdy")
+  local grave, voice, flag = GetHogGrave(natives[1]), GetHogVoicepack(natives[1]), GetHogFlag(natives[1])
+  AddTeam(string.format(loc("%s (contd.)"), nativesTeamName), -2, grave, "Island", voice, flag)
   for i = 6, 10 do
     natives[i] = AddHog(nativeNames[i], 0, 100, nativeHats[i])
   end
 
-	AddTeam(loc("Cannibals"), -2, "skull", "Island", "HillBilly", "cm_birdy")
+  AddTeam(loc("Cannibals"), -2, "skull", "Island", "Pirate_qau", "cm_vampire")
   for i = 1, 5 do
     cannibals[i] = AddHog(cannibalNames[i], 0, 100, cannibalHats[i])
   end
 
   if m8Scene == denseScene or m8Scene == waterScene then
-    AddTeam(loc("Traitors"), -2, "Bone", "Island", "HillBilly", "cm_bloodyblade")
+    traitorTeamName = AddTeam(traitorTeamName, -2, grave, "Island", voice, "cm_bloodyblade")
+    SetTeamPassive(traitorTeamName, true)
     if m8Scene == denseScene then
       DeleteGear(natives[2])
       natives[2] = AddHog(nativeNames[2], 0, 100, nativeHats[2])
@@ -395,7 +399,6 @@
 	MinesNum = 0
 	MinesTime = 3000
 	Explosives = 0
-	Delay = 10 
   Map = "Hogville"
 	Theme = "Nature"
   -- Disable Sudden Death
@@ -434,6 +437,9 @@
   if GetGearType(gear) == gtHedgehog then
     hogDead[gear] = true
   end
+  if IsEveryoneExceptTraitorDead() then
+    SetTeamPassive(traitorTeamName, false)
+  end
 end
 
 function onAmmoStoreInit()
@@ -483,16 +489,7 @@
 end
 
 function onNewTurn()
-  if AnimInProgress() then
-    SetTurnTimeLeft(MAX_TURN_TIME)
-    return
-  end
-  -- Don't allow player to play with traitor, except when it is the final hog left
-  if CurrentHedgehog == traitor and not IsEveryoneExceptTraitorDead() then
-    EndTurn(true)
-  else
-    SetTurnTimeLeft(MAX_TURN_TIME)
-  end
+  SetTurnTimeLeft(MAX_TURN_TIME)
 end
 
 function onPrecise()
@@ -500,3 +497,8 @@
     SetAnimSkip(true)
   end
 end
+
+function onGameResult(winner)
+  AddCaption(loc("Game over!"), capcolDefault, capgrpGameState)
+  SendStat(siGameResult, loc("You have successfully finished the campaign!"))
+end
--- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/family.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/family.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -104,6 +104,11 @@
               {3749, 1040}, {2475, 1338}, {3853, 881}}
 cyborgsDir = {"Left", "Left", "Left", "Left", "Left", "Right"}
 
+princessTeamName = nil
+nativesTeamName = nil
+biomechanicTeamName = nil
+cyborgTeamName = nil
+
 princessPos = {3737, 1181}
 crateConsts = {}
 reactions = {}
@@ -379,7 +384,7 @@
       SaveCampaignVar("Progress", "7")
     end
     princessFreed = true
-    DismissTeam(loc("011101001"))
+    DismissTeam(cyborgTeamName)
     EndTurn(true)
   end
 end
@@ -435,8 +440,8 @@
     RemoveEventFunc(CheckCloseToPrincess)
     RemoveEventFunc(CheckPrincessFreed)
     AddCaption(loc("So the princess was never heard of again ..."))
-    DismissTeam(loc("Natives"))
-    DismissTeam(loc("Princess"))
+    DismissTeam(nativesTeamName)
+    DismissTeam(princessTeamName)
     EndTurn(true)
   end
 end
@@ -519,22 +524,23 @@
 end
 
 function AddHogs()
-  AddTeam(loc("Princess"), -2, "Bone", "Island", "HillBilly", "cm_birdy")
+  princessTeamName = AddTeam(loc("Princess"), -2, "Bone", "Island", "HillBilly_qau", "cm_female")
+  SetTeamPassive(princessTeamName, true)
   princess = AddHog(loc("Fell From Heaven"), 0, 333, "tiara")
   SetGearAIHints(princess, aihDoesntMatter)
   gearDead[princess] = false
 
-  AddTeam(loc("Natives"), -2, "Bone", "Island", "HillBilly", "cm_birdy")
+  nativesTeamName = AddMissionTeam(-2)
   for i = 7, 9 do
     natives[i-6] = AddHog(nativeNames[i], 0, 100, nativeHats[i])
     gearDead[natives[i-6]] = false
   end
 
-  AddTeam(loc("011101001"), -1, "ring", "UFO", "Robot", "cm_binary")
+  cyborgTeamName = AddTeam(loc("011101001"), -1, "ring", "UFO", "Robot_qau", "cm_binary")
   cyborg = AddHog(loc("Unit 334a$7%;.*"), 0, 200, "cyborg1")
   gearDead[cyborg] = false
 
-  AddTeam(loc("Biomechanic Team"), -1, "ring", "UFO", "Robot", "cm_cyborg")
+  biomechanicTeamName = AddTeam(loc("Biomechanic Team"), -1, "ring", "UFO", "Robot_qau", "cm_cyborg")
   for i = 1, cyborgsNum do
     cyborgs[i] = AddHog(cyborgNames[i], cyborgsDif[i], cyborgsHealth[i], "cyborg2")
     gearDead[cyborgs[i]] = false
@@ -573,17 +579,16 @@
 
 function onGameInit()
 	Seed = 0
-	-- Using gfTagTeam makes it far easier to skip the Princess team
-	GameFlags = gfSolidLand + gfDisableLandObjects + gfDisableGirders + gfTagTeam
+	GameFlags = gfSolidLand + gfDisableLandObjects + gfDisableGirders
 	TurnTime = 60000 
 	CaseFreq = 0
 	MinesNum = 0
 	MinesTime = 3000
 	Explosives = 0
-	Delay = 10 
   MapGen = mgDrawn
 	Theme = "Hell"
-  SuddenDeathTurns = 35
+  WaterRise = 0
+  HealthDecrease = 0
 
 	for i = 1, #map do
 		ParseCommand('draw ' .. map[i])
@@ -614,7 +619,7 @@
 function onGearDelete(gear)
   gearDead[gear] = true
   if GetGearType(gear) == gtHedgehog then
-    if GetHogTeamName(gear) == loc("Biomechanic Team") then
+    if GetHogTeamName(gear) == biomechanicTeamName then
       cyborgsLeft = cyborgsLeft - 1
     end
   end
@@ -648,9 +653,6 @@
       end
     end
     EndTurn(true)
-  elseif CurrentHedgehog == princess then
-    -- Princess is passive
-    EndTurn(true)
   else
     for i = 1, 3 do
       if gearDead[natives[i]] ~= true then
@@ -671,3 +673,12 @@
 --  end
 --  AddAmmo(natives[1], amTeleport, 100)
 end
+
+function onGameResult(winner)
+  if winner == GetTeamClan(nativesTeamName) then
+    SendStat(siGameResult, loc("Mission succeeded!"))
+  else
+    SendStat(siGameResult, loc("Mission failed!"))
+  end
+end
+
--- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/first_blood.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/first_blood.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -31,7 +31,7 @@
 
 - Introduction; movement (left/right/jump) instructions
 - Player moves to mushroom
-- Double jump instructions, move to flower
+- Backjump instructions, move to flower
 - Collect first crate (rope)
 - Rope instructions
 - Parachute crate appears in the right pit
@@ -111,8 +111,8 @@
 
 targets = {}
 crates = {}
-targXdif2 = {2755, 2638, 2921, 2973, 3162, 3067, 3062, 1300}
-targYdif2 = {1197, 1537, 1646, 1857, 1804, 1173, 1167, 1183}
+targXdif2 = {2755, 2638, 2921, 2973, 3162, 3067, 2674, 1300}
+targYdif2 = {1197, 1537, 1646, 1857, 1804, 1173, 1844, 1183}
 targXdif1 = {2749, 2909, 2770, 2836, 1558, 1305}
 targYdif1 = {1179, 1313, 1734, 1441, 1152, 1259}
 targetPosX = {{821, 866, 789}, {614, 656, 638}, {1238, 1237, 1200}}
@@ -121,12 +121,13 @@
 rope2GirderX = 3245
 rope2GirderY = 1190
 
-stage = 1
+nativesTeamName = nil
+inCrateChallenge = false
 cratesCollected = 0
 chalTries = 0
 targetsDestroyed = 0
 targsWave = 1
-tTime = -1
+tTime = MAX_TURN_TIME
 difficulty = 1
 
 cannibalVisible = false
@@ -150,20 +151,33 @@
 princessFace = "Left"
 elderFace = "Left"
 
+local ctrlJump, ctrlMissionPanel, ctrlAttack
+if INTERFACE == "touch" then
+    ctrlJump = loc("Long Jump: Tap the [Curvy Arrow] button for long")
+    ctrlMissionPanel = loc("Hint: Pause the game to review the mission texts.")
+    ctrlAttack = loc("Attack: Tap the [Bomb]")
+else
+    ctrlJump = loc("Long Jump: [Enter]")
+    ctrlMissionPanel = loc("Hint: Hold down [M] to review the mission texts.")
+    ctrlAttack = loc("Attack: [Space]")
+end
+
 goals = {
-  [startDialogue] = {loc("First Blood"), loc("First Steps"), loc("Press [Left] or [Right] to move around, [Enter] to jump"), 1, 4000},
-  [onShroomAnim] = {loc("First Blood"), loc("A leap in a leap"), loc("Go on top of the flower") .. "|" .. loc("Hint: Hold down [M] to review the mission texts."), 1, 7000},
-  [onFlowerAnim] = {loc("First Blood"), loc("Hightime"), loc("Collect the crate on the right.|Hint: Select the rope, [Up] or [Down] to aim, [Space] to fire, directional keys to move.|Ropes can be fired again in the air!"), 1, 7000},
-  [tookParaAnim] = {loc("First Blood"), loc("Omnivore"), loc("Get on the head of the mole"), 1, 4000},
-  [onMoleHeadAnim] = {loc("First Blood"), loc("The Leap of Faith"), loc("Use the parachute ([Space] while in air) to get the next crate"), 1, 4000},
-  [tookRope2Anim] = {loc("First Blood"), loc("The Rising"), loc("Get that crate!"), 1, 4000},
-  [tookPunchAnim] = {loc("First Blood"), loc("The Slaughter"), loc("Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."), 1, 5000},
-  [challengeAnim] = {loc("First Blood"), loc("The Crate Frenzy"), loc("Collect the crates within the time limit!|If you fail, you'll have to try again."), 1, 5000},
-  [challengeFailedAnim] = {loc("First Blood"), loc("The Crate Frenzy"), loc("Collect the crates within the time limit!|If you fail, you'll have to try again."), 1, 5000},
-  [challengeCompletedAnim] = {loc("First Blood"), loc("The Ultimate Weapon"), loc("Get that crate!"), 1, 5000},
+  [startDialogue] = {loc("First Blood"), loc("First Steps"), loc("Press [Left] or [Right] to move around, [Long Jump] to jump forwards.") .. "| |" .. ctrlJump, 2, 4000},
+  [onShroomAnim] = {loc("First Blood"), loc("A leap in a leap"), loc("Go on top of the flower.") .. "|" .. ctrlMissionPanel, 2, 7000},
+  [onFlowerAnim] = {loc("First Blood"), loc("Hightime"), loc("Collect the crate on the right.") .. "|" .. loc("Hint: Select the rope, [Up] or [Down] to aim, [Attack] to fire, directional keys to move.") .. "|" .. loc("Ropes can be fired again in the air!") .. "| |" .. ctrlAttack, 2, 7000},
+  [tookParaAnim] = {loc("First Blood"), loc("Omnivore"), loc("Get on the head of the mole."), 1, 4000},
+  [onMoleHeadAnim] = {loc("First Blood"), loc("The Leap of Faith"), loc("Use the parachute to get the next crate.") .. "|" .. loc("Hint: Just select the parachute, it opens automatically when you fall."), 2, 4000},
+  [pastMoleHeadAnim] = {loc("First Blood"), loc("The Leap of Faith"), loc("Get that crate!"), 5, 4000},
+  [tookRope2Anim] = {loc("First Blood"), loc("The Rising"), loc("Get that crate!"), 7, 4000},
+  [tookPunchAnim] = {loc("First Blood"), loc("The Slaughter"), loc("Destroy the targets!") .. "|" .. loc("Hint: Select the Shoryuken and hit [Attack].|P.S.: You can use it mid-air.") .. "| |" .. ctrlAttack, 1, 5000},
+  [challengeAnim] = {loc("First Blood"), loc("The Crate Frenzy"), loc("Collect the crates within the time limit!|If you fail, you'll have to try again."), 7, 5000},
+  [challengeFailedAnim] = {loc("First Blood"), loc("The Crate Frenzy"), loc("Collect the crates within the time limit!|If you fail, you'll have to try again."), 7, 5000},
+  [challengeCompletedAnim] = {loc("First Blood"), loc("The Ultimate Weapon"), loc("Get that crate!"), 7, 5000},
   [beforeKillAnim] = {loc("First Blood"), loc("The First Blood"), loc("Kill the cannibal!"), 1, 5000},
-  [closeCannim] = {loc("First Blood"), loc("The First Blood"), loc("KILL IT!"), 1, 5000}
+  [closeCannim] = {loc("First Blood"), loc("The First Blood"), loc("KILL IT!"), 1, 5000},
 }
+
 -----------------------------Animations--------------------------------
 function Skipanim(anim)
   AnimSwitchHog(youngh)
@@ -214,7 +228,7 @@
   table.insert(startDialogue, {func = AnimJump, args = {youngh, "long"}})
   table.insert(startDialogue, {func = AnimTurn, args = {princess, "Right"}})
   table.insert(startDialogue, {func = AnimSwitchHog, args = {youngh}})
-  table.insert(startDialogue, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("First Steps"), loc("Press [Left] or [Right] to move around, [Enter] to jump"), 1, 4000}})
+  table.insert(startDialogue, {func = AnimShowMission, args = {youngh, unpack(goals[startDialogue])}})
 
   AddSkipFunction(onShroomAnim, SkipOnShroom, {onShroomAnim})
   table.insert(onShroomAnim, {func = AnimSay, args = {elderh, loc("I can see you have been training diligently."), SAY_SAY, 4000}, skipFunc = Skipanim, skipArgs = onShroomAnim})
@@ -224,14 +238,14 @@
   table.insert(onShroomAnim, {func = AnimTurn, args = {elderh, "Left"}})
   table.insert(onShroomAnim, {func = AnimSay, args = {princess, loc("He moves like an eagle in the sky."), SAY_THINK, 4000}})
   table.insert(onShroomAnim, {func = AnimSwitchHog, args = {youngh}})
-  table.insert(onShroomAnim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("A leap in a leap"), loc("Go on top of the flower") .. "|" .. loc("Hint: Press [Esc] to review the mission texts."), 1, 7000}})
+  table.insert(onShroomAnim, {func = AnimShowMission, args = {youngh, unpack(goals[onShroomAnim])}})
 
   AddSkipFunction(onFlowerAnim, Skipanim, {onFlowerAnim})
   table.insert(onFlowerAnim, {func = AnimSay, args = {elderh, loc("See that crate farther on the right?"), SAY_SAY, 4000}})
   table.insert(onFlowerAnim, {func = AnimSay, args = {elderh, loc("Swing, Leaks A Lot, on the wings of the wind!"), SAY_SAY, 6000}})
   table.insert(onFlowerAnim, {func = AnimSay, args = {princess, loc("His arms are so strong!"), SAY_THINK, 4000}})
   table.insert(onFlowerAnim, {func = AnimSwitchHog, args = {youngh}})
-  table.insert(onFlowerAnim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("Hightime"), loc("Collect the crate on the right.|Hint: Select the rope, [Up] or [Down] to aim, [Space] to fire, directional keys to move.|Ropes can be fired again in the air!"), 1, 7000}})
+  table.insert(onFlowerAnim, {func = AnimShowMission, args = {youngh, unpack(goals[onFlowerAnim])}})
 
   AddSkipFunction(tookParaAnim, Skipanim, {tookParaAnim})
   table.insert(tookParaAnim, {func = AnimGearWait, args = {youngh, 1000}, skipFunc = Skipanim, skipArgs = tookParaAnim})
@@ -239,31 +253,32 @@
   table.insert(tookParaAnim, {func = AnimSay, args = {elderh, loc("Worry not, for it is a peaceful animal! There is no reason to be afraid..."), SAY_SHOUT, 5000}})
   table.insert(tookParaAnim, {func = AnimSay, args = {elderh, loc("We all know what happens when you get frightened..."), SAY_SAY, 4000}})
   table.insert(tookParaAnim, {func = AnimSay, args = {youngh, loc("So humiliating..."), SAY_SAY, 4000}})
-  table.insert(tookParaAnim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("Omnivore"), loc("Get on the head of the mole"), 1, 4000}})
+  table.insert(tookParaAnim, {func = AnimShowMission, args = {youngh, unpack(goals[tookParaAnim])}})
   table.insert(tookParaAnim, {func = AnimSwitchHog, args = {youngh}})
 
   AddSkipFunction(onMoleHeadAnim, Skipanim, {onMoleHeadAnim})
   table.insert(onMoleHeadAnim, {func = AnimSay, args = {elderh, loc("Perfect! Now try to get the next crate without hurting yourself!"), SAY_SAY, 4000}, skipFunc = Skipanim, skipArgs = onMoleHeadAnim})
   table.insert(onMoleHeadAnim, {func = AnimSay, args = {elderh, loc("The giant umbrella from the last crate should help break the fall."), SAY_SAY, 4000}})
   table.insert(onMoleHeadAnim, {func = AnimSay, args = {princess, loc("He's so brave..."), SAY_THINK, 4000}})
-  table.insert(onMoleHeadAnim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("The Leap of Faith"), loc("Use the parachute ([Space] while in air) to get the next crate"), 1, 4000}})
+  table.insert(onMoleHeadAnim, {func = AnimShowMission, args = {youngh, unpack(goals[onMoleHeadAnim])}})
   table.insert(onMoleHeadAnim, {func = AnimSwitchHog, args = {youngh}})
 
   AddSkipFunction(pastMoleHeadAnim, Skipanim, {pastMoleHeadAnim})
   table.insert(pastMoleHeadAnim, {func = AnimSay, args = {elderh, loc("I see you have already taken the leap of faith."), SAY_SAY, 4000}, skipFunc = Skipanim, skipArgs = pastMoleHeadAnim})
   table.insert(pastMoleHeadAnim, {func = AnimSay, args = {elderh, loc("Get that crate!"), SAY_SAY, 4000}})
+  table.insert(pastMoleHeadAnim, {func = AnimShowMission, args = {youngh, unpack(goals[pastMoleHeadAnim])}})
   table.insert(pastMoleHeadAnim, {func = AnimSwitchHog, args = {youngh}})
 
   AddSkipFunction(tookRope2Anim, Skipanim, {tookRope2Anim})
   table.insert(tookRope2Anim, {func = AnimSay, args = {elderh, loc("Impressive...you are still dry as the corpse of a hawk after a week in the desert..."), SAY_SAY, 5000}, skipFunc = Skipanim, skipArgs = tookRope2Anim})
   table.insert(tookRope2Anim, {func = AnimSay, args = {elderh, loc("You probably know what to do next..."), SAY_SAY, 4000}})
-  table.insert(tookRope2Anim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("The Rising"), loc("Get that crate!"), 1, 4000}})
+  table.insert(tookRope2Anim, {func = AnimShowMission, args = {youngh, unpack(goals[tookRope2Anim])}})
   table.insert(tookRope2Anim, {func = AnimSwitchHog, args = {youngh}})
 
   AddSkipFunction(tookPunchAnim, Skipanim, {tookPunchAnim})
   table.insert(tookPunchAnim, {func = AnimSay, args = {elderh, loc("It is time to practice your fighting skills."), SAY_SAY, 4000}})
   table.insert(tookPunchAnim, {func = AnimSay, args = {elderh, loc("Imagine those targets are the wolves that killed your parents! Take your anger out on them!"), SAY_SAY, 5000}})
-  table.insert(tookPunchAnim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("The Slaughter"), loc("Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."), 1, 5000}})
+  table.insert(tookPunchAnim, {func = AnimShowMission, args = {youngh, unpack(goals[tookPunchAnim])}})
   table.insert(tookPunchAnim, {func = AnimSwitchHog, args = {youngh}})
 
   AddSkipFunction(challengeAnim, Skipanim, {challengeAnim})
@@ -276,7 +291,7 @@
 
   AddSkipFunction(challengeFailedAnim, Skipanim, {challengeFailedAnim})
   table.insert(challengeFailedAnim, {func = AnimSay, args = {elderh, loc("Hmmm...perhaps a little more time will help."), SAY_SAY, 4000}, skipFunc = Skipanim, skipArgs = challengeFailedAnim})
-  table.insert(challengeFailedAnim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("The Crate Frenzy"), loc("Collect the crates within the time limit!|If you fail, you'll have to try again."), 1, 5000}})
+  table.insert(challengeFailedAnim, {func = AnimShowMission, args = {youngh, unpack(goals[challengeFailedAnim])}})
   table.insert(challengeFailedAnim, {func = AnimSwitchHog, args = {youngh}})
 
   AddSkipFunction(challengeCompletedAnim, Skipanim, {challengeCompletedAnim})
@@ -284,7 +299,7 @@
   table.insert(challengeCompletedAnim, {func = AnimSay, args = {elderh, loc("You have proven yourself worthy to see our most ancient secret!"), SAY_SAY, 4000}})
   table.insert(challengeCompletedAnim, {func = AnimSay, args = {elderh, loc("The weapon in that last crate was bestowed upon us by the ancients!"), SAY_SAY, 4000}})
   table.insert(challengeCompletedAnim, {func = AnimSay, args = {elderh, loc("Use it with precaution!"), SAY_SAY, 4000}})
-  table.insert(challengeCompletedAnim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("The Ultimate Weapon"), loc("Get that crate!"), 1, 5000}})
+  table.insert(challengeCompletedAnim, {func = AnimShowMission, args = {youngh, unpack(goals[challengeCompletedAnim])}})
   table.insert(challengeCompletedAnim, {func = AnimSwitchHog, args = {youngh}})
 
   AddSkipFunction(beforeKillAnim, Skipanim, {beforeKillAnim})
@@ -294,7 +309,7 @@
   table.insert(beforeKillAnim, {func = AnimWait, args = {cannibal, 1000}})
   table.insert(beforeKillAnim, {func = AnimSay, args = {elderh, loc("Destroy him, Leaks A Lot! He is responsible for the deaths of many of us!"), SAY_SHOUT, 4000}})
   table.insert(beforeKillAnim, {func = AnimSay, args = {cannibal, loc("Oh, my!"), SAY_THINK, 4000}})
-  table.insert(beforeKillAnim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("The First Blood"), loc("Kill the cannibal!"), 1, 5000}})
+  table.insert(beforeKillAnim, {func = AnimShowMission, args = {youngh, unpack(goals[beforeKillAnim])}})
   table.insert(beforeKillAnim, {func = AnimSwitchHog, args = {youngh}})
 
   AddSkipFunction(closeCannim, Skipanim, {closeCannim})
@@ -303,7 +318,7 @@
   table.insert(closeCannim, {func = AnimSay, args = {cannibal, loc("If only I were given a chance to explain my being here..."), SAY_SAY, 4000}})
   table.insert(closeCannim, {func = AnimSay, args = {elderh, loc("Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"), SAY_SAY, 6000}})
   table.insert(closeCannim, {func = AnimSay, args = {elderh, loc("Here...pick your weapon!"), SAY_SAY, 5000}})
-  table.insert(closeCannim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("The First Blood"), loc("KILL IT!"), 1, 5000}})
+  table.insert(closeCannim, {func = AnimShowMission, args = {youngh, unpack(goals[closeCannim])}})
   table.insert(closeCannim, {func = AnimSwitchHog, args = {youngh}})
 
   table.insert(cannKilledAnim, {func = AnimSay, args = {elderh, loc("Yes, yeees! You are now ready to enter the real world!"), SAY_SHOUT, 6000}})
@@ -377,7 +392,7 @@
   RemoveEventFunc(CheckDamage)
   RemoveEventFunc(CheckDamagedOthers)
   FinishThem()
-  ShowMission(loc("First Blood"), loc("The wasted youth"), loc("Leaks A Lot gave his life for his tribe! He should have survived!"), 2, 4000)
+  ShowMission(loc("First Blood"), loc("The wasted youth"), loc("Leaks A Lot gave his life for his tribe! He should have survived!"), -amSkip, 4000)
 end
 
 function CheckDamagedOthers()
@@ -406,16 +421,22 @@
 end
 
 function CheckMovedUntilJump()
-   return GetX(youngh) >= 2343
+   return GetHealth(youngh) and GetX(youngh) >= 2343
 end
 
 function DoMovedUntilJump()
-  ShowMission(loc("First Blood"), loc("Step By Step"), loc("Hint: Double Jump - Press [Backspace] twice"), -amSkip, 0)
+  local msg = loc("Look to the left and do a backwards jump towards the mushroom.") .. "| |"
+  if INTERFACE == "touch" then
+     msg = msg .. loc("Backwards jump: Tap the [Curvy Arrow] twice")
+  else
+     msg = msg .. loc("Backwards jump: Press [Backspace] twice")
+  end
+  ShowMission(loc("First Blood"), loc("Step By Step"), msg, 2, 10000)
   AddEvent(CheckOnShroom, {}, DoOnShroom, {}, 0)
 end
 
 function CheckOnShroom()
-  return GetX(youngh) >= 2461 and StoppedGear(youngh)
+  return GetHealth(youngh) and GetX(youngh) >= 2461 and StoppedGear(youngh)
 end
 
 function DoOnShroom()
@@ -444,45 +465,48 @@
 function DoTookParaCrate()
   AddAmmo(youngh, amParachute, 100)
   SetGearMessage(CurrentHedgehog, 0)
-  AddAnim(tookParaAnim)
-  AddEvent(CheckOnMoleHead, {}, DoOnMoleHead, {}, 0)
-  AddEvent(CheckPastMoleHead, {}, DoPastMoleHead, {}, 0)
+  if CheckOnOrPastMoleHead() then
+    DoOnOrPastMoleHead()
+  else
+    AddAnim(tookParaAnim)
+    AddEvent(CheckOnOrPastMoleHead, {}, DoOnOrPastMoleHead, {}, 0)
+  end
 end
 
 function CheckOnMoleHead()
-  x = GetX(youngh)
+  if not GetHealth(youngh) then
+    return false
+  end
+  local x = GetX(youngh)
   return x >= 3005 and x <= 3126 and StoppedGear(youngh)
 end
 
 function CheckPastMoleHead()
-  x = GetX(youngh)
-  y = GetY(youngh)
+  if not GetHealth(youngh) then
+    return false
+  end
+  local x = GetX(youngh)
+  local y = GetY(youngh)
   return x < 3005 and y > 1500 and StoppedGear(youngh)
 end
 
-function DoPastMoleHead()
+function CheckOnOrPastMoleHead()
+  return CheckOnMoleHead() or CheckPastMoleHead()
+end
+
+function DoOnOrPastMoleHead()
   -- Initiate parachute challenge
-  RemoveEventFunc(CheckOnMoleHead)
   ropeCrate2 = SpawnSupplyCrate(2782, 1720, amRope, 100)
   rope2InProgress = true
   AddAmmo(youngh, amRope, 0)
   SetGearMessage(CurrentHedgehog, 0)
   -- Block the way to the hole to the right, since the player loses the rope for this section
   PlaceGirder(rope2GirderX, rope2GirderY, 6)
-  AddAnim(pastMoleHeadAnim)
-  AddEvent(CheckTookRope2, {}, DoTookRope2, {}, 0)
-end
-
-function DoOnMoleHead()
-  -- Initiate parachute challenge
-  RemoveEventFunc(CheckPastMoleHead)
-  ropeCrate2 = SpawnSupplyCrate(2782, 1720, amRope, 100)
-  rope2InProgress = true
-  AddAmmo(youngh, amRope, 0)
-  SetGearMessage(CurrentHedgehog, 0)
-  -- Block the way to the hole to the right, since the player loses the rope for this section
-  PlaceGirder(rope2GirderX, rope2GirderY, 6)
-  AddAnim(onMoleHeadAnim)
+  if CheckPastMoleHead() then
+    AddAnim(pastMoleHeadAnim)
+  else
+    AddAnim(onMoleHeadAnim)
+  end
   AddEvent(CheckTookRope2, {}, DoTookRope2, {}, 0)
 end
 
@@ -532,6 +556,9 @@
   AddEvent(CheckTimesUp, {}, DoTimesUp, {}, 1)
   -- Remove up the old mole blockade from the parachute challenge
   EraseSprite(rope2GirderX, rope2GirderY, sprAmGirder, 6)
+  for i=-4,4 do
+    AddVisualGear(rope2GirderX, rope2GirderY + i * 18, vgtSteam, false, 0)
+  end
 end
 
 function DoChoice()
@@ -556,6 +583,7 @@
 end
 
 function DoChallengeWon()
+  inCrateChallenge = false
   desertCrate = SpawnSupplyCrate(1240, 1212, amDEagle, 100)
   SetGearMessage(CurrentHedgehog, 0)
   AddAnim(challengeCompletedAnim)
@@ -601,7 +629,7 @@
   PutTargets(1)
   AddEvent(CheckTargetsKilled, {}, DoTargetsKilled, {}, 1)
   AddEvent(CheckCannibalKilled, {}, DoCannibalKilledEarly, {}, 0)
-  ShowMission(loc("First Blood"), loc("The Bull's Eye"), loc("Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"), 1, 5000)
+  ShowMission(loc("First Blood"), loc("The Bull's Eye"), loc("Destroy the targets!"), 1, 5000)
 end
 
 function CheckTargetsKilled()
@@ -657,10 +685,11 @@
 
 -----------------------------Misc--------------------------------------
 function StartChallenge(time)
+  inCrateChallenge = true
   cratesCollected = 0
   PutCrate(1)
   SetTurnTimeLeft(time)
-  ShowMission(loc("First Blood"), loc("The Crate Frenzy"), loc("Collect the crates within the time limit!|If you fail, you'll have to try again."), 1, 5000)
+  ShowMission(loc("First Blood"), loc("The Crate Frenzy"), loc("Collect the crates within the time limit!|If you fail, you'll have to try again."), 7, 5000)
 end
 
 function ChoiceDialog()
@@ -675,7 +704,7 @@
     loc("Press [Left] and [Right] to change the difficulty.") .. "| |" ..
     dstr .. "| |" ..
     loc("Press [Attack] to begin."),
-    0, 9999000, true)
+    3, 9999000, true)
 end
 
 function SetChoice()
@@ -684,13 +713,10 @@
   ChoiceDialog()
 end
 
-function SetTime(time)
-  SetTurnTimeLeft(time)
-end
-
 function ResetTurnTime()
-  SetTurnTimeLeft(tTime)
-  tTime = -1
+  if inCrateChallenge then
+    SetTurnTimeLeft(tTime)
+  end
 end
 
 function PutCrate(i)
@@ -725,13 +751,14 @@
 	MinesNum = 0
 	MinesTime = 3000
 	Explosives = 0
-	Delay = 10
 	Map = "A_Classic_Fairytale_first_blood"
 	Theme = "Nature"
+	WaterRise = 0
+	HealthDecrease = 0
 
 
-	AddTeam(loc("Natives"), -2, "Bone", "Island", "HillBilly", "cm_birdy")
-	youngh = AddHog(loc("Leaks A Lot"), 0, 100, "Rambo")
+  nativesTeamName = AddMissionTeam(-2)
+  youngh = AddHog(loc("Leaks A Lot"), 0, 100, "Rambo")
   elderh = AddHog(loc("Righteous Beard"), 0, 99, "IndianChief")
   princess = AddHog(loc("Fell From Heaven"), 0, 300, "tiara")
   AnimSetGearPosition(princess, 1911, 1361)
@@ -741,7 +768,7 @@
   AnimSetGearPosition(youngh, 1862, 1362)
   HogTurnLeft(youngh, false)
 
-  AddTeam(loc("Cannibals"), -1, "skull", "Island", "Pirate","cm_vampire")
+  AddTeam(loc("Cannibals"), -1, "skull", "Island", "Pirate_qau", "cm_vampire")
   cannibal = AddHog(loc("Brainiac"), 0, 5, "Zombi")
   AnimSetGearPosition(cannibal, 525, 1256)
   HogTurnLeft(cannibal, false)
@@ -753,8 +780,16 @@
 function onGameStart()
   progress = tonumber(GetCampaignVar("Progress"))
   SetTurnTimeLeft(MAX_TURN_TIME)
+  SetReadyTimeLeft(0)
   FollowGear(youngh)
-	ShowMission(loc("A Classic Fairytale"), loc("First Blood"), loc("Finish your training|Hint: Animations can be skipped with the [Precise] key."), -amSkip, 0)
+  local msgSkip
+  if INTERFACE == "touch" then
+    -- FIXME: Precise key is not available in Touch
+    msgSkip = ""
+  else
+    msgSkip = "|" .. loc("Hint: Cinematics can be skipped with the [Precise] key.")
+  end
+  ShowMission(loc("A Classic Fairytale"), loc("First Blood"), loc("Finish your training.") .. msgSkip, 10, 0)
   HideHog(cannibal)
 
   AddAnim(startDialogue)
@@ -847,19 +882,30 @@
   end
   SwitchHog(youngh)
   FollowGear(youngh)
-  SetTurnTimeLeft(MAX_TURN_TIME)
+  if inCrateChallenge then
+    ResetTurnTime()
+  else
+    SetTurnTimeLeft(MAX_TURN_TIME)
+    SetReadyTimeLeft(0)
+  end
 end
 
 function onGearDamage(gear, damage)
   if gear == youngh then
     youngdamaged = true
-    tTime = TurnTimeLeft
+    if TurnTimeLeft > 0 then
+      tTime = TurnTimeLeft
+    end
   elseif gear == princess then
     princessDamaged = true
-    tTime = TurnTimeLeft
+    if TurnTimeLeft > 0 then
+      tTime = TurnTimeLeft
+    end
   elseif gear == elderh then
     elderDamaged = true
-    tTime = TurnTimeLeft
+    if TurnTimeLeft > 0 then
+      tTime = TurnTimeLeft
+    end
   elseif gear == cannibal then
     cannibalVisible = true
     cannibalDamaged = true
@@ -890,3 +936,11 @@
     DoChoice()
   end
 end
+
+function onGameResult(winner)
+  if winner == GetTeamClan(nativesTeamName) then
+    SendStat(siGameResult, loc("Mission succeeded!"))
+  else
+    SendStat(siGameResult, loc("Mission failed!"))
+  end
+end
--- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/journey.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/journey.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -129,14 +129,17 @@
 
 m2Choice = 0
 m2DenseDead = 0
-m2RamonDead = 0
-m2SpikyDead = 0
 
 TurnsLeft = 0
 stage = 0
 
+nativesTeamName = nil
+princessTeamName = nil
+cannibalsTeamName = nil
+cyborgTeamName = nil
+
+startAnimStarted = false
 blowTaken = false
-fireTaken = false
 gravityTaken = false
 sniperTaken = false
 leaksDead = false
@@ -178,8 +181,6 @@
 
 --/////////////////////////Animation Functions///////////////////////
 function AfterMidFailAnim()
-  DismissTeam(loc("Natives"))
-  DismissTeam(loc("Princess"))
   EndTurn(true)
 end
 
@@ -195,12 +196,12 @@
   AddEvent(CheckOnFirstGirder, {}, DoOnFirstGirder, {}, 0)
   AddEvent(CheckTookSniper, {}, DoTookSniper, {}, 0)
   AddEvent(CheckFailedCourse, {}, DoFailedCourse, {}, 0)
-  SetGearMessage(leaks, 0)
+  SetGearMessage(leaks, band(GetGearMessage(leaks), bnot(gmAllStoppable)))
   TurnsLeft = 12
   SetTurnTimeLeft(TurnTime)
   ShowMission(loc("The Journey Back"), loc("Collateral Damage"),
     loc("Save the princess by collecting the crate in under 12 turns!") .. "|" ..
-    loc("Mines time: 3 seconds"), 0, 6000)
+    loc("Mines time: 3 seconds"), 7, 6000)
   -----------------------///////////////------------
 end
 
@@ -228,8 +229,8 @@
 
 function AfterEndAnimAlone()
   stage = endStage
-  SwitchHog(leaks)
-  SetGearMessage(leaks, 0)
+  SetGearMessage(dense, band(GetGearMessage(dense), bnot(gmAllStoppable)))
+  AnimSwitchHog(leaks)
   SetTurnTimeLeft(MAX_TURN_TIME)
   ShowMission(loc("The Journey Back"), loc("Collateral Damage II"), loc("Save Fell From Heaven!"), 1, 4000)
   AddEvent(CheckLost, {}, DoLost, {}, 0)
@@ -239,9 +240,8 @@
 
 function AfterEndAnimDuo()
   stage = endStage
-  SwitchHog(leaks)
-  SetGearMessage(leaks, 0)
-  SetGearMessage(dense, 0)
+  SetGearMessage(dense, band(GetGearMessage(dense), bnot(gmAllStoppable)))
+  AnimSwitchHog(leaks)
   SetTurnTimeLeft(MAX_TURN_TIME)
   ShowMission(loc("The Journey Back"), loc("Collateral Damage II"), loc("Save Fell From Heaven!"), 1, 4000)
   AddEvent(CheckLost, {}, DoLost, {}, 0)
@@ -249,7 +249,7 @@
 end
 
 function SkipMidAnimAlone()
-  AnimSetGearPosition(leaks, 2656, 1842)
+  AnimSetGearPosition(leaks, 2656, 1845)
   AnimSwitchHog(leaks)
   AnimWait(dense, 1)
   AddFunction({func = HideHedge, args = {princess}})
@@ -257,7 +257,7 @@
 end
 
 function AfterStartAnim()
-  SetGearMessage(leaks, 0)
+  SetGearMessage(leaks, band(GetGearMessage(leaks), bnot(gmAllStoppable)))
   SetTurnTimeLeft(TurnTime)
   local goal = loc("Get the crate on the other side of the island.")
   local hint = loc("Hint: You might want to stay out of sight and take all the crates ...")
@@ -266,18 +266,19 @@
   if m2DenseDead == 0 then
     conds = loc("Your hogs must survive!")
   end
-  ShowMission(loc("The Journey Back"), loc("Adventurous"), goal .. "|" .. hint .. "|" .. stuck .. "|" .. conds, 0, 7000)
+  ShowMission(loc("The Journey Back"), loc("Adventurous"), goal .. "|" .. hint .. "|" .. stuck .. "|" .. conds, 1, 7000)
 end
 
 function SkipStartAnim()
+  AnimTurn(leaks, "Left")
   AnimSwitchHog(leaks)
 end
 
 function PlaceCratesDuo()
   SpawnSupplyCrate(3090, 827, amBaseballBat)
-  girderCrate1 = SpawnSupplyCrate(2466, 1814, amGirder)
+  girderCrate1 = SpawnSupplyCrate(2366, 1814, amGirder)
   girderCrate2 = SpawnSupplyCrate(2630, 1278, amGirder)
-  SpawnSupplyCrate(2422, 1810, amParachute)
+  SpawnSupplyCrate(2322, 1810, amParachute)
   SpawnSupplyCrate(3157, 1009, amLowGravity)
   sniperCrate = SpawnSupplyCrate(784, 1715, amSniperRifle)
 end
@@ -315,19 +316,20 @@
 function AfterPastFlowerAnim()
   PlaceMinesDuo()
   AddEvent(CheckDensePit, {}, DoDensePit, {}, 0)
-  SetGearMessage(leaks, 0)
-  SetGearMessage(dense, 0)
-  EndTurn(0)
+  SetGearMessage(dense, band(GetGearMessage(dense), bnot(gmAllStoppable)))
+  SetGearMessage(leaks, band(GetGearMessage(leaks), bnot(gmAllStoppable)))
+  EndTurn(true)
   ShowMission(loc("The Journey Back"), loc("The Savior"), 
     loc("Get Dense Cloud out of the pit!") .. "|" ..
     loc("Your hogs must survive!") .. "|" ..
-    loc("Beware of mines: They explode after 5 seconds."), 1, 5000)
+    loc("Beware of mines: They explode after 5 seconds."), 10, 5000)
 end
 
 function SkipPastFlowerAnim()
-  AnimSetGearPosition(dense, 2656, 1842)
-  AnimSwitchHog(dense)
-  AnimWait(dense, 1)
+  AnimSetGearPosition(dense, 2656, 1845)
+  AnimTurn(dense, "Left")
+  AnimSwitchHog(leaks)
+  AnimWait(leaks, 1)
   AddFunction({func = HideHedge, args = {cyborg}})
 end
 
@@ -336,9 +338,8 @@
   RestoreHedge(cannibals[5])
   AddAmmo(cannibals[5], amDEagle, 0)
   HideHedge(cannibals[5])
-  AddEvent(CheckTookFire, {}, DoTookFire, {}, 0)
-  SetGearMessage(leaks, 0)
-  SetGearMessage(dense, 0)
+  SetGearMessage(dense, band(GetGearMessage(dense), bnot(gmAllStoppable)))
+  SetGearMessage(leaks, band(GetGearMessage(leaks), bnot(gmAllStoppable)))
   EndTurn(true)
   ShowMission(loc("The Journey Back"), loc("They never learn"),
     loc("Free Dense Cloud and continue the mission!") .. "|" ..
@@ -408,7 +409,7 @@
   PlaceGirder(1033, 649, 0)
   PlaceGirder(952, 650, 0)
 
-  fireCrate = SpawnSupplyCrate(1846, 1100, amFirePunch)
+  SpawnSupplyCrate(1846, 1100, amFirePunch, AMMO_INFINITE)
   SpawnSupplyCrate(1900, 1100, amPickHammer)
   SpawnSupplyCrate(950, 674, amDynamite)
   SpawnSupplyCrate(994, 825, amRope)
@@ -482,6 +483,7 @@
   table.insert(startAnim, {func = AnimSay, args = {leaks, loc("I wonder where Dense Cloud is..."), SAY_THINK, 4000}})
   table.insert(startAnim, {func = AnimSay, args = {leaks, loc("He must be in the village already."), SAY_THINK, 4000}})
   table.insert(startAnim, {func = AnimSay, args = {leaks, loc("I'd better get going myself."), SAY_THINK, 4000}})
+  AddSkipFunction(startAnim, SkipStartAnim, {})
 
   midAnim = {}
   table.insert(midAnim, {func = AnimWait, args = {leaks, 500}})
@@ -494,7 +496,7 @@
   table.insert(midAnim, {func = AnimSay, args = {cyborg, loc("If you can get that crate fast enough, your beloved \"princess\" may go free."), SAY_SAY, 7000}})
   table.insert(midAnim, {func = AnimSay, args = {cyborg, loc("However, if you fail to do so, she dies a most violent death! Muahahaha!"), SAY_SAY, 8000}})
   table.insert(midAnim, {func = AnimSay, args = {cyborg, loc("Good luck...or else!"), SAY_SAY, 4000}})
-  table.insert(midAnim, {func = AnimTeleportGear, args = {leaks, 2656, 1842}})
+  table.insert(midAnim, {func = AnimTeleportGear, args = {leaks, 2656, 1845}})
   table.insert(midAnim, {func = AnimCustomFunction, args = {cyborg, HideCyborg, {}}, swh = false})
   table.insert(midAnim, {func = AnimSay, args = {leaks, loc("Hey! This is cheating!"), SAY_SHOUT, 4000}})
   AddSkipFunction(midAnim, SkipMidAnimAlone, {})
@@ -505,6 +507,7 @@
   table.insert(startAnimAD, {func = AnimTurn, args = {leaks, "Left"}})
   table.insert(startAnimAD, {func = AnimSay, args = {leaks, loc("I need to get to the other side of this island, fast!"), SAY_THINK, 5000}})
   table.insert(startAnimAD, {func = AnimSay, args = {leaks, loc("With Dense Cloud on the land of shadows, I'm the village's only hope..."), SAY_THINK, 7000}})
+  AddSkipFunction(startAnimAD, SkipStartAnim, {})
 
   table.insert(midAnimAD, {func = AnimWait, args = {leaks, 500}})
   table.insert(midAnimAD, {func = AnimCustomFunction, swh = false, args = {leaks, RestoreCyborg, {1300, 1200, 1390, 1200}}})
@@ -516,14 +519,14 @@
   table.insert(midAnimAD, {func = AnimSay, args = {cyborg, loc("If you can get that crate fast enough, your beloved \"princess\" may go free."), SAY_SAY, 7000}})
   table.insert(midAnimAD, {func = AnimSay, args = {cyborg, loc("However, if you fail to do so, she dies a most violent death, just like your friend! Muahahaha!"), SAY_SAY, 8000}})
   table.insert(midAnimAD, {func = AnimSay, args = {cyborg, loc("Good luck...or else!"), SAY_SAY, 4000}})
-  table.insert(midAnimAD, {func = AnimTeleportGear, args = {leaks, 2656, 1842}})
+  table.insert(midAnimAD, {func = AnimTeleportGear, args = {leaks, 2656, 1845}})
   table.insert(midAnimAD, {func = AnimCustomFunction, args = {cyborg, HideCyborg, {}}, swh = false})
   table.insert(midAnimAD, {func = AnimSay, args = {leaks, loc("Hey! This is cheating!"), SAY_SHOUT, 4000}})
   AddSkipFunction(midAnimAD, SkipMidAnimAlone, {})
 
   table.insert(failAnimAD, {func = AnimCustomFunction, args = {cyborg, ClearTrashForPrincessCage, {}}})
-  table.insert(failAnimAD, {func = AnimCustomFunction, swh = false, args = {leaks, RestoreCyborg, {2299, 1687, 2294, 1841}}})
-  table.insert(failAnimAD, {func = AnimTeleportGear, args = {leaks, 2090, 1841}})
+  table.insert(failAnimAD, {func = AnimCustomFunction, swh = false, args = {leaks, RestoreCyborg, {2299, 1687, 2294, 1845}}})
+  table.insert(failAnimAD, {func = AnimTeleportGear, args = {leaks, 2090, 1845}})
   table.insert(failAnimAD, {func = AnimCustomFunction, swh = false, args = {cyborg, SetupKillRoom, {}}})
   table.insert(failAnimAD, {func = AnimTurn, swh = false, args = {cyborg, "Left"}})
   table.insert(failAnimAD, {func = AnimTurn, swh = false, args = {princess, "Left"}})
@@ -578,12 +581,13 @@
   table.insert(pastFlowerAnimAL, {func = AnimSay, args = {cyborg, loc("Well, well! Isn't that the cutest thing you've ever seen?"), SAY_SAY, 7000}})
   table.insert(pastFlowerAnimAL, {func = AnimSay, args = {cyborg, loc("Two little hogs cooperating, getting past obstacles..."), SAY_SAY, 7000}})
   table.insert(pastFlowerAnimAL, {func = AnimSay, args = {cyborg, loc("Let me test your skills a little, will you?"), SAY_SAY, 6000}})
-  table.insert(pastFlowerAnimAL, {func = AnimTeleportGear, args = {cyborg, 2456, 1842}})
-  table.insert(pastFlowerAnimAL, {func = AnimTeleportGear, args = {dense, 2656, 1842}})
+  table.insert(pastFlowerAnimAL, {func = AnimWait, args = {cyborg, 2000}})
+  table.insert(pastFlowerAnimAL, {func = AnimTeleportGear, args = {cyborg, 2456, 1845}})
+  table.insert(pastFlowerAnimAL, {func = AnimTeleportGear, args = {dense, 2656, 1845}})
   table.insert(pastFlowerAnimAL, {func = AnimCustomFunction, args = {dense, CondNeedToTurn, {cyborg, dense}}})
   table.insert(pastFlowerAnimAL, {func = AnimSay, args = {dense, loc("Why are you doing this?"), SAY_SAY, 4000}})
   table.insert(pastFlowerAnimAL, {func = AnimSay, args = {cyborg, loc("To help you, of course!"), SAY_SAY, 4000}})
-  table.insert(pastFlowerAnimAL, {func = AnimSwitchHog, args = {dense}})
+  table.insert(pastFlowerAnimAL, {func = AnimSwitchHog, args = {leaks}})
   table.insert(pastFlowerAnimAL, {func = AnimDisappear, swh = false, args = {cyborg, 3781, 1583}})
   table.insert(pastFlowerAnimAL, {func = AnimCustomFunction, swh = false, args = {cyborg, HideCyborgOnly, {}}})
   AddSkipFunction(pastFlowerAnimAL, SkipPastFlowerAnim, {})
@@ -640,8 +644,9 @@
   table.insert(pastFlowerAnimRL, {func = AnimSay, args = {cyborg, loc("Well, well! Isn't that the cutest thing you've ever seen?"), SAY_SAY, 7000}})
   table.insert(pastFlowerAnimRL, {func = AnimSay, args = {cyborg, loc("Two little hogs cooperating, getting past obstacles..."), SAY_SAY, 7000}})
   table.insert(pastFlowerAnimRL, {func = AnimSay, args = {cyborg, loc("Let me test your skills a little, will you?"), SAY_SAY, 6000}})
-  table.insert(pastFlowerAnimRL, {func = AnimTeleportGear, args = {cyborg, 2456, 1842}})
-  table.insert(pastFlowerAnimRL, {func = AnimTeleportGear, args = {dense, 2656, 1842}})
+  table.insert(pastFlowerAnimRL, {func = AnimWait, args = {cyborg, 2000}})
+  table.insert(pastFlowerAnimRL, {func = AnimTeleportGear, args = {cyborg, 2456, 1845}})
+  table.insert(pastFlowerAnimRL, {func = AnimTeleportGear, args = {dense, 2656, 1845}})
   table.insert(pastFlowerAnimRL, {func = AnimCustomFunction, args = {dense, CondNeedToTurn, {cyborg, dense}}})
   table.insert(pastFlowerAnimRL, {func = AnimSay, args = {dense, loc("Why are you doing this?"), SAY_SAY, 4000}})
   table.insert(pastFlowerAnimRL, {func = AnimSay, args = {cyborg, loc("You couldn't possibly believe that after refusing my offer I'd just let you go!"), SAY_SAY, 9000}})
@@ -709,7 +714,7 @@
 end
 
 function CondNeedToTurn(hog1, hog2)
-  xl, xd = GetX(hog1), GetX(hog2)
+  local xl, xd = GetX(hog1), GetX(hog2)
   if xl > xd then
     AnimInsertStepNext({func = AnimTurn, args = {hog1, "Left"}})
     AnimInsertStepNext({func = AnimTurn, args = {hog2, "Right"}})
@@ -719,6 +724,17 @@
   end
 end
 
+function NeedToTurn(hog1, hog2)
+  local xl, xd = GetX(hog1), GetX(hog2)
+  if xl > xd then
+    AnimTurn(hog1, "Left")
+    AnimTurn(hog2, "Right")
+  elseif xl < xd then
+    AnimTurn(hog2, "Left")
+    AnimTurn(hog1, "Right")
+  end
+end
+
 function SetupPlaceAlone()
   ------ AMMO CRATE LIST ------
   SpawnSupplyCrate(3124, 952, amBaseballBat)
@@ -746,7 +762,7 @@
   AddGear(2239, 1295, gtMine, 0, 0, 0, 0)
 
   AnimSetGearPosition(leaks, 3781, 1583)
-  AddAmmo(cannibals[1], amShotgun, 100)
+  AddAmmo(cannibals[1], amShotgun, AMMO_INFINITE)
   AddAmmo(leaks, amSwitch, 0)
 end
 
@@ -782,8 +798,6 @@
     end
     SetupPlaceAlone()
     SetupEventsAlone()
-    AddAnim(startAnim)
-    AddFunction({func = AfterStartAnim, args = {}})
   else
     if m2Choice == choiceAccepted then
       SetupAnimAcceptedLived()
@@ -792,8 +806,6 @@
     end
     SetupPlaceDuo()
     SetupEventsDuo()
-    AddAnim(startAnim)
-    AddFunction({func = AfterStartAnim, args = {}})
   end
   HideHedge(cyborg)
   HideHedge(princess)
@@ -864,13 +876,6 @@
 
 
 --////////////////////////////Event Functions////////////////////////
-function CheckTookFire()
-  return fireTaken
-end
-
-function DoTookFire()
-  AddAmmo(leaks, amFirePunch, 100)
-end
 
 function CheckDensePit()
   if GetHealth(dense) ~= nil then
@@ -881,7 +886,7 @@
 end
 
 function DoDensePit()
-  EndTurn(0)
+  EndTurn(true)
   RestoreHedge(cyborg)
   AnimWait(cyborg, 1)
   AddFunction({func = AddAnim, args = {outPitAnim}})
@@ -913,8 +918,8 @@
   if not princessDead then
     EndTurn(true)
     AddCaption(loc("The village, unprepared, was destroyed by the cyborgs..."))
-    DismissTeam(loc("Natives"))
-    DismissTeam(loc("Princess"))
+    DismissTeam(nativesTeamName)
+    DismissTeam(princessTeamName)
   end
 end
 
@@ -926,8 +931,8 @@
   if not princessDead then
     EndTurn(true)
     AddCaption(loc("The village, unprepared, was destroyed by the cyborgs..."))
-    DismissTeam(loc("Natives"))
-    DismissTeam(loc("Princess"))
+    DismissTeam(nativesTeamName)
+    DismissTeam(princessTeamName)
   end
 end
 
@@ -939,7 +944,7 @@
   ShowMission(loc("The Journey Back"), loc("The Tunnel Maker"), 
     loc("Get past the flower.").."|"..
     loc("Hint: Select the blow torch, aim and press [Fire]. Press [Fire] again to stop.").."|"..
-    loc("Don't blow up the crate."), 0, 6000)
+    loc("Don't blow up the crate."), 2, 6000)
 end
 
 function CheckTookLowGravity()
@@ -950,7 +955,7 @@
   ShowMission(loc("The Journey Back"), loc("The Moonwalk"),
     loc("Hop on top of the next flower and advance to the left coast.").."|"..
     loc("Hint: Select the low gravity and press [Fire].") .. "|" ..
-    loc("Beware of mines: They explode after 3 seconds."), 0, 6000)
+    loc("Beware of mines: They explode after 3 seconds."), 2, 6000)
 end
 
 function CheckOnBridge()
@@ -975,7 +980,7 @@
   ShowMission(loc("The Journey Back"), loc("Slippery"), 
     loc("Collect the weapon crate at the left coast!") .. "|" ..
     loc("You'd better watch your steps...") .. "|" ..
-    loc("Mines time: 3 seconds"), 0, 4000)
+    loc("Mines time: 3 seconds"), 7, 4000)
 end
 
 function CheckTookSniper()
@@ -992,7 +997,7 @@
 end
 
 function CheckTookSniper2()
-  return sniperTaken and StoppedGear(leaks) and StoppedGear(dense)
+  return sniperTaken and leaksDead == false and StoppedGear(leaks) and denseDead == false and StoppedGear(dense)
 end
 
 function DoTookSniper2()
@@ -1012,11 +1017,11 @@
   if not cyborgDead then
     SwitchHog(cyborg)
   end
-  if not (leaksDead or denseDead) then
+  if (not (leaksDead or denseDead)) and (TurnsLeft > 0)  then
     AddAnim(endFailAnim)
   end
-  AddFunction({func = DismissTeam, args = {loc("Natives")}})
-  AddFunction({func = DismissTeam, args = {loc("Princess")}})
+  AddFunction({func = DismissTeam, args = {nativesTeamName}})
+  AddFunction({func = DismissTeam, args = {princessTeamName}})
   AddFunction({func = EndTurn, args = {true}})
 end
 
@@ -1035,8 +1040,8 @@
 
 function FinishWon()
   SwitchHog(leaks)
-  DismissTeam(loc("Cannibal Sentry"))
-  DismissTeam(loc("011101001"))
+  DismissTeam(cannibalsTeamName)
+  DismissTeam(cyborgTeamName)
   EndTurn(true)
 end
 
@@ -1051,6 +1056,7 @@
   AnimWait(cyborg, 1)
   AddFunction({func = AddAnim, args = {failAnim}})
   AddFunction({func = AddFunction, args = {{func = AfterMidFailAnim, args = {}}}})
+  AddEvent(CheckLost, {}, DoLost, {})
 end
 
 function SkipFailAnimAlone()
@@ -1064,9 +1070,7 @@
 function onGameInit()
   progress = tonumber(GetCampaignVar("Progress"))
   m2Choice = tonumber(GetCampaignVar("M2Choice")) or choiceRefused
-  m2DenseDead = tonumber(GetCampaignVar("M2DenseDead"))
-  m2RamonDead = tonumber(GetCampaignVar("M2RamonDead"))
-  m2SpikyDead = tonumber(GetCampaignVar("M2SpikyDead"))
+  m2DenseDead = tonumber(GetCampaignVar("M2DenseDead")) or 0
 
 	Seed = 0
 	GameFlags = gfSolidLand + gfDisableWind
@@ -1080,7 +1084,6 @@
 		MinesTime = 5000
 	end
 	Explosives = 0
-	Delay = 5
     Map = "A_Classic_Fairytale_journey"
     Theme = "Nature"
 
@@ -1088,14 +1091,17 @@
     HealthDecrease = 0
     WaterRise = 0
 
-  AddTeam(loc("Natives"), -2, "Bone", "Island", "HillBilly", "cm_birdy")
+  AnimInit(true)
+
+  nativesTeamName = AddMissionTeam(-2)
   leaks = AddHog(loc("Leaks A Lot"), 0, 100, "Rambo")
   dense = AddHog(loc("Dense Cloud"), 0, 100, "RobinHood")
 
-  AddTeam(loc("Princess"), -2, "Bone", "Island", "HillBilly", "cm_birdy")
+  princessTeamName = AddTeam(loc("Princess"), -2, "Bone", "Island", "HillBilly_qau", "cm_female")
+  SetTeamPassive(princessTeamName, true)
   princess = AddHog(loc("Fell From Heaven"), 0, 200, "tiara")
 
-  AddTeam(loc("Cannibal Sentry"), -1, "skull", "Island", "Pirate","cm_vampire")
+  cannibalsTeamName = AddTeam(loc("Cannibal Sentry"), -1, "skull", "Island", "Pirate_qau", "cm_vampire")
   cannibals = {}
   for i = 1, 4 do
     cannibals[i] = AddHog(cannibalNames[i], 3, 40, "Zombi")
@@ -1109,15 +1115,13 @@
     SetEffect(cannibals[i], heArtillery, 1)
   end
 
-  AddTeam(loc("011101001"), -1, "ring", "UFO", "Robot", "cm_binary")
+  cyborgTeamName = AddTeam(loc("011101001"), -1, "ring", "UFO", "Robot_qau", "cm_binary")
   cyborg = AddHog(loc("Y3K1337"), 0, 200, "cyborg1")
 
   AnimSetGearPosition(dense, 0, 0)
   AnimSetGearPosition(leaks, 0, 0)
   AnimSetGearPosition(cyborg, 0, 0)
   AnimSetGearPosition(princess, 0, 0)
-  
-  AnimInit()
 end
 
 function onGameStart()
@@ -1147,8 +1151,6 @@
   end
   if gear == blowCrate then
     blowTaken = true
-  elseif gear == fireCrate then
-    fireTaken = true
   elseif gear == gravityCrate then
     gravityTaken = true
   elseif gear == leaks and not victory then
@@ -1187,15 +1189,23 @@
 end
 
 function onNewTurn()
+  if not startAnimStarted then
+      AddAnim(startAnim)
+      AddFunction({func = AfterStartAnim, args = {}})
+      startAnimStarted = true
+  end
   if AnimInProgress() then
     SetTurnTimeLeft(MAX_TURN_TIME)
   elseif victory then
     EndTurn(true)
-  elseif stage == endStage and CurrentHedgehog ~= leaks then
-    AnimSwitchHog(leaks)
-    SetGearMessage(leaks, 0)
-    SetTurnTimeLeft(MAX_TURN_TIME)
-  elseif GetHogTeamName(CurrentHedgehog) ~= loc("Natives") then
+  elseif stage == endStage then
+    if GetHogTeamName(CurrentHedgehog) == nativesTeamName and CurrentHedgehog ~= leaks then
+      AnimSwitchHog(leaks)
+      SetTurnTimeLeft(MAX_TURN_TIME)
+    else
+      SkipTurn()
+    end
+  elseif GetHogTeamName(CurrentHedgehog) ~= nativesTeamName then
     SetTurnTimeLeft(20000)
   else
     TurnsLeft = TurnsLeft - 1
@@ -1212,3 +1222,10 @@
   end
 end
 
+function onGameResult(winner)
+  if winner == GetTeamClan(nativesTeamName) then
+    SendStat(siGameResult, loc("Mission succeeded!"))
+  else
+    SendStat(siGameResult, loc("Mission failed!"))
+  end
+end
--- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/queen.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/queen.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -90,7 +90,7 @@
 nativeHats = {"Rambo", "RobinHood", "pirate_jack", "zoo_Bunny", "IndianChief",
               "tiara", "AkuAku", "rasta", "hair_yellow"}
 
-nativePos = {{1474, 1188}, {923, 986}, {564, 1120}, {128, 1315}}
+nativePos = {{1474, 1209}, {923, 990}, {564, 1120}, {128, 1315}}
 nativesNum = 4
 nativesLeft = 4
 
@@ -102,8 +102,8 @@
 cyborgHidePos = {1665, 1800}
 cyborgsTeamNum = {4, 3}
 cyborgsNum = 7
-cyborgsPos = {{2893, 1717}, {2958, 1701}, {3027, 1696}, {3096, 1698},
-              {2584, 655},  {2047, 1534}, {115, 179}, {2162, 1916}}
+cyborgsPos = {{2893, 1723}, {2958, 1717}, {3027, 1710}, {3096, 1704},
+              {2584, 665},  {2047, 1562}, {115, 179}, {2162, 1916}}
 cyborgsDir = {"Left", "Left", "Left", "Left", "Left", "Left", "Right", "Left"}
 
 crateConsts = {}
@@ -498,8 +498,9 @@
 function SkipAnim(anim)
   if anim == startAnim then
     SetGearPosition(enemy, unpack(enemyPos))
+    HogTurnLeft(enemy, true)
   end
-  if GetHogTeamName(CurrentHedgehog) ~= loc("Natives") then
+  if GetHogTeamName(CurrentHedgehog) ~= nativesTeamName then
     EndTurn(true)
   end
   AnimWait(enemy, 1)
@@ -555,9 +556,9 @@
 
 function KillEnemy()
   if enemyFled == "1" then
-    DismissTeam(loc("Leaderbot"))
+    DismissTeam(leaderbotTeamName)
   end
-  DismissTeam(loc("011101001"))
+  DismissTeam(cyborgTeamName)
   EndTurn(true)
 end
 
@@ -615,30 +616,11 @@
   m5DeployedNum = tonumber(GetCampaignVar("M5DeployedNum")) or leaksNum
   m2Choice = tonumber(GetCampaignVar("M2Choice")) or choiceRefused
   m5Choice = tonumber(GetCampaignVar("M5Choice")) or choiceEliminate
-  m2DenseDead = tonumber(GetCampaignVar("M2DenseDead"))
-  m4DenseDead = tonumber(GetCampaignVar("M4DenseDead"))
-  m5DenseDead = tonumber(GetCampaignVar("M5DenseDead"))
-  m4LeaksDead = tonumber(GetCampaignVar("M4LeaksDead"))
-  m5LeaksDead = tonumber(GetCampaignVar("M5LeaksDead"))
-  m4ChiefDead = tonumber(GetCampaignVar("M4ChiefDead"))
-  m5ChiefDead = tonumber(GetCampaignVar("M5ChiefDead"))
-  m4WaterDead = tonumber(GetCampaignVar("M4WaterDead"))
-  m5WaterDead = tonumber(GetCampaignVar("M5WaterDead"))
-  m4BuffaloDead = tonumber(GetCampaignVar("M4BuffaloDead"))
-  m5BuffaloDead = tonumber(GetCampaignVar("M5BuffaloDead"))
-  m5WiseDead = tonumber(GetCampaignVar("M5WiseDead"))
-  m5GirlDead = tonumber(GetCampaignVar("M5GirlDead"))
+  m5LeaksDead = tonumber(GetCampaignVar("M5LeaksDead")) or 0
+  m5ChiefDead = tonumber(GetCampaignVar("M5ChiefDead")) or 0
 end
 
 function SaveCampaignVariables()
-  for i = 1, 4 do
-    if gearDead[origNatives[i]] ~= true then
-      SaveCampaignVar(nativeSaveNames[i], "0")
-    else
-      SaveCampaignVar(nativeSaveNames[i], "1")
-    end
-  end
-
   SaveCampaignVar("M8DeployedLeader", deployedLeader)
   SaveCampaignVar("M8PrincessLeader", princessLeader)
   SaveCampaignVar("M8EnemyFled", enemyFled)
@@ -722,8 +704,14 @@
   AddAmmo(natives[1], amMolotov, 0)
 end
 
+nativesTeamName = nil
+beepTeamName = nil
+corpTeamName = nil
+leaderbotTeamName = nil
+cyborgTeamName = nil
+
 function AddHogs()
-	AddTeam(loc("Natives"), -2, "Bone", "Island", "HillBilly", "cm_birdy")
+  nativesTeamName = AddMissionTeam(-2)
   for i = 7, 9 do
     natives[i-6] = AddHog(nativeNames[i], 0, 100, nativeHats[i])
     origNatives[i-6] = natives[i-6]
@@ -732,21 +720,21 @@
   origNatives[4] = natives[4]
   nativesLeft = nativesNum
 
-  AddTeam(loc("Beep Loopers"), -1, "ring", "UFO", "Robot", "cm_cyborg")
+  beepTeamName = AddTeam(loc("Beep Loopers"), -1, "ring", "UFO", "Robot_qau", "cm_cyborg")
   for i = 1, cyborgsTeamNum[1] do
     cyborgs[i] = AddHog(cyborgNames[i], cyborgsDif[i], cyborgsHealth[i], "cyborg2")
   end
 
-  AddTeam(loc("Corporationals"), -1, "ring", "UFO", "Robot", "cm_cyborg")
+  corpTeamName = AddTeam(loc("Corporationals"), -1, "ring", "UFO", "Robot_qau", "cm_cyborg")
   for i = cyborgsTeamNum[1] + 1, cyborgsNum do
     cyborgs[i] = AddHog(cyborgNames[i], cyborgsDif[i], cyborgsHealth[i], "cyborg2")
   end
   cyborgsLeft = cyborgsTeamNum[1] + cyborgsTeamNum[2]
 
-  AddTeam(loc("Leaderbot"), -1, "ring", "UFO", "Robot", "cm_cyborg")
+  leaderbotTeamName = AddTeam(loc("Leaderbot"), -1, "ring", "UFO", "Robot_qau", "cm_cyborg")
   enemy = AddHog(loc("Name"), 2, 200, "cyborg1")
 
-  AddTeam(loc("011101001"), -1, "ring", "UFO", "Robot", "cm_binary")
+  cyborgTeamName = AddTeam(loc("011101001"), -1, "ring", "UFO", "Robot_qau", "cm_binary")
   cyborg = AddHog(loc("Unit 334a$7%;.*"), 0, 200, "cyborg1")
   SetGearPosition(cyborg, unpack(cyborgHidePos))
 
@@ -784,10 +772,10 @@
 	MinesNum = 0
 	MinesTime = 3000
 	Explosives = 0
-	Delay = 10 
   MapGen = mgDrawn
 	Theme = "Hell"
-  SuddenDeathTurns = 20
+  HealthDecrease = 0
+  WaterRise = 0
 
 	for i = 1, #map do
 		ParseCommand('draw ' .. map[i])
@@ -824,9 +812,9 @@
   local toRemove = nil
   gearDead[gear] = true
   if GetGearType(gear) == gtHedgehog then
-    if GetHogTeamName(gear) == loc("Beep Loopers") or GetHogTeamName(gear) == loc("Corporationals") then
+    if GetHogTeamName(gear) == beepTeamName or GetHogTeamName(gear) == corpTeamName then
       cyborgsLeft = cyborgsLeft - 1
-    elseif GetHogTeamName(gear) == loc("Natives") then
+    elseif GetHogTeamName(gear) == nativesTeamName then
       for i = 1, nativesLeft do
         if natives[i] == gear then
           toRemove = i
@@ -860,7 +848,7 @@
     SetTurnTimeLeft(MAX_TURN_TIME)
     return
   end
-  if GetHogTeamName(CurrentHedgehog) == loc("011101001") then
+  if GetHogTeamName(CurrentHedgehog) == cyborgTeamName then
     EndTurn(true)
   end
 end
@@ -870,3 +858,11 @@
     SetAnimSkip(true)
   end
 end
+
+function onGameResult(winner)
+  if winner == GetTeamClan(nativesTeamName) then
+    SendStat(siGameResult, loc("Mission succeeded!"))
+  else
+    SendStat(siGameResult, loc("Mission failed!"))
+  end
+end
--- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/shadow.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/shadow.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -23,20 +23,22 @@
 - The remaining Weaklings spawn
 - TBS
 - All Weaklings dead
-- Cut scene: stronglingsAnim: Stronglings spawn, hero walks to forest, meets cyborg, cyborg makes offer
+- Cut scene: stronglingsAnim: Stronglings spawn, Dense Cloud walks to forest, meets cyborg, cyborg makes offer
 - The cyborg offer is an IMPORTANT decision, it completely changes the next mission, and the rest of the story
 | Accept: Player walks to cyborg
     - Cut scene: acceptAnim
-    - Hero needs to walk all the way back (infinite turn time)
-    - Hero reached tree
-    - Turn time starts
-    - TBS
-    - Stronglings defeated
-    | Stronglings defeated with both hogs survived
-        - Cut scene: acceptedSurvivedFinalAnim
-    | Stronglings deafeated with Dense Cloud dead
-        - Cut scene: acceptedDiedFinalAnim
-    > Victory
+    - Dense Cloud needs to walk all the way back (infinite turn time)
+    | Dense Cloud reached tree
+        - Turn time starts
+        - TBS
+        - Stronglings defeated
+        | Stronglings defeated with both hogs survived
+            - Cut scene: acceptedSurvivedFinalAnim
+        | Stronglings defeated with Dense Cloud dead
+            - Cut scene: acceptedDiedFinalAnim
+        > Victory
+    | Dense Cloud dies before reaching the tree
+        > Game over
 | Reject: Player walks away
     - Cut scene: refusedAnim
     - Leaks a Lot teleports back to tree at the start (automatically)
@@ -48,7 +50,7 @@
     > Victory
 | Attack: Player attacks cyborg
     - Cut scene: attackAnim
-    - Cyborg kills hero
+    - Cyborg kills Dense Cloud
     - Other native's turn to defeat Stronglings
     - TBS
     - Stronglings defeated
@@ -80,6 +82,8 @@
 attackedReturnStage = 12
 loseStage = 13
 
+wave1EnemyTurn = false
+
 ourTeam = 0
 weakTeam = 1
 strongTeam = 2
@@ -94,6 +98,9 @@
 
 HogNames = {loc("Brainiac"), loc("Corpsemonger"), loc("Femur Lover"), loc("Glark"), loc("Bonely"), loc("Rot Molester"), loc("Bloodrocutor"), loc("Muscle Dissolver"), loc("Bloodsucker")}
 
+nativesTeamName = nil
+weaklingsTeamName = nil
+
 ---POSITIONS---
 
 cannibalPos = {{3108, 1127}, 
@@ -122,6 +129,7 @@
 lastEnemyHog = 0
 stage = 0
 choice = 0
+checkAcceptTimer = 0
 
 brainiacDead = false
 cyborgHidden = false
@@ -144,7 +152,6 @@
 cannibalDead = {}
 isHidden = {}
 
-
 --------------------------Anim skip functions--------------------------
 function AfterRefusedAnim()
   if stage == loseStage then
@@ -220,10 +227,9 @@
   SetHealth(SpawnHealthCrate(2757, 1030), 50)
   SetHealth(SpawnHealthCrate(2899, 1009), 50)
   stage = wave1Stage
-  SwitchHog(dense)
   SetGearMessage(dense, 0)
   SetGearMessage(leaks, 0)
-  SetTurnTimeLeft(TurnTime)
+  EndTurn(true)
   ShowMission(loc("The Shadow Falls"), loc("Why do you not like me?"), loc("Obliterate them!|Hint: You might want to take cover...").."|"..loc("Both your hedgehogs must survive."), 1, 6000)
 end
 
@@ -239,6 +245,7 @@
     AnimSetGearPosition(cannibals[i], unpack(cannibalPos[i]))
     SetState(cannibals[i], 0)
   end
+  AnimSwitchHog(cannibals[2])
 end
 
 function AfterStronglingsAnim()
@@ -246,7 +253,7 @@
     return
   end
   stage = cyborgStage
-  ShowMission(loc("The Shadow Falls"), loc("The Dilemma"), loc("Choose your side! If you want to join the strange man, walk up to him.|Otherwise, walk away from him. If you decide to att...nevermind..."), 1, 8000)
+  ShowMission(loc("The Shadow Falls"), loc("The Dilemma"), loc("Choose your side! If you want to join the strange man, walk up to him.|Otherwise, walk away from him. If you decide to att...nevermind..."), 3, 8000)
   AddEvent(CheckChoice, {}, DoChoice, {}, 0)
   AddEvent(CheckRefuse, {}, DoRefuse, {}, 0)
   AddEvent(CheckAccept, {}, DoAccept, {}, 0)
@@ -296,7 +303,6 @@
   AddEvent(CheckReadyForStronglings, {}, DoReadyForStronglings, {}, 0)
   AddEvent(CheckNeedGirder, {}, DoNeedGirder, {}, 0)
   AddEvent(CheckNeedWeapons, {}, DoNeedWeapons, {}, 0)
-  RemoveEventFunc(CheckDenseDead)
   SwitchHog(dense)
   AnimWait(dense, 1)
   AddFunction({func = HideHog, args = {cyborg}})
@@ -316,7 +322,7 @@
     return
   end
   stage = aloneStage
-  ShowMission(loc("The Shadow Falls"), loc("The Individualist"), loc("Defeat the cannibals!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"), 1, 8000)
+  ShowMission(loc("The Shadow Falls"), loc("The Individualist"), loc("Defeat the cannibals!"), 1, 12000)
   AddAmmo(cannibals[6], amGrenade, 1)
   AddAmmo(cannibals[6], amFirePunch, 0)
   AddAmmo(cannibals[6], amBaseballBat, 0)
@@ -350,7 +356,6 @@
   SpawnSupplyCrate(3192, 1101, amShotgun)
   AnimSetGearPosition(cyborg, unpack(cyborgPos))
   SetState(cyborg, gstInvisible)
-  AnimSwitchHog(leaks)
 end
 
   
@@ -466,7 +471,7 @@
   table.insert(weaklingsAnim, {func = AnimWait, args = {leaks, 400}})
   table.insert(weaklingsAnim, {func = AnimSay, args = {cannibals[3], loc("Are we there yet?"), SAY_SAY, 4000}}) 
   table.insert(weaklingsAnim, {func = AnimSay, args = {dense, loc("This must be some kind of sorcery!"), SAY_SHOUT, 3500}})
-  table.insert(weaklingsAnim, {func = AnimSwitchHog, args = {leaks}})
+  table.insert(weaklingsAnim, {func = AnimSwitchHog, args = {cannibals[2]}})
   AddSkipFunction(weaklingsAnim, SkipWeaklingsAnim, {})
 
   table.insert(stronglingsAnim, {func = AnimGearWait, args = {leaks, 1000}})
@@ -603,13 +608,13 @@
 end
 
 function AddHogs()
-	AddTeam(loc("Natives"), -2, "Bone", "Island", "HillBilly", "cm_birdy")
+  nativesTeamName = AddMissionTeam(-2)
   ramon = AddHog(loc("Ramon"), 0, 100, "rasta")
 	leaks = AddHog(loc("Leaks A Lot"), 0, 100, "Rambo")
   dense = AddHog(loc("Dense Cloud"), 0, 100, "RobinHood")
   spiky = AddHog(loc("Spiky Cheese"), 0, 100, "hair_yellow")
 
-  AddTeam(loc("Weaklings"), -1, "skull", "Island", "Pirate","cm_vampire")
+  weaklingsTeamName = AddTeam(loc("Weaklings"), -1, "skull", "Island", "Pirate_qau", "cm_vampire")
   cannibals = {}
   cannibals[1] = AddHog(loc("Brainiac"), 5, 20, "Zombi")
 
@@ -618,14 +623,14 @@
     hogNr[cannibals[i]] = i - 2
   end
 
-  AddTeam(loc("Stronglings"), -1, "skull", "Island", "Pirate","cm_vampire")
+  AddTeam(loc("Stronglings"), -1, "skull", "Island", "Pirate_qau", "cm_vampire")
 
   for i = 6, 9 do
     cannibals[i] = AddHog(HogNames[i], 4, 30, "vampirichog")
     hogNr[cannibals[i]] = i - 2
   end
 
-  AddTeam(loc("011101001"), -1, "ring", "UFO", "Robot", "cm_binary")
+  AddTeam(loc("011101001"), -1, "ring", "UFO", "Robot_qau", "cm_binary")
   cyborg = AddHog(loc("Y3K1337"), 0, 200, "cyborg1")
 end
 
@@ -756,6 +761,10 @@
   if stage == loseStage then
     return
   end
+  if (not IsHogAlive(dense)) or (not IsHogAlive(leaks)) then
+    return
+  end
+
   EndTurn(true)
   SetGearMessage(CurrentHedgehog, 0)
   AddAnim(weaklingsAnim)
@@ -776,18 +785,18 @@
   if stage == loseStage then
     return
   end
-  if denseDead or GetHealth(dense) == 0 or leaksDead or GetHealth(leaks) == 0 then
+  if (not IsHogAlive(dense)) or (not IsHogAlive(leaks)) then
     return
   end
   SetGearMessage(CurrentHedgehog, 0)
   AddAnim(stronglingsAnim)
   AddFunction({func = AfterStronglingsAnim, args = {}})
   stage = interWeakStage
-  DismissTeam(loc("Weaklings"))
+  DismissTeam(weaklingsTeamName)
 end
 
 function CheckRefuse()
-  return GetX(dense) > 1400 and StoppedGear(dense)
+  return IsHogAlive(dense) and GetX(dense) > 1400 and StoppedGear(dense)
 end
 
 function DoRefuse()
@@ -798,7 +807,20 @@
 end
 
 function CheckAccept()
-  return GetX(dense) < 1300 and StoppedGear(dense)
+  if not IsHogAlive(dense) then
+    return false
+  end
+  if GetX(dense) < 1300 then
+    -- When close to cyborg, wait for a short time before accepting,
+    -- to allow player to attack with melee weapons.
+    checkAcceptTimer = checkAcceptTimer + 1
+    if checkAcceptTimer > 2000 and denseDead == false and StoppedGear(dense) then
+      return true
+    end
+  else
+    checkAcceptTimer = 0
+  end
+  return false
 end
 
 function DoAccept()
@@ -809,7 +831,7 @@
 end
 
 function CheckConfront()
-  return cyborgAttacked and StoppedGear(dense)
+  return cyborgAttacked and IsHogAlive(dense) and StoppedGear(dense)
 end
 
 function DoConfront()
@@ -837,21 +859,27 @@
   if stage == loseStage then
     return false
   end
-  return GetX(dense) > 1640 and StoppedGear(dense)
+  return denseDead == false and GetX(dense) > 1640 and StoppedGear(dense)
 end
 
 function DoNeedGirder()
   if stage == loseStage then
     return
   end
-  ShowMission(loc("The Shadow Falls"), loc("Under Construction"), loc("Return to Leaks A Lot!") .. "|" .. loc("To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"), 1, 6000)
+  local ctrl = loc("Hint: To place a girder, select it,|then use [Left] and [Right] to select angle and length,|then choose a location for the girder.")
+  if INTERFACE == "touch" then
+    ctrl = ctrl .. "|" .. loc("Choose location: Tap the [Target] button, then tap on the spot you want to choose")
+  else
+    ctrl = ctrl .. "|" .. loc("Choose location: Left click")
+  end
+  ShowMission(loc("The Shadow Falls"), loc("Under Construction"), loc("Return to Leaks A Lot!") .. "|" .. ctrl, 1, 6000)
 end
 
 function CheckNeedWeapons()
   if stage == loseStage then
     return false
   end
-  return GetX(dense) > 2522 and StoppedGear(dense)
+  return denseDead == false and GetX(dense) > 2522 and StoppedGear(dense)
 end
 
 function DoNeedWeapons()
@@ -867,6 +895,9 @@
   if stage == loseStage then
     return false
   end
+  if not IsHogAlive(dense) then
+    return false
+  end
   return (shotgunTaken and grenadeTaken) or GetX(dense) > 2700
 end
 
@@ -874,7 +905,8 @@
   if stage == loseStage then
     return
   end
-  ShowMission(loc("The Shadow Falls"), loc("The guardian"), loc("Protect yourselves!|Grenade hint: Set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power").."|"..loc("Leaks A Lot must survive!"), 1, 8000)
+
+  ShowMission(loc("The Shadow Falls"), loc("The guardian"), loc("Defeat the cannibals!") .."|".. loc("Leaks A Lot must survive!"), 1, 12000)
   AddAmmo(dense, amSkip, 100)
   AddAmmo(dense, amSwitch, 100)
   AddAmmo(leaks, amSkip, 100)
@@ -882,6 +914,7 @@
   stage = duoStage
   RemoveEventFunc(CheckNeedGirder)
   RemoveEventFunc(CheckNeedWeapons)
+  RemoveEventFunc(CheckDenseDead)
   AddEvent(CheckStronglingsDead, {}, DoStronglingsDead, {}, 0)
   AddAmmo(cannibals[6], amGrenade, 2)
   AddAmmo(cannibals[6], amShotgun, 2)
@@ -900,7 +933,7 @@
   if stage == loseStage then
     return
   end
-  if leaksDead or GetHealth(leaks) == 0 then
+  if not IsHogAlive(leaks) then
     return
   end
   SetGearMessage(CurrentHedgehog, 0)
@@ -985,7 +1018,7 @@
   end
   AddCaption(loc("...and so the cyborgs took over the world..."))
   stage = loseStage
-  DismissTeam(loc("Natives"))
+  DismissTeam(nativesTeamName)
 end
 
 function CheckDenseDead()
@@ -1002,7 +1035,6 @@
 	MinesNum = 0
 	MinesTime = 3000
 	Explosives = 0
-	Delay = 10 
 	Map = "A_Classic_Fairytale_shadow"
 	Theme = "Nature"
 	-- Disable Sudden Death
@@ -1027,7 +1059,14 @@
   AddAnim(startDialogue)
   AddFunction({func = AfterStartDialogue, args = {}})
   AddEvent(CheckBrainiacDead, {}, DoBrainiacDead, {}, 0)
-  ShowMission(loc("The Shadow Falls"), loc("The First Encounter"), loc("Survive!|Hint: Cinematics can be skipped with the [Precise] key."), 1, 0)
+  local hint
+  if INTERFACE == "touch" then
+     -- FIXME: No precise key available in Touch yet.
+     hint = ""
+  else
+     hint = "|" .. loc("Hint: Cinematics can be skipped with the [Precise] key.")
+  end
+  ShowMission(loc("The Shadow Falls"), loc("The First Encounter"), loc("Survive!") .. hint, 10, 0)
 end
 
 function onGameTick()
@@ -1064,9 +1103,9 @@
 end
 
 function onGearAdd(gear)
-  if GetGearType(gear) == gtGrenade and GetHogTeamName(CurrentHedgehog) == loc("Natives") then
+  if GetGearType(gear) == gtGrenade and GetHogTeamName(CurrentHedgehog) == nativesTeamName then
     grenadeUsed = true
-  elseif GetGearType(gear) == gtShotgunShot and GetHogTeamName(CurrentHedgehog) == loc("Natives") then
+  elseif GetGearType(gear) == gtShotgunShot and GetHogTeamName(CurrentHedgehog) == nativesTeamName then
     shotgunUsed = true
   end
 end
@@ -1092,6 +1131,11 @@
 function onNewTurn()
   if AnimInProgress() then
     SetTurnTimeLeft(MAX_TURN_TIME)
+  elseif stage == wave1Stage then
+    if GetHogClan(CurrentHedgehog) == GetTeamClan(weaklingsTeamName) and (not wave1EnemyTurn) then
+      EndTurn(true)
+      wave1EnemyTurn = true
+    end
   elseif stage == cyborgStage then
     if CurrentHedgehog ~= dense then
       EndTurn(true)
@@ -1118,3 +1162,10 @@
   end
 end
 
+function onGameResult(winner)
+  if winner == GetTeamClan(nativesTeamName) then
+    SendStat(siGameResult, loc("Mission succeeded!"))
+  else
+    SendStat(siGameResult, loc("Mission failed!"))
+  end
+end
--- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/united.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/united.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -63,6 +63,10 @@
 startAnim = {}
 wave2Anim = {}
 finalAnim = {}
+
+nativesTeamName = nil
+cyborgTeamName = nil
+
 --------------------------Anim skip functions--------------------------
 function AfterHogDeadAnim()
   freshDead = nil
@@ -70,10 +74,10 @@
 end
 
 function AfterStartAnim()
-  local goal = loc("Defeat the cannibals!|")
+  local goal = loc("Defeat the cannibals!")
   local chiefgoal = loc("Try to protect the chief! You won't lose if he dies, but it is advised that he survives.")
   SetTurnTimeLeft(TurnTime)
-  ShowMission(loc("United We Stand"), loc("Invasion"), goal .. chiefgoal, 1, 6000)
+  ShowMission(loc("United We Stand"), loc("Invasion"), goal .. "|" .. chiefgoal, 1, 6000)
 end
 
 function SkipStartAnim()
@@ -136,7 +140,7 @@
   if progress and progress<4 then
     SaveCampaignVar("Progress", "4")
   end
-  DismissTeam(loc("011101001"))
+  DismissTeam(cyborgTeamName)
   EndTurn(true)
 end
 -----------------------------Animations--------------------------------
@@ -285,7 +289,7 @@
 end
 
 function GetVariables()
-  m2DenseDead = tonumber(GetCampaignVar("M2DenseDead"))
+  m2DenseDead = tonumber(GetCampaignVar("M2DenseDead")) or 0
   if m2DenseDead == 1 then
     denseDead = true
   end
@@ -323,8 +327,8 @@
 end
 
 function AddHogs()
-	AddTeam(loc("Natives"), -2, "Bone", "Island", "HillBilly", "cm_birdy")
-	leaks = AddHog(loc("Leaks A Lot"), 0, 100, "Rambo")
+  nativesTeamName = AddMissionTeam(-2)
+  leaks = AddHog(loc("Leaks A Lot"), 0, 100, "Rambo")
   dense = AddHog(loc("Dense Cloud"), 0, 100, "RobinHood")
   water = AddHog(loc("Fiery Water"), 0, 100, "pirate_jack")
   buffalo = AddHog(loc("Raging Buffalo"), 0, 100, "zoo_Bunny")
@@ -332,17 +336,17 @@
   natives = {leaks, dense, water, buffalo, chief}
   nativesNum = 5
 
-  AddTeam(loc("Light Cannfantry"), -1, "skull", "Island", "Pirate", "cm_vampire")
+  AddTeam(loc("Light Cannfantry"), -1, "skull", "Island", "Pirate_qau", "cm_vampire")
   for i = 1, 4 do
     cannibals[i] = AddHog(HogNames[i], 2, 40, "Zombi")
   end
 
-  AddTeam(loc("Heavy Cannfantry"), -1, "skull", "Island", "Pirate", "cm_vampire")
+  AddTeam(loc("Heavy Cannfantry"), -1, "skull", "Island", "Pirate_qau", "cm_vampire")
   for i = 5, 8 do
     cannibals[i] = AddHog(HogNames[i], 2, 55, "vampirichog")
   end
 
-  AddTeam(loc("011101001"), -1, "ring", "UFO", "Robot", "cm_binary")
+  cyborgTeamName = AddTeam(loc("011101001"), -1, "ring", "UFO", "Robot_qau", "cm_binary")
   cyborg = AddHog(loc("Unit 334a$7%;.*"), 0, 200, "cyborg1")
 
   AnimSetGearPosition(leaks,   unpack(leaksPos))
@@ -432,7 +436,6 @@
 	MinesNum = 0
 	MinesTime = 3000
 	Explosives = 2
-	Delay = 10 
   Map = "Hogville"
 	Theme = "Nature"
 	-- Disable Sudden Death
@@ -535,7 +538,7 @@
     SetTurnTimeLeft(MAX_TURN_TIME)
     return
   end
-  if freshDead ~= nil and GetHogTeamName(CurrentHedgehog) == loc("Natives") then
+  if freshDead ~= nil and GetHogTeamName(CurrentHedgehog) == nativesTeamName then
     SetupHogDeadAnim(freshDead)
     AddAnim(hogDeadAnim)
     AddFunction({func = AfterHogDeadAnim, args = {}})
@@ -548,3 +551,10 @@
   end
 end
 
+function onGameResult(winner)
+  if winner == GetTeamClan(nativesTeamName) then
+    SendStat(siGameResult, loc("Mission succeeded!"))
+  else
+    SendStat(siGameResult, loc("Mission failed!"))
+  end
+end
--- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/cosmos.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/cosmos.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -32,7 +32,7 @@
 local dialog09 = {}
 -- mission objectives
 local goals = {
-	["init"] = {missionName, loc("Getting ready"), loc("Help Hog Solo to find all the parts of the anti-gravity device.")..
+	["init"] = {missionName, loc("Getting ready"), loc("Find all the parts of the anti-gravity device.")..
 	"|"..loc("Travel to all the neighbor planets and collect all the pieces"), 1, 0},
 	[dialog01] = {missionName, loc("Getting ready"), loc("Go and collect the crate").."|"..loc("Try not to get spotted by the guards!"), 1, 4500},
 	[dialog02] = {missionName, loc("The adventure begins!"), loc("Use the saucer and fly to the moon").."|"..loc("Travel carefully as your fuel is limited"), 1, 4500},
@@ -44,7 +44,7 @@
 		loc("Complete the remaining side missions to complete this mission.").."|"..
 		loc("One flower: Incomplete side missions").."|"..
 		loc("Two flowers: All missions complete"), 1, 8000},
-	["free"] = {missionName, loc("Spacetrip"), loc("Use the flying saucer to fly to the other planets."), 1, 5000}
+	["free"] = {missionName, loc("Spacetrip"), loc("Use the flying saucer to fly to the other planets."), -amJetpack, 5000}
 }
 -- crates
 local saucerX = 3270
@@ -98,16 +98,20 @@
 
 	Seed = 35
 	ClearGameFlags()
-	EnableGameFlags(gfSolidLand, gfDisableWind, gfTagTeam)
+	EnableGameFlags(gfSolidLand, gfDisableWind)
 	if checkPointReached == 4 then
 		-- Disable walking as long we're stuck on the moon
 		EnableGameFlags(gfArtillery)
 	end
+	if checkPointReached <= 4 and INTERFACE ~= "touch" then
+		-- FIXME: Precise key is not available in Touch
+		goals["init"][3] = goals["init"][3] .. "|" .. loc("Hint: Cinematics can be skipped with the [Precise] key.")
+	end
+
 	TurnTime = 20000
 	CaseFreq = 0
 	MinesNum = 0
 	Explosives = 0
-	Delay = 5
 	-- Disable Sudden Death
 	WaterRise = 0
 	HealthDecrease = 0
@@ -119,19 +123,21 @@
 		Map = "cosmos_map" -- custom map included in file
 	end
 	Theme = "Nature"
-	-- I had originally hero in PAotH team and changed it, may reconsider though
-	-- PAotH
-	AddTeam(teamC.name, teamC.color, "Simple", "Island", "Default", "hedgewars")
-	hero.gear = AddHog(hero.name, 0, 100, "war_desertgrenadier1")
+	-- Hero
+	teamC.name = AddMissionTeam(teamC.color)
+	hero.gear = AddMissionHog(100)
+	hero.name = GetHogName(hero.gear)
 	AnimSetGearPosition(hero.gear, hero.x, hero.y)
 	HogTurnLeft(hero.gear, true)
-	AddTeam(teamA.name, teamA.color, "Earth", "Island", "Default", "cm_galaxy")
+	-- PAotH
+	teamA.name = AddTeam(teamA.name, teamA.color, "Earth", "Island", "Default_qau", "cm_galaxy")
+	SetTeamPassive(teamA.name, true)
 	director.gear = AddHog(director.name, 0, 100, "hair_yellow")
 	AnimSetGearPosition(director.gear, director.x, director.y)
 	doctor.gear = AddHog(doctor.name, 0, 100, "Glasses")
 	AnimSetGearPosition(doctor.gear, doctor.x, doctor.y)
 	-- Guards
-	AddTeam(teamB.name, teamB.color, "Statue", "Island", "Default", "cm_swordshield2")
+	teamB.name = AddTeam(teamB.name, teamB.color, "Statue", "Island", "Default_qau", "cm_swordshield2")
 	guard1.gear = AddHog(guard1.name, 1, 100, "policecap")
 	AnimSetGearPosition(guard1.gear, guard1.x, guard1.y)
 	guard2.gear = AddHog(guard2.name, 1, 100, "policecap")
@@ -154,7 +160,7 @@
 		startSequence = true
 		AnimSetGearPosition(hero.gear, 1110, 850)
 	elseif checkPointReached == 5 then
-		startSequence = false
+		startSequence = status.death01 and not status.final
 		-- Hero has visited a planet, he has plenty of fuels and can change planet
 		if GetCampaignVar("Planet") == "moon" then
 			AnimSetGearPosition(hero.gear, 1110, 850)
@@ -191,6 +197,8 @@
 		else
 			ShowMission(unpack(goals["open_side_missions"]))
 		end
+	elseif status.death01 and not status.final then
+		HideMission()
 	else
 		ShowMission(unpack(goals["init"]))
 	end
@@ -475,7 +483,7 @@
 		SaveCampaignVar("Mission1", "2")
 		SaveCampaignVar("Mission2", "13")
 		SaveCampaignVar("Mission3", "1")
-		sendStats(loc("Hog Solo arrived at the moon!"))
+		sendStats(string.format(loc("%s arrived at the moon!"), hero.name))
 	end
 end
 
@@ -508,7 +516,7 @@
 			SaveCampaignVar("Mission2", "10")
 			SaveCampaignVar("Mission3", "1")
 		end
-		sendStats(loc("Hog Solo arrived at the Fruit Planet!"))
+		sendStats(string.format(loc("%s arrived at the Fruit Planet!"), hero.name))
 	end
 end
 
@@ -523,7 +531,7 @@
 		SaveCampaignVar("Mission2", "7")
 		SaveCampaignVar("Mission3", "12")
 		SaveCampaignVar("Mission4", "1")
-		sendStats(loc("Hog Solo arrived at the Desert Planet!"))
+		sendStats(string.format(loc("%s arrived at the Desert Planet!"), hero.name))
 	end
 end
 
@@ -537,7 +545,7 @@
 		SaveCampaignVar("Mission1", "5")
 		SaveCampaignVar("Mission2", "6")
 		SaveCampaignVar("Mission3", "1")
-		sendStats(loc("Hog Solo arrived at the Ice Planet!"))
+		sendStats(string.format(loc("%s arrived at the Ice Planet!"), hero.name))
 	end
 end
 
@@ -553,7 +561,7 @@
 		SaveCampaignVar("Mission1", "9")
 		SaveCampaignVar("Mission2", "11")
 		SaveCampaignVar("Mission3", "1")
-		sendStats(loc("Hog Solo arrived at the Planet of Death!"))
+		sendStats(string.format(loc("%s arrived at the Planet of Death!"), hero.name))
 	end
 end
 
@@ -569,7 +577,7 @@
 		SaveCampaignVar("UnlockedMissions", "2")
 		SaveCampaignVar("Mission1", "14")
 		SaveCampaignVar("Mission2", "1")
-		sendStats(loc("Hog Solo arrived at the meteorite!"))
+		sendStats(string.format(loc("%s arrived at the meteorite!"), hero.name))
 	end
 end
 
@@ -600,9 +608,9 @@
 		end
 	end
 	if status.desert01 then
-		vgear = AddVisualGear(4015, 316, vgtBeeTrace, 0, false)
+		vgear = AddVisualGear(3759, 28, vgtBeeTrace, 0, false)
 		if status.desert02 and status.desert03 then
-			vgear = AddVisualGear(4015, 296, vgtBeeTrace, 0, false)
+			vgear = AddVisualGear(3759, 8, vgtBeeTrace, 0, false)
 		end
 	end
 	if status.fruit01 and status.fruit02 then
@@ -650,7 +658,7 @@
 	AddSkipFunction(dialog01, Skipanim, {dialog01})
 	table.insert(dialog01, {func = AnimWait, args = {doctor.gear, 3000}})
 	table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("Near Secret Base 17 of PAotH in the rural Hogland ..."),  4000}})
-	table.insert(dialog01, {func = AnimSay, args = {director.gear, loc("So Hog Solo, here we are ..."), SAY_SAY, 2000}})
+	table.insert(dialog01, {func = AnimSay, args = {director.gear, string.format(loc("So, %s, here we are ..."), hero.name), SAY_SAY, 2000}})
 	table.insert(dialog01, {func = AnimSay, args = {director.gear, loc("Behind these trees on the east side there is Secret Base 17."), SAY_SAY, 4000}})
 	table.insert(dialog01, {func = AnimSay, args = {director.gear, loc("You have to continue alone from now on."), SAY_SAY, 3000}})
 	table.insert(dialog01, {func = AnimSay, args = {director.gear, loc("Be careful, the future of Hogera is in your hands!"), SAY_SAY, 7200}})
@@ -706,7 +714,7 @@
 	-- DIALOG 08 - Hero wins death01
 	AddSkipFunction(dialog08, Skipanim, {dialog08})
 	table.insert(dialog08, {func = AnimCaption, args = {hero.gear, loc("Under the meteorite’s shadow ..."),  4000}})
-	table.insert(dialog08, {func = AnimSay, args = {doctor.gear, loc("You did great, Hog Solo! However, we aren't out of danger yet!"), SAY_SHOUT, 4500}})
+	table.insert(dialog08, {func = AnimSay, args = {doctor.gear, string.format(loc("You did great, %s! However, we aren't out of danger yet!"), hero.name), SAY_SHOUT, 4500}})
 	table.insert(dialog08, {func = AnimSay, args = {doctor.gear, loc("The meteorite has come too close and the anti-gravity device isn't powerful enough to stop it now."), SAY_SHOUT, 5000}})
 	table.insert(dialog08, {func = AnimSay, args = {doctor.gear, loc("We need it to get split into at least two parts."), SAY_SHOUT, 3000}})
 	table.insert(dialog08, {func = AnimSay, args = {doctor.gear, loc("PAotH has sent explosives but unfortunately the trigger mechanism seems to be faulty!"), SAY_SHOUT, 5000}})
@@ -739,22 +747,21 @@
 	if GetCampaignVar("Won") == "true" and GetCampaignVar("Mission1Won") ~= "true" then
 		SendStat(siCustomAchievement, loc("Complete all main and side missions to complete the spacetrip mission."))
 	end
-	sendSimpleTeamRankings({teamC.name})
 	EndGame()
 end
 
 function sendStatsOnRetry()
 	SendStat(siGameResult, loc("You have to travel again"))
-	SendStat(siCustomAchievement, loc("Your first destination is the moon in order to get more fuel."))
+	if checkPointReached < 4 then
+		SendStat(siCustomAchievement, loc("Your first destination is the moon in order to get more fuel."))
+	end
 	SendStat(siCustomAchievement, loc("You have to be careful and must not die!"))
-	sendSimpleTeamRankings({teamC.name})
 	EndGame()
 end
 
 function sendStatsOnStuckOnMoon()
 	SendStat(siGameResult, loc("You have to go back to the moon!"))
 	SendStat(siCustomAchievement, loc("You have to complete the main mission on moon in order to travel to other planets."))
-	sendSimpleTeamRankings({teamC.name})
 	EndGame()
 end
 
@@ -764,7 +771,6 @@
 		SendStat(siGameResult, loc("You have violated PAotH regulations!"))
 		SendStat(siCustomAchievement, loc("You have triggered the secret Do-Not-Rope-to-the-Moon Defense System."))
 		SendStat(siCustomAchievement, loc("Use the flying saucer from the crate to fly to the moon."))
-		sendSimpleTeamRankings({teamC.name})
 		EndGame()
 	end
 end
--- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/death01.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/death01.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -3,7 +3,7 @@
 -- This is the mission to acquire the last part.
 -- This mission is the cameo of Professor Hogevil
 -- who has took hostages H and Dr. Cornelius.
--- Hog Solo has to defeat him and his thugs.
+-- The hero has to defeat him and his thugs.
 
 HedgewarsScriptLoad("/Scripts/Locale.lua")
 HedgewarsScriptLoad("/Scripts/Animate.lua")
@@ -43,47 +43,50 @@
 local teamA = {}
 local teamB = {}
 local teamC = {}
+local teamD = {}
 -- hedgehogs values
 hero.name = loc("Hog Solo")
 hero.x = 520
-hero.y = 845
+hero.y = 871
 hero.dead = false
 paoth1.name = loc("H")
 paoth1.x = 3730
-paoth1.y = 1480
+paoth1.y = 1538
 paoth2.name = loc("Dr. Cornelius")
 paoth2.x = 3800
-paoth2.y = 1480
+paoth2.y = 1538
 professor.name = loc("Prof. Hogevil")
 professor.dead = false
 thug1.x = 1265
-thug1.y = 1400
+thug1.y = 1465
 thug1.health = 70
 thug2.x = 2035
-thug2.y = 1320
+thug2.y = 1380
 thug2.health = 95
 thug3.x = 1980
-thug3.y = 815
+thug3.y = 863
 thug3.health = 35
 thug3.turnLeft = true
 thug4.x = 2830
-thug4.y = 1960
+thug4.y = 2007
 thug4.health = 80
 thug5.x = 2890
-thug5.y = 1960
+thug5.y = 2007
 thug5.health = 80
 thug6.x = 2940
-thug6.y = 1960
+thug6.y = 2007
 thug6.health = 80
 thug7.x = 2990
-thug7.y = 1960
+thug7.y = 2007
 thug7.health = 80
 teamA.name = loc("Hog Solo")
 teamA.color = -6
 teamB.name = loc("PAotH")
 teamB.color = teamA.color
-teamC.name = loc("Professor")
+teamC.name = loc("Professor's Team")
 teamC.color = -2
+teamD.name = loc("Professor")
+teamD.color = -2
 
 -------------- LuaAPI EVENT HANDLERS ------------------
 
@@ -91,10 +94,9 @@
 	Seed = 1
 	TurnTime = 25000
 	CaseFreq = 0
-	MinesNum = 3
+	MinesNum = 0
 	MinesTime = 1500
-	Explosives = 2
-	Delay = 3
+	Explosives = 0
 	HealthCaseAmount = 50
 	-- gfTagTeam makes it easier to skip the PAotH team
 	GameFlags = gfTagTeam
@@ -104,13 +106,15 @@
 	Map = "death01_map"
 	Theme = "Hell"
 
-	-- Hog Solo
-	AddTeam(teamA.name, teamA.color, "Simple", "Island", "Default", "hedgewars")
-	hero.gear = AddHog(hero.name, 0, 100, "war_desertgrenadier1")
+	-- Hero
+	teamA.name = AddMissionTeam(teamA.color)
+	hero.gear = AddMissionHog(100)
+	hero.name = GetHogName(hero.gear)
 	AnimSetGearPosition(hero.gear, hero.x, hero.y)
 
-	-- PAotH
-	AddTeam(teamB.name, teamB.color, "Earth", "Island", "Default", "cm_galaxy")
+	-- PAotH (passive team)
+	teamB.name = AddTeam(teamB.name, teamB.color, "Earth", "Island", "Default_qau", "cm_galaxy")
+	SetTeamPassive(teamB.name, true)
 	paoth1.gear = AddHog(paoth1.name, 0, 100, "hair_yellow")
 	AnimSetGearPosition(paoth1.gear, paoth1.x, paoth1.y)
 	HogTurnLeft(paoth1.gear, true)
@@ -120,8 +124,8 @@
 	HogTurnLeft(paoth2.gear, true)
 	SetGearAIHints(paoth2.gear, aihDoesntMatter)
 
-	-- Professor and Thugs
-	AddTeam(teamC.name, teamC.color, "eyecross", "Island", "Default", "cm_sine")
+	-- Professor's Team (computer enemy)
+	teamC.name = AddTeam(teamC.name, teamC.color, "eyecross", "Island", "Default_qau", "cm_sine")
 	professor.bot = AddHog(professor.name, 1, 300, "tophats")
 	AnimSetGearPosition(professor.bot, paoth1.x - 100, paoth1.y)
 	HogTurnLeft(professor.bot, true)
@@ -132,8 +136,10 @@
 		HogTurnLeft(thugs[i].gear, not thugs[i].turnLeft)
 	end
 
-	AddTeam(teamC.name, teamC.color, "star", "Island", "Default", "cm_sine")
+	-- Professor (special team for cut sequence only)
+	teamD.name = AddTeam(teamD.name, teamD.color, "star", "Island", "Default_qau", "cm_sine")
 	professor.human = AddHog(professor.name, 0, 300, "tophats")
+	-- hog will be removed and replaced by professor.bot after cut sequence
 	AnimSetGearPosition(professor.human, hero.x + 70, hero.y)
 	HogTurnLeft(professor.human, true)
 
@@ -144,6 +150,8 @@
 end
 
 function onGameStart()
+	ShowMission(unpack(goals[dialog01]))
+	HideMission()
 	AnimWait(hero.gear, 3000)
 	FollowGear(hero.gear)
 
@@ -166,6 +174,8 @@
 	AddGear(1900, 800, gtExplosives, 0, 0, 0, 0)
 	AddGear(1900, 750, gtExplosives, 0, 0, 0, 0)
 	AddGear(1900, 710, gtExplosives, 0, 0, 0, 0)
+
+	AddGear(698, 1544, gtExplosives, 0, 0, 0, 0)
 	-- add mines
 	AddGear(3520, 1650, gtMine, 0, 0, 0, 0)
 	AddGear(3480, 1680, gtMine, 0, 0, 0, 0)
@@ -174,6 +184,8 @@
 	AddGear(2100, 1730, gtMine, 0, 0, 0, 0)
 	AddGear(2150, 1730, gtMine, 0, 0, 0, 0)
 	AddGear(2200, 1750, gtMine, 0, 0, 0, 0)
+
+	AddGear(1891, 1468, gtMine, 0, 0, 0, 0)
 	-- add girders
 	PlaceGirder(3770, 1370, 4)
 	PlaceGirder(3700, 1460, 6)
@@ -206,13 +218,6 @@
 	SendHealthStatsOff()
 end
 
-function onNewTurn()
-	-- Team PAotH is passive and does not play
-	if CurrentHedgehog == paoth1.gear or CurrentHedgehog == paoth2.gear then
-		EndTurn(true)
-	end
-end
-
 function onGameTick()
 	AnimUnWait()
 	if ShowAnimation() == false then
@@ -256,6 +261,9 @@
 end
 
 function onEnemiesDeath(gear)
+	if (not IsHogAlive(gear)) or (not StoppedGear(gear)) then
+		return false
+	end
 	local allDead = true
 	if GetHealth(hero.gear) and professor.dead then
 		for i=1,table.getn(thugs) do
@@ -273,8 +281,8 @@
 -------------- ACTIONS ------------------
 
 function heroDeath(gear)
-	SendStat(siGameResult, loc("Hog Solo lost, try again!"))
-	SendStat(siCustomAchievement, loc("To win the game you have to eliminate all your enemies."))
+	SendStat(siGameResult, string.format(loc("%s lost, try again!"), hero.name))
+	SendStat(siCustomAchievement, loc("To win the game you have to eliminate Professor Hogevil."))
 	sendSimpleTeamRankings({teamC.name, teamA.name, teamB.name})
 	EndGame()
 end
@@ -302,7 +310,7 @@
 	AddSkipFunction(dialog01, Skipanim, {dialog01})
 	table.insert(dialog01, {func = AnimWait, args = {hero.gear, 3000}})
 	table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("Somewhere on the uninhabitable Death Planet ..."), 5000}})
-	table.insert(dialog01, {func = AnimSay, args = {professor.human, loc("Welcome Hog Solo, surprised to see me?"), SAY_SAY, 4000}})
+	table.insert(dialog01, {func = AnimSay, args = {professor.human, string.format(loc("Welcome, %s, surprised to see me?"), hero.name), SAY_SAY, 4000}})
 	if profDiedOnMoon then
 		table.insert(dialog01, {func = AnimSay, args = {professor.human, loc("After you left the moon, my other loyal minions came and resurrected me so I could complete my master plan."), SAY_SAY, 6000}})
 	else
@@ -326,8 +334,13 @@
 
 function startBattle()
 	ShowMission(unpack(goals[dialog01]))
-	DeleteGear(professor.human)
+	AddVisualGear(GetX(professor.human), GetY(professor.human), vgtExplosion, 0, false)
+	HideHog(professor.human)
 	RestoreHog(professor.bot)
+	AddVisualGear(GetX(professor.bot), GetY(professor.bot), vgtExplosion, 0, false)
+	PlaySound(sndWarp)
+	SetGearMessage(hero.gear, 0)
 	AnimSwitchHog(professor.gear)
+	FollowGear(professor.gear)
 	EndTurn(true)
 end
--- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/death02.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/death02.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -26,7 +26,7 @@
 local hero = {
 	name = loc("Hog Solo"),
 	x = 850,
-	y = 460,
+	y = 469,
 	mortarAmmo = 2,
 	firepunchAmmo = 1,
 	deagleAmmo = 4,
@@ -35,11 +35,11 @@
 }
 local heroTurns = 0
 local enemies = {
-	{ name = GetAmmoName(amMortar), x = 1890, y = 520, weapon = amMortar, additionalWeapons = {}},
-	{ name = GetAmmoName(amDEagle), x = 1390, y = 790, weapon = amDEagle, additionalWeapons = {}},
-	{ name = GetAmmoName(amGrenade), x = 186, y = 48, weapon = amGrenade, additionalWeapons = {}},
-	{ name = GetAmmoName(amFirePunch), x = 330, y = 270, weapon = amFirePunch, additionalWeapons = {}},
-	{ name = GetAmmoName(amBazooka), x = 1950, y = 150, weapon = amBazooka, additionalWeapons = {}},
+	{ name = GetAmmoName(amMortar), x = 1890, y = 535, weapon = amMortar, additionalWeapons = {}},
+	{ name = GetAmmoName(amDEagle), x = 1390, y = 815, weapon = amDEagle, additionalWeapons = {}},
+	{ name = GetAmmoName(amGrenade), x = 186, y = 62, weapon = amGrenade, additionalWeapons = {}},
+	{ name = GetAmmoName(amFirePunch), x = 330, y = 285, weapon = amFirePunch, additionalWeapons = {}},
+	{ name = GetAmmoName(amBazooka), x = 1950, y = 152, weapon = amBazooka, additionalWeapons = {}},
 }
 -- teams
 local teamA = {
@@ -66,21 +66,24 @@
 	Explosives = 0
 	Map = "death02_map"
 	Theme = "Hell"
-	Delay = 600 -- this makes the messages between turns more readable
 	-- Disable Sudden Death
 	WaterRise = 0
 	HealthDecrease = 0
 
-	-- Hog Solo
-	AddTeam(teamA.name, teamA.color, "Simple", "Island", "Default", "hedgewars")
-	hero.gear = AddHog(hero.name, 0, 100, "war_desertgrenadier1")
-	AnimSetGearPosition(hero.gear, hero.x, hero.y)
+	-- Hero
+	teamA.name = AddMissionTeam(teamA.color)
+	hero.gear = AddMissionHog(100)
+	hero.name = GetHogName(hero.gear)
+	SetGearPosition(hero.gear, hero.x, hero.y)
 	-- enemies
 	shuffleHogs(enemies)
-	AddTeam(teamB.name, teamB.color, "skull", "Island", "Default", "cm_skull")
+	teamB.name = AddTeam(teamB.name, teamB.color, "skull", "Island", "Default_qau", "cm_skull")
 	for i=1,table.getn(enemies) do
 		enemies[i].gear = AddHog(enemies[i].name, 1, 100, "war_desertgrenadier1")
-		AnimSetGearPosition(enemies[i].gear, enemies[i].x, enemies[i].y)
+		SetGearPosition(enemies[i].gear, enemies[i].x, enemies[i].y)
+		if enemies[i].x > hero.x then
+			HogTurnLeft(enemies[i].gear, true)
+		end
 	end
 
 	initCheckpoint("death02")
@@ -196,6 +199,9 @@
 end
 
 function onHeroWin(gear)
+	if not IsHogAlive(gear) then
+		return false
+	end
 	local allDead = true
 	for i=1,table.getn(enemies) do
 		if GetHealth(enemies[i].gear) then
@@ -209,7 +215,7 @@
 -------------- ACTIONS ------------------
 
 function heroDeath(gear)
-	SendStat(siGameResult, loc("Hog Solo lost, try again!"))
+	SendStat(siGameResult, string.format(loc("%s lost, try again!"), hero.name))
 	SendStat(siCustomAchievement, loc("You have to eliminate all the enemies."))
 	SendStat(siCustomAchievement, loc("Read the challenge objectives from within the mission for more details."))
 	sendSimpleTeamRankings({teamB.name, teamA.name})
--- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/desert01.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/desert01.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -1,6 +1,6 @@
 ------------------- ABOUT ----------------------
 --
--- In the desert planet Hero will have to explore
+-- In the desert planet, the hero will have to explore
 -- the dunes below the surface and find the hidden
 -- crates. It is told that one crate contains the
 -- lost part.
@@ -91,28 +91,32 @@
 	MinesNum = 0
 	MinesTime = 1
 	Explosives = 0
-	Delay = 3
 	HealthCaseAmount = 30
 	-- Disable Sudden Death
 	HealthDecrease = 0
 	WaterRise = 0
 	Map = "desert01_map"
 	Theme = "Desert"
+	-- To prevent victory when smugglers have been defeated
+	GameFlags = gfOneClanMode
 
 	-- get hero health
 	local heroHealth = 100
 
-	-- Hog Solo
-	AddTeam(teamC.name, teamC.color, "Simple", "Island", "Default", "hedgewars")
-	hero.gear = AddHog(hero.name, 0, heroHealth, "war_desertgrenadier1")
+	-- Hero
+	teamC.name = AddMissionTeam(teamC.color)
+	hero.gear = AddMissionHog(heroHealth)
+	hero.name = GetHogName(hero.gear)
 	AnimSetGearPosition(hero.gear, hero.x, hero.y)
 	HogTurnLeft(hero.gear, true)
 	-- PAotH undercover scientist and chief Sandologist
-	AddTeam(teamA.name, teamA.color, "Earth", "Island", "Default", "cm_galaxy")
+	teamA.name = AddTeam(teamA.name, teamA.color, "Earth", "Island", "Default_qau", "cm_galaxy")
+	SetTeamPassive(teamA.name, true)
 	ally.gear = AddHog(ally.name, 0, 100, "Cowboy")
 	AnimSetGearPosition(ally.gear, ally.x, ally.y)
 	-- Smugglers
-	AddTeam(teamB.name, teamB.color, "chest", "Island", "Default", "cm_bloodyblade")
+	teamB.name = AddTeam(teamB.name, teamB.color, "chest", "Island", "Default_qau", "cm_bloodyblade")
+	SetTeamPassive(teamB.name, true)
 	smuggler1.gear = AddHog(smuggler1.name, 1, 100, "hair_orange")
 	AnimSetGearPosition(smuggler1.gear, smuggler1.x, smuggler1.y)
 	smuggler2.gear = AddHog(smuggler2.name, 1, 100, "lambda")
@@ -130,7 +134,7 @@
 
 	AddEvent(onHeroDeath, {hero.gear}, heroDeath, {hero.gear}, 0)
 	AddEvent(onHeroAtFirstBattle, {hero.gear}, heroAtFirstBattle, {hero.gear}, 1)
-	AddEvent(onHeroAtThirdBattle, {hero.gear}, heroAtThirdBattle, {hero.gear}, 0)
+	AddEvent(onHeroAtThirdBattle, {hero.gear}, heroAtThirdBattle, {hero.gear}, 1)
 	AddEvent(onCheckForWin1, {hero.gear}, checkForWin1, {hero.gear}, 0)
 	AddEvent(onCheckForWin2, {hero.gear}, checkForWin2, {hero.gear}, 0)
 	AddEvent(onCrateDestroyed, {hero.gear}, crateDestroyed, {hero.gear}, 0)
@@ -183,8 +187,8 @@
 	end
 
 	AddEvent(onHeroFleeFirstBattle, {hero.gear}, heroFleeFirstBattle, {hero.gear}, 1)
-	AddEvent(onHeroAtBattlePoint1, {hero.gear}, heroAtBattlePoint1, {hero.gear}, 0)
-	AddEvent(onHeroAtBattlePoint2, {hero.gear}, heroAtBattlePoint2, {hero.gear}, 0)
+	AddEvent(onHeroAtBattlePoint1, {hero.gear}, heroAtBattlePoint1, {hero.gear}, 1)
+	AddEvent(onHeroAtBattlePoint2, {hero.gear}, heroAtBattlePoint2, {hero.gear}, 1)
 	-- crates
 	SpawnSupplyCrate(btorch1X, btorch1Y, amBlowTorch)
 	SpawnHealthCrate(680, 460)
@@ -195,7 +199,6 @@
 	AddAmmo(hero.gear, amGrenade, 6)
 	AddAmmo(hero.gear, amDEagle, 4)
 	AddAmmo(hero.gear, amRCPlane, tonumber(getBonus(1)))
-	AddAmmo(hero.gear, amSkip, 0)
 
 	AddAnim(dialog01)
 
@@ -203,31 +206,14 @@
 end
 
 function onNewTurn()
-	local function getReady(hog)
-		-- This clears the "Get ready, Hog!" caption from the engine, because it will name the
-		-- false hog because we immediately switch the hog after the turn start.
-		-- TODO: Find a better method for this and show the real hog name (preferably using an engine string)
-		AddCaption("")
-	end
-
-	if CurrentHedgehog ~= hero.gear and not heroIsInBattle then
-		AnimSwitchHog(hero.gear)
-		getReady(hero.gear)
-		SetTurnTimeLeft(MAX_TURN_TIME)
-	elseif CurrentHedgehog == hero.gear and not heroIsInBattle then
+	if CurrentHedgehog == hero.gear and not heroIsInBattle then
 		SetTurnTimeLeft(MAX_TURN_TIME)
 	elseif (CurrentHedgehog == smuggler2.gear or CurrentHedgehog == smuggler3.gear) and ongoingBattle == 1 then
 		AnimSwitchHog(smuggler1.gear)
-		getReady(smuggler1.gear)
 	elseif (CurrentHedgehog == smuggler1.gear or CurrentHedgehog == smuggler3.gear) and ongoingBattle == 2 then
 		AnimSwitchHog(smuggler2.gear)
-		getReady(smuggler2.gear)
 	elseif (CurrentHedgehog == smuggler1.gear or CurrentHedgehog == smuggler2.gear) and ongoingBattle == 3 then
 		AnimSwitchHog(smuggler3.gear)
-		getReady(smuggler3.gear)
-	elseif CurrentHedgehog == ally.gear then
-		AnimSwitchHog(hero.gear)
-		getReady(hero.gear)
 	end
 end
 
@@ -245,6 +231,9 @@
 	SetAmmo(amRope, 0, 0, 0, 1)
 	SetAmmo(amPortalGun, 0, 0, 0, 1)
 	SetAmmo(amGirder, 0, 0, 0, 3)
+	-- Give skip to all.
+	-- Skip intentionally kept for player so they can wait for
+	-- better wind conditions.
 	SetAmmo(amSkip, 9, 0, 0, 1)
 end
 
@@ -287,10 +276,23 @@
 	end
 	if gear == hero.gear then
 		hero.dead = true
-	elseif (gear == smuggler1.gear or gear == smuggler2.gear or gear == smuggler3.gear) and heroIsInBattle then
-		heroIsInBattle = false
-		AddAmmo(hero.gear, amSkip, 0)
-		ongoingBattle = 0
+	elseif heroIsInBattle then
+		if ((ongoingBattle == 1 and gear == smuggler1.gear) or
+		(ongoingBattle == 2 and gear == smuggler2.gear) or
+		(ongoingBattle == 3 and gear == smuggler3.gear)) then
+			heroIsInBattle = false
+			SetTeamPassive(teamB.name, true)
+			ongoingBattle = 0
+			if gear == smuggler1.gear then
+				RemoveEventFunc(onHeroAtFirstBattle)
+				RemoveEventFunc(onHeroFleeFirstBattle)
+			elseif gear == smuggler2.gear then
+				RemoveEventFunc(onHeroAtBattlePoint1)
+				RemoveEventFunc(onHeroAtBattlePoint2)
+			elseif gear == smuggler3.gear then
+				RemoveEventFunc(onHeroAtThirdBattle)
+			end
+		end
 	end
 end
 
@@ -310,7 +312,7 @@
 end
 
 function onHeroAtFirstBattle(gear)
-	if not hero.dead and not heroIsInBattle and GetHealth(smuggler1.gear) and GetX(hero.gear) <= 1233 and GetX(hero.gear) > 80
+	if not hero.dead and (not (heroIsInBattle and ongoingBattle == 1)) and ((not heroIsInBattle) or (heroIsInBattle and ongoingBattle == 3)) and GetHealth(smuggler1.gear) and GetX(hero.gear) <= 1233 and GetX(hero.gear) > 80
 			and GetY(hero.gear) <= GetY(smuggler1.gear)+5 and GetY(hero.gear) >= GetY(smuggler1.gear)-40 and
 			-- If hero is standing or at a rope
 			(StoppedGear(hero.gear) or GetGearElasticity(hero.gear) ~= 0) then
@@ -320,7 +322,8 @@
 end
 
 function onHeroFleeFirstBattle(gear)
-	if GetHealth(hero.gear) and GetHealth(smuggler1.gear) and heroIsInBattle
+	if GetHealth(hero.gear) and GetHealth(smuggler1.gear)
+			and heroIsInBattle and ongoingBattle == 1
 			and not gearIsInCircle(smuggler1.gear, GetX(hero.gear), GetY(hero.gear), 1400, false)
 			and StoppedGear(hero.gear) then
 		return true
@@ -330,7 +333,8 @@
 
 -- saves the location of the hero and prompts him for the second battle
 function onHeroAtBattlePoint1(gear)
-	if not hero.dead and GetX(hero.gear) > 1000 and GetX(hero.gear) < 1100
+	if not hero.dead and (not (heroIsInBattle and ongoingBattle == 2))
+			and GetX(hero.gear) > 1000 and GetX(hero.gear) < 1100
 			and GetY(hero.gear) > 590 and GetY(hero.gear) < 700 and StoppedGear(hero.gear)
 			and (StoppedGear(hero.gear) or GetGearElasticity(hero.gear) ~= 0) then
 		return true
@@ -339,7 +343,8 @@
 end
 
 function onHeroAtBattlePoint2(gear)
-	if not hero.dead and GetX(hero.gear) > 1610 and GetX(hero.gear) < 1680
+	if not hero.dead and (not (heroIsInBattle and ongoingBattle == 2))
+			and GetX(hero.gear) > 1610 and GetX(hero.gear) < 1680
 			and GetY(hero.gear) > 850 and GetY(hero.gear) < 1000
 			and (StoppedGear(hero.gear) or GetGearElasticity(hero.gear) ~= 0) then
 		return true
@@ -348,7 +353,8 @@
 end
 
 function onHeroAtThirdBattle(gear)
-	if not hero.dead and GetX(hero.gear) > 2000 and GetX(hero.gear) < 2200
+	if not hero.dead and (not (heroIsInBattle and ongoingBattle == 3))
+			and GetX(hero.gear) > 2000 and GetX(hero.gear) < 2200
 			and GetY(hero.gear) > 1430 and GetY(hero.gear) < 1670 then
 		return true
 	end
@@ -384,29 +390,32 @@
 
 function heroAtFirstBattle(gear)
 	AnimCaption(hero.gear, loc("A smuggler! Prepare for battle"), 5000)
-	-- Remember velocity to restore it later
-	local dx, dy = GetGearVelocity(hero.gear)
-	-- Hog gets scared if on rope
-	if isOnRope() then
-		PlaySound(sndRopeRelease)
-		HogSay(hero.gear, loc("Gasp! A smuggler!"), SAY_SHOUT)
-		dx = div(dx, 3)
-		dy = div(dy, 3)
+	ongoingBattle = 1
+	if not heroIsInBattle then
+		-- Remember velocity to restore it later
+		local dx, dy = GetGearVelocity(hero.gear)
+		-- Hog gets scared if on rope
+		if isOnRope() then
+			PlaySound(sndRopeRelease)
+			HogSay(hero.gear, loc("Gasp! A smuggler!"), SAY_SHOUT)
+			dx = div(dx, 3)
+			dy = div(dy, 3)
+		end
+		SetGearMessage(hero.gear, 0)
+		SetTeamPassive(teamB.name, false)
+		heroIsInBattle = true
+		--EndTurn(true)
+		AnimSwitchHog(smuggler1.gear)
+		EndTurn(true)
+		SetGearVelocity(hero.gear, dx, dy)
 	end
-	EndTurn(true)
-	heroIsInBattle = true
-	AddAmmo(hero.gear, amSkip, 100)
-	ongoingBattle = 1
-	AnimSwitchHog(smuggler1.gear)
-	EndTurn(true)
-	SetGearVelocity(hero.gear, dx, dy)
 end
 
 function heroFleeFirstBattle(gear)
 	AnimSay(smuggler1.gear, loc("Run away, you coward!"), SAY_SHOUT, 4000)
-	EndTurn(true)
+	SetTeamPassive(teamB.name, true)
 	heroIsInBattle = false
-	AddAmmo(hero.gear, amSkip, 0)
+	EndTurn(true)
 	ongoingBattle = 0
 end
 
@@ -419,21 +428,26 @@
 end
 
 function heroAtThirdBattle(gear)
-	heroIsInBattle = true
-	AddAmmo(hero.gear, amSkip, 100)
+	-- third battle
 	ongoingBattle = 3
 	AnimSay(smuggler3.gear, loc("Who's there?! I'll get you!"), SAY_SHOUT, 5000)
-	local dx, dy = GetGearVelocity(hero.gear)
-	-- Hog gets scared and falls from rope
-	if isOnRope() then
-		PlaySound(sndRopeRelease)
-		HogSay(hero.gear, loc("Yikes!"), SAY_SHOUT)
-		dx = div(dx, 3)
-		dy = div(dy, 3)
+	if not heroIsInBattle then
+		heroIsInBattle = true
+		SetTeamPassive(teamB.name, false)
+		ongoingBattle = 3
+		local dx, dy = GetGearVelocity(hero.gear)
+		-- Hog gets scared and falls from rope
+		if isOnRope() then
+			PlaySound(sndRopeRelease)
+			HogSay(hero.gear, loc("Yikes!"), SAY_SHOUT)
+			dx = div(dx, 3)
+			dy = div(dy, 3)
+		end
+		SetGearMessage(hero.gear, 0)
+		AnimSwitchHog(smuggler3.gear)
+		EndTurn(true)
+		SetGearVelocity(hero.gear, dx, dy)
 	end
-	AnimSwitchHog(smuggler3.gear)
-	EndTurn(true)
-	SetGearVelocity(hero.gear, dx, dy)
 end
 
 function crateDestroyed(gear)
@@ -502,24 +516,34 @@
 end
 
 function secondBattle()
-	-- second battle
-	if heroIsInBattle and ongoingBattle == 1 then
-		AnimSay(smuggler1.gear, loc("Get him, Spike!"), SAY_SHOUT, 4000)
+	local smugglerMsg = function()
+		AnimSay(smuggler2.gear, loc("This seems like a wealthy hedgehog, nice ..."), SAY_THINK, 5000)
 	end
-	local dx, dy = GetGearVelocity(hero.gear)
-	-- Hog gets scared if on rope
-	if isOnRope() then
-		PlaySound(sndRopeRelease)
-		HogSay(hero.gear, loc("Gasp!"), SAY_SHOUT)
-		dx = div(dx, 3)
-		dy = div(dy, 3)
+	-- second battle
+	if heroIsInBattle then
+		if ongoingBattle == 1 then
+			AnimSay(smuggler1.gear, loc("Get him, Spike!"), SAY_SHOUT, 4000)
+		else
+			smugglerMsg()
+		end
+		ongoingBattle = 2
+	else
+		smugglerMsg()
+		local dx, dy = GetGearVelocity(hero.gear)
+		-- Hog gets scared if on rope
+		if isOnRope() then
+			PlaySound(sndRopeRelease)
+			HogSay(hero.gear, loc("Gasp!"), SAY_SHOUT)
+			dx = div(dx, 3)
+			dy = div(dy, 3)
+		end
+		SetGearMessage(hero.gear, 0)
+		heroIsInBattle = true
+		SetTeamPassive(teamB.name, false)
+		ongoingBattle = 2
+		AnimSwitchHog(smuggler2.gear)
+		EndTurn(true)
 	end
-	heroIsInBattle = true
-	AddAmmo(hero.gear, amSkip, 100)
-	ongoingBattle = 2
-	AnimSay(smuggler2.gear, loc("This seems like a wealthy hedgehog, nice ..."), SAY_THINK, 5000)
-	AnimSwitchHog(smuggler2.gear)
-	EndTurn(true)
 	SetGearVelocity(hero.gear, dx, dy)
 end
 
@@ -541,7 +565,7 @@
 end
 
 function lose()
-	SendStat(siGameResult, loc("Hog Solo lost, try again!"))
+	SendStat(siGameResult, string.format(loc("%s lost, try again!"), hero.name))
 	SendStat(siCustomAchievement, loc("To win the game you have to find the right crate."))
 	SendStat(siCustomAchievement, loc("You can avoid some battles."))
 	SendStat(siCustomAchievement, loc("Use your ammo wisely."))
--- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/desert02.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/desert02.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -22,6 +22,8 @@
 local cratesCollected = 0
 local totalCrates = 0
 local damageTaken = false
+local animStarted = false
+local record
 -- health crates
 healthX = 565
 health1Y = 1400
@@ -63,7 +65,6 @@
 	GameFlags = gfOneClanMode
 	Seed = 1
 	TurnTime = 8000
-	Delay = 2
 	CaseFreq = 0
 	HealthCaseAmount = 50
 	MinesNum = 500
@@ -76,12 +77,14 @@
 	Map = "desert02_map"
 	Theme = "Desert"
 
-	-- Hog Solo
-	AddTeam(teamA.name, teamA.color, "Simple", "Island", "Default", "hedgewars")
-	hero.gear = AddHog(hero.name, 0, 100, "war_desertgrenadier1")
+	-- Hero
+	teamA.name = AddMissionTeam(teamA.color)
+	hero.gear = AddMissionHog(100)
+	hero.name = GetHogName(hero.gear)
 	AnimSetGearPosition(hero.gear, hero.x, hero.y)
 	HogTurnLeft(hero.gear, true)
 
+ 	record = tonumber(GetCampaignVar("FastestMineEscape"))
 	initCheckpoint("desert02")
 
 	AnimInit(true)
@@ -97,6 +100,9 @@
 	AnimWait(hero.gear, 3000)
 	FollowGear(hero.gear)
 
+	if record ~= nil then
+		goals[dialog01][3] = goals[dialog01][3] .. "|" .. string.format(loc("Fastest escape: %d turns"), record)
+	end
 	ShowMission(unpack(goals[dialog01]))
 	HideMission()
 
@@ -107,11 +113,17 @@
 	SpawnHealthCrate(healthX, health2Y)
 
 	SendHealthStatsOff()
-	AddAnim(dialog01)
 end
 
 function onNewTurn()
+	if not animStarted then
+		AddAnim(dialog01)
+		animStarted = true
+	end
 	SetWeapon(amRope)
+	if TotalRounds >= 0 and record ~= nil then
+		SetTeamLabel(teamA.name, tostring(TotalRounds))
+	end
 end
 
 function onGameTick()
@@ -173,7 +185,7 @@
 -------------- ACTIONS ------------------
 
 function heroDeath(gear)
-	SendStat(siGameResult, loc("Hog Solo lost, try again!"))
+	SendStat(siGameResult, string.format(loc("%s lost, try again!"), hero.name))
 	SendStat(siCustomAchievement, loc("To win the game you have to go to the surface."))
 	SendStat(siCustomAchievement, loc("Most mines are not active."))
 	SendStat(siCustomAchievement, loc("From the second turn and beyond the water rises."))
@@ -185,7 +197,6 @@
 	SendStat(siGameResult, loc("Congratulations, you won!"))
 	SendStat(siCustomAchievement, loc("You have escaped successfully."))
 	SendStat(siCustomAchievement, string.format(loc("Your escape took you %d turns."), TotalRounds))
-	local record = tonumber(GetCampaignVar("FastestMineEscape"))
 	if record ~= nil and TotalRounds >= record then
 		SendStat(siCustomAchievement, string.format(loc("Your fastest escape so far: %d turns"), record))
 	end
@@ -231,4 +242,7 @@
 function challengeStart()
 	startChallenge = true
 	EndTurn(true)
+	if record ~= nil then
+		SetTeamLabel(teamA.name, "0")
+	end
 end
--- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/desert03.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/desert03.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -73,9 +73,10 @@
 	WaterRise = 0
 	HealthDecrease = 0
 
-	-- Hog Solo
-	AddTeam(teamA.name, teamA.color, "Simple", "Island", "Default", "hedgewars")
-	hero.gear = AddHog(hero.name, 0, 1, "war_desertgrenadier1")
+	-- Hero
+	teamA.name = AddMissionTeam(teamA.color)
+	hero.gear = AddMissionHog(1)
+	hero.name = GetHogName(hero.gear)
 	AnimSetGearPosition(hero.gear, hero.x, hero.y)
 
 	initCheckpoint("desert03")
@@ -235,7 +236,7 @@
 end
 
 function gameOver()
-	SendStat(siGameResult, loc("Hog Solo lost, try again!"))
+	SendStat(siGameResult, string.format(loc("%s lost, try again!"), hero.name))
 	SendStat(siCustomAchievement, loc("You have to destroy all the targets."))
 	SendStat(siCustomAchievement, loc("You will fail if you run out of ammo and there are still targets available."))
 	SendStat(siCustomAchievement, loc("Read the challenge objectives from within the mission for more details."))
--- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/final.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/final.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -50,9 +50,10 @@
 	WaterRise = 0
 	HealthDecrease = 0
 
-	-- Hog Solo
-	AddTeam(teamA.name, teamA.color, "Simple", "Island", "Default", "hedgewars")
-	hero.gear = AddHog(hero.name, 0, 1, "war_desertgrenadier1")
+	-- Hero
+	teamA.name = AddMissionTeam(teamA.color)
+	hero.gear = AddMissionHog(1)
+	hero.name = GetHogName(hero.gear)
 	AnimSetGearPosition(hero.gear, hero.x, hero.y)
 
 	initCheckpoint("final")
@@ -63,7 +64,7 @@
 function onGameStart()
 	AnimWait(hero.gear, 3000)
 	FollowGear(hero.gear)
-	ShowMission(missionName, loc("Challenge objectives"), challengeObjectives, -amSkip, 7500)
+	ShowMission(missionName, loc("Objectives"), challengeObjectives, 1, 7500)
 
 	-- explosives
 	x = 400
@@ -135,23 +136,24 @@
 end
 
 function onBoom(gear)
-	local win = true
+	if (not IsHogAlive(gear)) or (not StoppedGear(gear)) then
+		return false
+	end
 	for i=1,table.getn(explosives) do
 		if GetHealth(explosives[i]) then
-			win = false
-			break
+			return false
 		end
 	end
 	if currentHealth <= currentDamage then
-		win = false
+		return false
 	end
-	return win
+	return true
 end
 
 -------------- ACTIONS ------------------
 
 function heroDeath(gear)
-	SendStat(siGameResult, loc("Hog Solo lost, try again!"))
+	SendStat(siGameResult, string.format(loc("%s lost, try again!"), hero.name))
 	SendStat(siCustomAchievement, loc("You have to destroy all the explosives without dying!"))
 	SendStat(siCustomAchievement, loc("Areas surrounded by a security border are indestructible."))
 	SendStat(siCustomAchievement, loc("Areas surrounded by a green dashed outline are portal-proof and repel portals."))
--- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/fruit01.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/fruit01.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -38,11 +38,11 @@
 		loc("Captain Lime offered his help if you assist him in battle.").."|"..
 		loc("What do you want to do?").."| |"..
 		loc("Fight: Press [Attack]").."|"..
-		loc("Flee: Press [Jump]"), 1, 9999000, true},
-	[dialog02] = {missionName, loc("Battle Starts Now!"), loc("You have chosen to fight!").."|"..loc("Lead the Green Bananas to battle and eliminate all the enemies!"), 1, 5000},
+		loc("Flee: Press [Jump]"), 3, 9999000, true},
+	[dialog02] = {missionName, loc("Battle Starts Now!"), loc("You have chosen to fight!").."|"..loc("Lead your allies to battle and eliminate all the enemies!"), 1, 5000},
 	[dialog03] = {missionName, loc("Time to run!"), loc("You have chosen to flee.").."|"..loc("You have to reach the left-most place on the map."), 1, 5000},
-	["fight"] = {missionName, loc("Ready for Battle?"), loc("You have chosen to fight!"), 1, 2000},
-	["flee"] = {missionName, loc("Ready for Battle?"), loc("You have chosen to flee."), 1, 2000},
+	["fight"] = {missionName, loc("Ready for Battle?"), loc("You have chosen to fight!"), 2, 2000},
+	["flee"] = {missionName, loc("Coward"), loc("You have chosen to flee."), 2, 2000},
 	["flee_final"] = {missionName, loc("Time to run!"), loc("Knock off the enemies from the left-most place of the map!") .. "|" .. loc("Stay there to flee!"), 1, 6000},
 }
 -- crates
@@ -112,7 +112,6 @@
 	MinesNum = 0
 	MinesTime = 1
 	Explosives = 0
-	Delay = 3
 	-- Disable Sudden Death
 	HealthDecrease = 0
 	WaterRise = 0
@@ -120,17 +119,18 @@
 	Map = "fruit01_map"
 	Theme = "Fruit"
 
-	-- Hog Solo
-	AddTeam(teamA.name, teamA.color, "Simple", "Island", "Default", "hedgewars")
-	hero.gear = AddHog(hero.name, 0, 100, "war_desertgrenadier1")
+	-- Hero
+	teamA.name = AddMissionTeam(teamA.color)
+	hero.gear = AddMissionHog(100)
+	hero.name = GetHogName(hero.gear)
 	AnimSetGearPosition(hero.gear, hero.x, hero.y)
 	HogTurnLeft(hero.gear, true)
 	-- Captain Lime
-	AddTeam(teamD.name, teamD.color, "Cherry", "Island", "Default", "congo-brazzaville")
+	teamD.name = AddTeam(teamD.name, teamD.color, "Cherry", "Island", "Default_qau", "congo-brazzaville")
 	green1.gear = AddHog(green1.name, 0, 200, "war_desertofficer")
 	AnimSetGearPosition(green1.gear, green1.x, green1.y)
 	-- Green Bananas
-	AddTeam(teamB.name, teamB.color, "Cherry", "Island", "Default", "congo-brazzaville")
+	teamB.name = AddTeam(teamB.name, teamB.color, "Cherry", "Island", "Default_qau", "congo-brazzaville")
 	green2.gear = AddHog(green2.name, 0, 100, "war_britmedic")
 	AnimSetGearPosition(green2.gear, green2.x, green2.y)
 	HogTurnLeft(green2.gear, true)
@@ -144,7 +144,7 @@
 	AnimSetGearPosition(green5.gear, green5.x, green5.y)
 	HogTurnLeft(green5.gear, true)
 	-- Yellow Watermelons
-	AddTeam(teamC.name, teamC.color, "Flower", "Island", "Default", "cm_mog")
+	teamC.name = AddTeam(teamC.name, teamC.color, "Flower", "Island", "Default_qau", "cm_mog")
 	yellow1.gear = AddHog(yellow1.name, 1, 100, "war_desertgrenadier2")
 	AnimSetGearPosition(yellow1.gear, yellow1.x, yellow1.y)
 	-- the rest of the Yellow Watermelons
@@ -297,22 +297,39 @@
 end
 
 function onBattleWin(gear)
-	local win = true
 	for i=1,7 do
 		if i<3 then
 			if GetHealth(yellowArmy[i].gear) then
-				win = false
+				return false
 			end
 		else
 			if GetHealth(yellowArmy[i].gear) and not yellowArmy[i].hidden then
-				win = false
+				return false
 			end
 		end
 	end
 	if GetHealth(yellow1.gear) then
-		win = false
+		return false
+	end
+	if (not IsHogAlive(gear)) or (not StoppedGear(gear)) then
+		return false
 	end
-	return win
+	return true
+end
+
+function onEscapeWinByKill(gear)
+	for i=1,7 do
+		if GetHealth(yellowArmy[i].gear) or yellowArmy[i].hidden then
+			return false
+		end
+	end
+	if GetHealth(yellow1.gear) then
+		return false
+	end
+	if (not IsHogAlive(gear)) or (not StoppedGear(gear)) then
+		return false
+	end
+	return true
 end
 
 function isHeroOnLaunchPad()
@@ -361,7 +378,7 @@
 function battleWin(gear)
 	-- add stats
 	saveVariables()
-	SendStat(siGameResult, loc("Green Bananas won!"))
+	SendStat(siGameResult, string.format(loc("%s won!"), teamB.name))
 	SendStat(siCustomAchievement, loc("You have eliminated all visible enemy hedgehogs!"))
 	sendSimpleTeamRankings({teamA.name, teamD.name, teamB.name, teamC.name})
 	EndGame()
@@ -371,12 +388,21 @@
 	RemoveEventFunc(heroOnLaunchPadWithEnemies)
 	-- add stats
 	saveVariables()
-	SendStat(siGameResult, loc("Hog Solo escaped successfully!"))
+	SendStat(siGameResult, string.format(loc("%s escaped successfully!"), hero.name))
 	SendStat(siCustomAchievement, loc("You have reached the take-off area successfully!"))
 	sendSimpleTeamRankings({teamA.name, teamD.name, teamB.name, teamC.name})
 	EndGame()
 end
 
+function escapeWinByKill(gear)
+	RemoveEventFunc(heroOnLaunchPadWithEnemies)
+	-- add stats
+	saveVariables()
+	SendStat(siGameResult, string.format(loc("%s won!"), teamB.name))
+	sendSimpleTeamRankings({teamA.name, teamD.name, teamB.name, teamC.name})
+	EndGame()
+end
+
 function heroSelect()
 	awaitingInput = false
 	FollowGear(hero.gear)
@@ -391,6 +417,8 @@
 		AddAmmo(green1.gear, amSwitch, 100)
 		AddEvent(onHeroOnLaunchPadWithEnemies, {hero.gear}, heroOnLaunchPadWithEnemies, {hero.gear}, 0)
 		AddEvent(onEscapeWin, {hero.gear}, escapeWin, {hero.gear}, 0)
+		-- Alternative victory in the "flee" mission: ALL yellow hedgehogs killed
+		AddEvent(onEscapeWinByKill, {hero.gear}, escapeWinByKill, {hero.gear}, 0)
 		local greenTeam = { green2, green3, green4, green5 }
 		for i=1,4 do
 			SetHogLevel(greenTeam[i].gear, 1)
@@ -418,17 +446,17 @@
 end
 
 function AnimationSetup()
-	-- DIALOG 01 - Start, Captain Lime talks explains to Hog Solo
+	-- DIALOG 01 - Start, Captain Lime talks and explains stuff to hero
 	AddSkipFunction(dialog01, Skipanim, {dialog01})
 	table.insert(dialog01, {func = AnimWait, args = {hero.gear, 1000}})
 	table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("Somewhere on the Planet of Fruits a terrible war is about to begin ..."), 5000}})
 	table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("I was told that as the leader of the king's guard, no one knows this world better than you!"), SAY_SAY, 5000}})
 	table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("So, I kindly ask for your help."), SAY_SAY, 3000}})
 	table.insert(dialog01, {func = AnimWait, args = {green1.gear, 2000}})
-	table.insert(dialog01, {func = AnimSay, args = {green1.gear, loc("You couldn't have come to a worse time, Hog Solo!"), SAY_SAY, 3000}})
+	table.insert(dialog01, {func = AnimSay, args = {green1.gear, string.format(loc("You couldn't have come to a worse time, %s!"), hero.name), SAY_SAY, 3000}})
 	table.insert(dialog01, {func = AnimSay, args = {green1.gear, loc("The clan of the Red Strawberry wants to take over the dominion and overthrow King Pineapple."), SAY_SAY, 5000}})
 	table.insert(dialog01, {func = AnimSay, args = {green1.gear, loc("Under normal circumstances we could easily defeat them but we have kindly sent most of our men to the Kingdom of Sand to help with the annual dusting of the king's palace."), SAY_SAY, 8000}})
-	table.insert(dialog01, {func = AnimSay, args = {green1.gear, loc("However, the army of Yellow Watermelons is about to attack any moment now."), SAY_SAY, 4000}})
+	table.insert(dialog01, {func = AnimSay, args = {green1.gear, string.format(loc("However, the army of %s is about to attack any moment now."), teamC.name), SAY_SAY, 4000}})
 	table.insert(dialog01, {func = AnimSay, args = {green1.gear, loc("I would gladly help you if we won this battle but under these circumstances I'll only help you if you fight for our side."), SAY_SAY, 6000}})
 	table.insert(dialog01, {func = AnimSay, args = {green1.gear, loc("What do you say? Will you fight for us?"), SAY_SAY, 3000}})
 	table.insert(dialog01, {func = AnimWait, args = {hero.gear, 500}})
@@ -436,7 +464,7 @@
 	table.insert(dialog01, {func = AfterDialog01, args = {}})
 	-- DIALOG 02 - Hero selects to fight
 	AddSkipFunction(dialog02, Skipanim, {dialog02})
-	table.insert(dialog02, {func = AnimSay, args = {green1.gear, loc("You choose well, Hog Solo!"), SAY_SAY, 3000}})
+	table.insert(dialog02, {func = AnimSay, args = {green1.gear, string.format(loc("You choose well, %s!"), hero.name), SAY_SAY, 3000}})
 	table.insert(dialog02, {func = AnimSay, args = {green1.gear, loc("I have only 3 hogs available and they are all cadets."), SAY_SAY, 4000}})
 	table.insert(dialog02, {func = AnimSay, args = {green1.gear, loc("As you are more experienced, I want you to lead them to battle."), SAY_SAY, 4000}})
 	table.insert(dialog02, {func = AnimSay, args = {green1.gear, loc("Of course, I will observe the battle and intervene if necessary."), SAY_SAY, 5000}})
@@ -465,7 +493,7 @@
 
 function startBattle()
 	AnimSetInputMask(0xFFFFFFFF)
-	-- Hog Solo weapons
+	-- Hero weapons
 	AddAmmo(hero.gear, amRope, 2)
 	AddAmmo(hero.gear, amBazooka, 3)
 	AddAmmo(hero.gear, amParachute, 1)
@@ -479,14 +507,14 @@
 
 function gameLost()
 	if chooseToBattle then
-		SendStat(siGameResult, loc("The Green Bananas lost, try again!"))
+		SendStat(siGameResult, string.format(loc("%s lost, try again!"), teamB.name))
 		SendStat(siCustomAchievement, loc("You have to eliminate all the visible enemies."))
 		SendStat(siCustomAchievement, loc("5 additional enemies will be spawned during the game."))
 		SendStat(siCustomAchievement, loc("You are in control of all the active ally units."))
 		SendStat(siCustomAchievement, loc("The ally units share their ammo."))
 		SendStat(siCustomAchievement, loc("Try to keep as many allies alive as possible."))
 	else
-		SendStat(siGameResult, loc("Hog Solo couldn't escape, try again!"))
+		SendStat(siGameResult, string.format(loc("%s couldn't escape, try again!"), hero.name))
 		SendStat(siCustomAchievement, loc("You have to get to the left-most land and remove any enemy hog from there."))
 		SendStat(siCustomAchievement, loc("You will play every 3 turns."))
 	end
@@ -504,6 +532,7 @@
 		if not chooseToBattle and not GetHealth(yellow1.gear) then
 			SetGearPosition(yellowArmy[3].gear, yellow1.x, yellow1.y)
 		end
+		AnimOutOfNowhere(yellowArmy[3].gear)
 	elseif TotalRounds == 7 then
 		RestoreHog(yellowArmy[4].gear)
 		RestoreHog(yellowArmy[5].gear)
@@ -511,6 +540,8 @@
 		if not chooseToBattle and not GetHealth(yellow1.gear) and not GetHealth(yellowArmy[3].gear) then
 			SetGearPosition(yellowArmy[4].gear, yellow1.x, yellow1.y)
 		end
+		AnimOutOfNowhere(yellowArmy[4].gear)
+		AnimOutOfNowhere(yellowArmy[5].gear)
 	elseif TotalRounds == 10 then
 		RestoreHog(yellowArmy[6].gear)
 		RestoreHog(yellowArmy[7].gear)
@@ -519,11 +550,18 @@
 				and not GetHealth(yellowArmy[4].gear) then
 			SetGearPosition(yellowArmy[6].gear, yellow1.x, yellow1.y)
 		end
+		AnimOutOfNowhere(yellowArmy[6].gear)
+		AnimOutOfNowhere(yellowArmy[7].gear)
 	end
 end
 
 function saveVariables()
 	saveCompletedStatus(2)
+	if chooseToBattle then
+		SaveCampaignVar("Fruit01JoinedBattle", "true")
+	else
+		SaveCampaignVar("Fruit01JoinedBattle", "false")
+	end
 	SaveCampaignVar("UnlockedMissions", "4")
 	SaveCampaignVar("Mission1", "8")
 	SaveCampaignVar("Mission2", "3")
--- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/fruit02.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/fruit02.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -14,6 +14,7 @@
 local tookPartInBattle = false
 local previousHog = -1
 local permitCaptainLimeDeath = false
+local fixedWind = false
 -- dialogs
 local dialog01 = {}
 local dialog02 = {}
@@ -22,12 +23,7 @@
 local dialog05 = {}
 -- mission objectives
 local minesTimeText = loc("Mines time: 0 seconds")
-local goals = {
-	[dialog01] = {missionName, loc("Exploring the tunnel"), loc("Search for the device with the help of the other hedgehogs ").."|"..loc("Hog Solo has to reach the last crates") .. "|" .. minesTimeText, 1, 4000},
-	[dialog02] = {missionName, loc("Exploring the tunnel"), loc("Explore the tunnel with the other hedgehogs and search for the device").."|"..loc("Hog Solo has to reach the last crates") .. "|" .. minesTimeText, 1, 4000},
-	[dialog03] = {missionName, loc("Return to the Surface"), loc("Go to the surface!").."|"..loc("Attack Captain Lime before he attacks back").."|"..minesTimeText, 1, 4000},
-	[dialog04] = {missionName, loc("Return to the Surface"), loc("Go to the surface!").."|"..loc("Attack the assassins before they attack back").."|"..minesTimeText, 1, 4000},
-}
+local goals
 -- crates
 local girderCrate = {name = amGirder, x = 1680, y = 1160}
 
@@ -51,13 +47,16 @@
 hero.y = 820
 hero.dead = false
 green1.name = loc("Captain Lime")
+green1.hat = "war_desertofficer"
 green1.x = 1050
 green1.y = 820
 green1.dead = false
 green2.name = loc("Mister Pear")
+green2.hat = "war_britmedic"
 green2.x = 1350
 green2.y = 820
 green3.name = loc("Lady Mango")
+green3.hat = "hair_red"
 green3.x = 1450
 green3.y = 820
 local redHedgehogs = {
@@ -69,13 +68,12 @@
 -- Hog Solo and Green Bananas
 teamA.name = loc("Hog Solo and GB")
 teamA.color = -6
--- Captain Lime will use a color which is almost the same as the color of teamA.
--- It works, but it's a hack.
--- Technically, this makes Captain Lime an enemy team in the mission but for the player
--- it looks like an ally. This is because Camptain Lime starts friendly (story-wise),
--- but might become your enemy during the course of this mission.
--- TODO: For teamB, use same color of teamA when friendly, change color when evil
+-- Captain Lime can use one of 2 clan colors:
+-- One when being friendly (same as hero), and a different one when he turns evil.
+-- Captain Lime be in his own clan.
 teamB.name = loc("Captain Lime")
+teamB.colorNice = teamA.color
+teamB.colorEvil = -5
 teamC.name = loc("Fruit Assassins")
 teamC.color = -1
 
@@ -87,7 +85,6 @@
 	MinesNum = 0
 	MinesTime = 1
 	Explosives = 0
-	Delay = 3
 	-- Disable Sudden Death
 	HealthDecrease = 0
 	WaterRise = 0
@@ -99,50 +96,58 @@
 
 	-- Fruit Assassins
 	local assasinsHats = { "NinjaFull", "NinjaStraight", "NinjaTriangle" }
-	AddTeam(teamC.name, teamC.color, "bp2", "Island", "Default", "cm_scout")
+	teamC.name = AddTeam(teamC.name, teamC.color, "bp2", "Island", "Default_qau", "cm_scout")
 	for i=1,table.getn(redHedgehogs) do
 		redHedgehogs[i].gear =  AddHog(redHedgehogs[i].name, 1, 100, assasinsHats[GetRandom(3)+1])
-		AnimSetGearPosition(redHedgehogs[i].gear, 2010 + 50*i, 630)
+		SetGearPosition(redHedgehogs[i].gear, 2010 + 50*i, 630)
 	end
 	local assassinsColor = div(GetClanColor(GetHogClan(redHedgehogs[1].gear)), 0x100)
 
-	-- Hog Solo and Green Bananas
-	AddTeam(teamA.name, teamA.color, "Simple", "Island", "Default", "hedgehog")
-	hero.gear = AddHog(hero.name, 0, health, "war_desertgrenadier1")
-	AnimSetGearPosition(hero.gear, hero.x, hero.y)
+	-- Hero and Green Bananas
+	teamA.name = AddMissionTeam(teamA.color)
+	hero.gear = AddMissionHog(health)
+	hero.name = GetHogName(hero.gear)
+	SetHogTeamName(hero.gear, string.format(loc("%s and GB"), teamA.name))
+	teamA.name = GetHogTeamName(hero.gear)
+	SetGearPosition(hero.gear, hero.x, hero.y)
 	HogTurnLeft(hero.gear, true)
-	green2.gear = AddHog(green2.name, 0, 100, "war_britmedic")
-	AnimSetGearPosition(green2.gear, green2.x, green2.y)
+	local heroColor = div(GetClanColor(GetHogClan(hero.gear)), 0x100)
+
+	-- companions
+	-- Change companion identity if they have same name as hero
+	-- to avoid confusion.
+	if green2.name == hero.name then
+		green2.name = loc("Green Hog Grape")
+		green2.hat = "war_desertsapper1"
+	elseif green3.name == hero.name then
+		green3.name = loc("Green Hog Grape")
+		green3.hat = "war_desertsapper1"
+	end
+	green2.gear = AddHog(green2.name, 0, 100, green2.hat)
+	SetGearPosition(green2.gear, green2.x, green2.y)
 	HogTurnLeft(green2.gear, true)
-	green3.gear = AddHog(green3.name, 0, 100, "hair_red")
-	AnimSetGearPosition(green3.gear, green3.x, green3.y)
+
+	green3.gear = AddHog(green3.name, 0, 100, green3.hat)
+	SetGearPosition(green3.gear, green3.x, green3.y)
 	HogTurnLeft(green3.gear, true)
-	local heroColor = div(GetClanColor(GetHogClan(hero.gear)), 0x100)
 
 	-- Captain Lime
-	-- Returns a color that is as close as possible to the color argument
-	-- but does not equal color and otherCollision.
-	local getSimilarColor = function(color, otherCollision)
-		local goingUp = false
-		local collision1 = color
-		while(color == collision1 or color == otherCollision) do
-			-- Try out colors by varying the blue color component until
-			-- we don't collide with any of the 2 colors.
-			if ((color % 0x100) > 0) and (not goingUp) then
-				color = color - 0x1
-			else
-				goingUp = true
-				color = color + 0x1
-			end
-		end
-		return color
-	end
-	-- Captain Lime gets a fake color clore to hero's clan color.
-	-- This is a hack, but it works. See explanation at top of file
-	local cptnColor = getSimilarColor(heroColor, assassinsColor)
-	AddTeam(teamB.name, cptnColor, "Cherry", "Island", "Default", "congo-brazzaville")
-	green1.gear= AddHog(green1.name, 0, 100, "war_desertofficer")
-	AnimSetGearPosition(green1.gear, green1.x, green1.y)
+        -- Spawn with his "true" evil color so a new clan is created for Captain Lime ...
+	teamB.name = AddTeam(teamB.name, teamB.colorEvil, "Cherry", "Island", "Default_qau", "congo-brazzaville")
+	SetTeamPassive(teamB.name, true)
+	green1.gear = AddHog(green1.name, 0, 100, green1.hat)
+	-- ... however, we immediately change the color to "nice mode".
+	-- Captain Lime starts as (seemingly) friendly in this mission.
+	SetClanColor(GetHogClan(green1.gear), teamB.colorNice)
+	SetGearPosition(green1.gear, green1.x, green1.y)
+
+	-- Populate goals table
+	goals = {
+		[dialog01] = {missionName, loc("Exploring the tunnel"), loc("Search for the device with the help of the other hedgehogs.").."|"..string.format(loc("%s must collect the final crates."), hero.name) .. "|" .. minesTimeText, 1, 4000},
+		[dialog02] = {missionName, loc("Exploring the tunnel"), loc("Explore the tunnel with the other hedgehogs and search for the device.").."|"..string.format(loc("%s must collect the final crates."), hero.name) .. "|" .. minesTimeText, 1, 4000},
+		[dialog03] = {missionName, loc("Return to the Surface"), loc("Go to the surface!").."|"..loc("Attack Captain Lime before he attacks back.").."|"..minesTimeText, 1, 4000},
+		[dialog04] = {missionName, loc("Return to the Surface"), loc("Go to the surface!").."|"..loc("Attack the assassins before they attack back.").."|"..minesTimeText, 1, 4000},
+	}
 
 	AnimInit(true)
 	AnimationSetup()
@@ -159,7 +164,7 @@
 	AddEvent(onHeroDeath, {hero.gear}, heroDeath, {hero.gear}, 0)
 	AddEvent(onDeviceCrates, {hero.gear}, deviceCrateEvent, {hero.gear}, 0)
 
-	-- Hog Solo and GB weapons
+	-- Hero and Green Bananas weapons
 	AddAmmo(hero.gear, amSwitch, 100)
 	-- Assassins weapons
 	AddAmmo(redHedgehogs[1].gear, amBazooka, 6)
@@ -175,19 +180,47 @@
 	local x2 = 1306
 	local y1 = 1210
 	local y2 = 1620
-	while true do
-		if y2<y1 then
-			break
-		end
-		if x2<x1 then
-			x2 = 1305
-			y2 = y2 - 50
-		end
-		if not TestRectForObstacle(x2+25, y2+25, x2-25, y2-25, true) then
-			AddGear(x2, y2, gtExplosives, 0, 0, 0, 0)
-		end
-		x2 = x2 - 25
+
+	-- barrel mania in the large hole
+	local barrels = {
+		{1290, 1618},
+		{1285, 1587},
+		{1287, 1556},
+		{1286, 1525},
+		{1247, 1637},
+		{1250, 1606},
+		{1249, 1575},
+		{1251, 1544},
+		{1206, 1646},
+		{1211, 1615},
+		{1209, 1584},
+		{1166, 1646},
+		{1168, 1615},
+		{1170, 1584},
+		{1125, 1637},
+		{1120, 1606},
+		{1128, 1575},
+		{1089, 1622},
+		{1084, 1591},
+		{1093, 1560},
+		{1044, 1596},
+		{1044, 1565},
+		{1005, 1554},
+		{1005, 1523},
+		{973, 1492},
+		{1062, 1534},
+		{1128, 1544},
+		{1168, 1553},
+		{1210, 1553},
+		{1097, 1529},
+		{1040, 1505},
+	}
+	for b=1, #barrels do
+		local barrel = AddGear(barrels[b][1], barrels[b][2], gtExplosives, 0, 0, 0, 0)
+		SetHealth(barrel, 21)
 	end
+
+	-- single barrel at the right corner
 	AddGear(3128, 1680, gtExplosives, 0, 0, 0, 0)
 
 	--mines
@@ -228,25 +261,30 @@
 
 function onNewTurn()
 	if not inBattle and CurrentHedgehog == green1.gear then
-		EndTurn(true)
-	elseif CurrentHedgehog == green2.gear or CurrentHedgehog == green3.gear then
-		EndTurn(true)
+		SkipTurn()
+	elseif (not inBattle) and GetHogTeamName(CurrentHedgehog) == teamA.name then
+		if CurrentHedgehog ~= hero.gear then
+			-- FIXME: This screw up the selected weapon caption, as
+			-- SwitchHog does not update the selected display caption
+			AnimSwitchHog(hero.gear)
+		end
+		-- Workaround: Add a caption that overwrites the displayed weapon display
+		AddCaption(loc("Let's go!"), capcolDefault, capgrpAmmoinfo)
+		SetTurnTimeLeft(MAX_TURN_TIME)
+		wind()
 	elseif inBattle then
 		if CurrentHedgehog == green1.gear and previousHog ~= hero.gear then
-			EndTurn(true)
+			SkipTurn()
 			return
 		end
 		for i=1,table.getn(redHedgehogs) do
 			if CurrentHedgehog == redHedgehogs[i].gear and previousHog ~= hero.gear then
-				EndTurn(true)
+				SkipTurn()
 				return
 			end
 		end
 		SetTurnTimeLeft(20000)
 		wind()
-	elseif not inBattle and CurrentHedgehog == hero.gear then
-		SetTurnTimeLeft(MAX_TURN_TIME)
-		wind()
 	else
 		EndTurn(true)
 	end
@@ -268,8 +306,16 @@
 		heroDeath()
 		permitCaptainLimeDeath = true
 	end
-	if CurrentHedgehog and GetY(CurrentHedgehog) > 1350 then
-		SetWind(-40)
+	if (not fixedWind) and CurrentHedgehog and GetY(CurrentHedgehog) > 1350 then
+		fixedWind = true
+		wind()
+	end
+end
+
+function onGearAdd(gear)
+	-- Turn sticky flames to normal flames, to reduce the waiting time after blowing up the barrels
+	if GetGearType(gear) == gtFlame and band(GetState(gear), gsttmpFlag) ~= 0 then
+		SetState(gear, band(GetState(gear), bnot(gsttmpFlag)))
 	end
 end
 
@@ -284,8 +330,6 @@
 			AddCaption(loc("Anti-Gravity Device Part (+1)"), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmostate)
 			deviceCrate.collected = true
 			deviceCrate.collector = CurrentHedgehog
-			-- Spawn rope crate
-			SpawnSupplyCrate(ropeCrate.x, ropeCrate.y, ropeCrate.name)
 		end
 	end
 end
@@ -341,7 +385,10 @@
 	return false
 end
 
-function onGaptainLimeDeath(gear)
+function onCaptainLimeDeath(gear)
+	if (not IsHogAlive(hero.gear)) or (not StoppedGear(hero.gear)) then
+		return false
+	end
 	if green1.dead then
 		return true
 	end
@@ -349,6 +396,9 @@
 end
 
 function onRedTeamDeath(gear)
+	if (not IsHogAlive(hero.gear)) or (not StoppedGear(hero.gear)) then
+		return false
+	end
 	local redDead = true
 	for i=1,table.getn(redHedgehogs) do
 		if GetHealth(redHedgehogs[i].gear) then
@@ -364,13 +414,13 @@
 
 function heroDeath(gear)
 	if not ended then
-		SendStat(siGameResult, loc("Hog Solo lost, try again!"))
-		SendStat(siCustomAchievement, loc("To win the game, Hog Solo has to get the bottom crates and come back to the surface."))
+		SendStat(siGameResult, string.format(loc("%s lost, try again!"), hero.name))
+		SendStat(siCustomAchievement, string.format(loc("To win the game, %s has to get the bottom crates and come back to the surface."), hero.name))
 		SendStat(siCustomAchievement, loc("You can use the other 2 hogs to assist you."))
 		SendStat(siCustomAchievement, loc("Do not destroy the crates!"))
 		if tookPartInBattle then
 			if permitCaptainLimeDeath then
-				SendStat(siCustomAchievement, loc("You'll have to eliminate the Fruit Assassins at the end."))
+				SendStat(siCustomAchievement, string.format(loc("You'll have to eliminate %s at the end."), teamC.name))
 				sendSimpleTeamRankings({teamC.name, teamA.name})
 			else
 				sendSimpleTeamRankings({teamA.name})
@@ -394,7 +444,7 @@
 	-- Stop hedgehog
 	SetGearMessage(deviceCrate.collector, 0)
 	if deviceCrate.collector == hero.gear then
-		-- Hog Solo collected the device crate
+		-- Hero collected the device crate
 
 		if not tookPartInBattle then
 			-- Captain Lime turns evil
@@ -430,7 +480,7 @@
 		AddAmmo(green1.gear, amBazooka, 6)
 		AddAmmo(green1.gear, amGrenade, 6)
 		AddAmmo(green1.gear, amDEagle, 2)
-		AddEvent(onGaptainLimeDeath, {green1.gear}, captainLimeDeath, {green1.gear}, 0)
+		AddEvent(onCaptainLimeDeath, {green1.gear}, captainLimeDeath, {green1.gear}, 0)
 	end
 	EndTurn(true)
 	escapeHog(green2.gear)
@@ -453,7 +503,7 @@
 	saveCompletedStatus(3)
 	SendStat(siGameResult, loc("Congratulations, you won!"))
 	SendStat(siCustomAchievement, loc("You retrieved the lost part."))
-	SendStat(siCustomAchievement, loc("You defended yourself against the Fruit Assassins."))
+	SendStat(siCustomAchievement, string.format(loc("You defended yourself against %s."), teamC.name))
 	sendSimpleTeamRankings({teamA.name, teamC.name})
 	EndGame()
 end
@@ -464,6 +514,9 @@
 	if goals[anim] ~= nil then
 		ShowMission(unpack(goals[anim]))
 	end
+	if anim == dialog03 or anim == dialog04 then
+		spawnRopeCrate()
+	end
 	if anim == dialog03 then
 		makeCptLimeEvil()
 	elseif anim == dialog05 then
@@ -474,10 +527,10 @@
 end
 
 function AnimationSetup()
-	-- DIALOG 01 - Start, Captain Lime helps Hog Solo because he took part in the battle
+	-- DIALOG 01 - Start, Captain Lime helps the hero because he took part in the battle
 	AddSkipFunction(dialog01, Skipanim, {dialog01})
 	table.insert(dialog01, {func = AnimWait, args = {hero.gear, 3000}})
-	table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("Somewhere else on the planet of fruits, Captain Lime helps Hog Solo"), 5000}})
+	table.insert(dialog01, {func = AnimCaption, args = {hero.gear, string.format(loc("Somewhere else on the planet of fruits, Captain Lime helps %s"), hero.name), 5000}})
 	table.insert(dialog01, {func = AnimSay, args = {green1.gear, loc("You fought bravely and you helped us win this battle!"), SAY_SAY, 5000}})
 	table.insert(dialog01, {func = AnimSay, args = {green1.gear, loc("So, as promised I have brought you where I think that the device you are looking for is hidden."), SAY_SAY, 7000}})
 	table.insert(dialog01, {func = AnimSay, args = {green1.gear, loc("I know that your resources are low due to the battle but I'll send two of my best hogs to assist you."), SAY_SAY, 7000}})
@@ -485,10 +538,10 @@
 	table.insert(dialog01, {func = AnimWait, args = {hero.gear, 500}})
 	table.insert(dialog01, {func = AnimSwitchHog, args = {hero.gear}})
 	table.insert(dialog01, {func = ShowMission, args = goals[dialog01]})
-	-- DIALOG02 - Start, Hog Solo escaped from the previous battle
+	-- DIALOG02 - Start, hero escaped from the previous battle
 	AddSkipFunction(dialog02, Skipanim, {dialog02})
 	table.insert(dialog02, {func = AnimWait, args = {hero.gear, 3000}})
-	table.insert(dialog02, {func = AnimCaption, args = {hero.gear, loc("Somewhere else on the planet of fruits Hog Solo gets closer to the device"), 5000}})
+	table.insert(dialog02, {func = AnimCaption, args = {hero.gear, string.format(loc("Somewhere else on the planet of fruits, %s gets closer to the device"), hero.name), 5000}})
 	table.insert(dialog02, {func = AnimSay, args = {green1.gear, loc("You are the one who fled! So, you are alive."), SAY_SAY, 4000}})
 	table.insert(dialog02, {func = AnimSay, args = {green1.gear, loc("I'm still low on hogs. If you are not afraid I could use a set of extra hands."), SAY_SAY, 4000}})
 	table.insert(dialog02, {func = AnimWait, args = {hero.gear, 8000}})
@@ -507,8 +560,9 @@
 	table.insert(dialog03, {func = FollowGear, args = {hero.gear}})
 	table.insert(dialog03, {func = AnimSay, args = {hero.gear, loc("Hooray! I've found it, now I have to get back to Captain Lime!"), SAY_SAY, 4000}})
 	table.insert(dialog03, {func = AnimWait, args = {green1.gear, 4000}})
-	table.insert(dialog03, {func = AnimSay, args = {green1.gear, loc("This Hog Solo is so naive! When he returns I'll shoot him and keep that device for myself!"), SAY_THINK, 4000}})
+	table.insert(dialog03, {func = AnimSay, args = {green1.gear, string.format(loc("This %s is so naive! I'm going to shoot this fool so I can keep that device for myself!"), hero.name), SAY_THINK, 4000}})
 	table.insert(dialog03, {func = ShowMission, args = goals[dialog03]})
+	table.insert(dialog03, {func = spawnRopeCrate, args = {hero.gear}})
 	table.insert(dialog03, {func = makeCptLimeEvil, args = {hero.gear}})
 	-- DIALOG04 - At crates, hero learns about the Assassins ambush
 	AddSkipFunction(dialog04, Skipanim, {dialog04})
@@ -518,6 +572,7 @@
 	table.insert(dialog04, {func = AnimWait, args = {redHedgehogs[1].gear, 4000}})
 	table.insert(dialog04, {func = AnimSay, args = {redHedgehogs[1].gear, loc("We have spotted the enemy! We'll attack when the enemies start gathering!"), SAY_THINK, 4000}})
 	table.insert(dialog04, {func = ShowMission, args = goals[dialog04]})
+	table.insert(dialog04, {func = spawnRopeCrate, args = {hero.gear}})
 	table.insert(dialog04, {func = goToThesurface, args = {hero.gear}})
 end
 
@@ -552,9 +607,17 @@
 function makeCptLimeEvil()
 	-- Turn Captain Lime evil
 	SetHogLevel(green1.gear, 1)
+	SetTeamPassive(teamB.name, false)
+	-- ... and reveal his "true" evil color. Muhahaha!
+	SetClanColor(GetHogClan(green1.gear), teamB.colorEvil)
 	EndTurn(true)
 end
 
+function spawnRopeCrate()
+	-- should be spawned after the device part was gotten and the cut scene finished.
+	SpawnSupplyCrate(ropeCrate.x, ropeCrate.y, ropeCrate.name)
+end
+
 function goToThesurface()
 	EndTurn(true)
 end
@@ -565,15 +628,19 @@
 		escapeHog(deviceCrate.collector)
 		AddCaption(loc("The device part has been stolen!"))
 		sendSimpleTeamRankings({teamA.name})
-		SendStat(siGameResult, loc("Hog Solo lost, try again!"))
-		SendStat(siCustomAchievement, loc("Oh no, the Green Bananas have betrayed Hog Solo and stole the anti-gravity device part!"))
-		SendStat(siCustomAchievement, loc("Only Hog Solo can be trusted with the crate."))
+		SendStat(siGameResult, string.format(loc("%s lost, try again!"), hero.name))
+		SendStat(siCustomAchievement, string.format(loc("Oh no, the companions have betrayed %s and stole the anti-gravity device part!"), hero.name))
+		SendStat(siCustomAchievement, string.format(loc("Only %s can be trusted with the crate."), hero.name))
 		EndGame()
 		ended = true
 	end
 end
 
 function wind()
-	SetWind(GetRandom(201)-100)
+	if fixedWind then
+		SetWind(10)
+	else
+		SetWind(GetRandom(201)-100)
+	end
 end
 
--- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/fruit03.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/fruit03.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -88,19 +88,20 @@
 	WaterRise = 0
 	HealthDecrease = 0
 
-	-- Hog Solo
-	AddTeam(teamA.name, teamA.color, "Simple", "Island", "Default", "hedgewars")
-	hero.gear = AddHog(hero.name, 0, 100, "war_desertgrenadier1")
+	-- Hero
+	teamA.name = AddMissionTeam(teamA.color)
+	hero.gear = AddMissionHog(100)
+	hero.name = GetHogName(hero.gear)
 	AnimSetGearPosition(hero.gear, hero.x, hero.y)
 	-- enemies
 	local hats = { "Bandit", "fr_apple", "fr_banana", "fr_lemon", "fr_orange",
 					"fr_pumpkin", "Gasmask", "NinjaFull", "NinjaStraight", "NinjaTriangle" }
-	AddTeam(teamC.name, teamC.color, "bp2", "Island", "Default", "cm_bars")
+	teamC.name = AddTeam(teamC.name, teamC.color, "bp2", "Island", "Default_qau", "cm_bars")
 	for i=1,table.getn(enemiesEven) do
 		enemiesEven[i].gear = AddHog(enemiesEven[i].name, 1, 100, hats[GetRandom(table.getn(hats))+1])
 		AnimSetGearPosition(enemiesEven[i].gear, enemiesEven[i].x, enemiesEven[i].y)
 	end
-	AddTeam(teamB.name, teamB.color, "bp2", "Island", "Default", "cm_bars")
+	teamB.name = AddTeam(teamB.name, teamB.color, "bp2", "Island", "Default_qau", "cm_bars")
 	for i=1,table.getn(enemiesOdd) do
 		enemiesOdd[i].gear = AddHog(enemiesOdd[i].name, 1, 100, hats[GetRandom(table.getn(hats))+1])
 		AnimSetGearPosition(enemiesOdd[i].gear, enemiesOdd[i].x, enemiesOdd[i].y)
@@ -243,6 +244,9 @@
 end
 
 function onHeroWin(gear)
+	if (not IsHogAlive(hero.gear)) or (not StoppedGear(hero.gear)) then
+		return false
+	end
 	local enemies = enemiesOdd
 	for i=1,table.getn(enemiesEven) do
 		table.insert(enemies, enemiesEven[i])
@@ -260,7 +264,7 @@
 -------------- ACTIONS ------------------
 
 function heroDeath(gear)
-	SendStat(siGameResult, loc("Hog Solo lost, try again!"))
+	SendStat(siGameResult, string.format(loc("%s lost, try again!"), hero.name))
 	SendStat(siCustomAchievement, loc("You have to eliminate all the enemies."))
 	SendStat(siCustomAchievement, loc("Read the challenge objectives from within the mission for more details."))
 	sendSimpleTeamRankings({teamB.name, teamC.name, teamA.name})
--- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/ice01.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/ice01.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -88,7 +88,6 @@
 	MinesNum = 0
 	MinesTime = 1
 	Explosives = 0
-	Delay = 3
 	Map = "ice01_map"
 	Theme = "Snow"
 	-- Disable Sudden Death
@@ -111,17 +110,19 @@
 		SaveCampaignVar("HeroHealth", heroHealth)
 	end
 
-	-- Hog Solo
-	AddTeam(teamC.name, teamC.color, "Simple", "Island", "Default", "hedgewars")
-	hero.gear = AddHog(hero.name, 0, heroHealth, "war_desertgrenadier1")
+	-- Hero
+	teamC.name = AddMissionTeam(teamC.color)
+	hero.gear = AddMissionHog(heroHealth)
+	hero.name = GetHogName(hero.gear)
 	AnimSetGearPosition(hero.gear, hero.x, hero.y)
 	HogTurnLeft(hero.gear, true)
 	-- Ally
-	AddTeam(teamA.name, teamA.color, "heart", "Island", "Default", "cm_face")
+	teamA.name = AddTeam(teamA.name, teamA.color, "heart", "Island", "Default_qau", "cm_face")
+	SetTeamPassive(teamA.name, true)
 	ally.gear = AddHog(ally.name, 0, 100, "war_airwarden02")
 	AnimSetGearPosition(ally.gear, ally.x, ally.y)
 	-- Frozen Bandits
-	AddTeam(teamB.name, teamB.color, "plant2", "Island", "Default", "cm_pirate")
+	teamB.name = AddTeam(teamB.name, teamB.color, "plant2", "Island", "Default_qau", "cm_pirate")
 	bandit1.gear = AddHog(bandit1.name, 1, 120, "Santa")
 	AnimSetGearPosition(bandit1.gear, bandit1.x, bandit1.y)
 	HogTurnLeft(bandit1.gear, true)
@@ -234,29 +235,48 @@
 	SendHealthStatsOff()
 end
 
+function getNextBandit(hog)
+	local continue = true
+	local startHog = hog
+	while true do
+		if (GetHealth(hog) and GetEffect(hog, heFrozen) < 256) and
+		( (heroAtFinalStep and (hog == bandit1.gear or hog == bandit4.gear or hog == bandit5.gear)) or
+		((not heroAtFinalStep) and (hog == bandit2.gear or hog == bandit3.gear)) ) then
+			return hog
+		end
+		if hog == bandit1.gear then
+			hog = bandit2.gear
+		elseif hog == bandit2.gear then
+			hog = bandit3.gear
+		elseif hog == bandit3.gear then
+			hog = bandit4.gear
+		elseif hog == bandit4.gear then
+			hog = bandit5.gear
+		elseif hog == bandit5.gear then
+			hog = bandit1.gear
+		end
+		if startHog == hog then
+			return nil
+		end
+	end
+end
+
 function onNewTurn()
 	heroDamageAtCurrentTurn = 0
 	-- round has to start if hero goes near the column
 	if not heroVisitedAntiFlyArea and CurrentHedgehog ~= hero.gear then
-		EndTurn(true)
+		SkipTurn()
 	elseif not heroVisitedAntiFlyArea and CurrentHedgehog == hero.gear then
 		SetTurnTimeLeft(MAX_TURN_TIME)
-	elseif not heroAtFinalStep and (CurrentHedgehog == bandit1.gear or CurrentHedgehog == bandit4.gear or CurrentHedgehog == bandit5.gear) then
-		AnimSwitchHog(hero.gear)
-		EndTurn(true)
-	elseif heroAtFinalStep and (CurrentHedgehog == bandit2.gear or CurrentHedgehog == bandit3.gear) then
-		if (GetHealth(bandit1.gear) and GetEffect(bandit1.gear,heFrozen) > 256) and
-			((GetHealth(bandit4.gear) and GetEffect(bandit4.gear,heFrozen) > 256) or not GetHealth(bandit4.gear)) and
-			((GetHealth(bandit5.gear) and GetEffect(bandit5.gear,heFrozen) > 256) or not GetHealth(bandit5.gear)) then
-			EndTurn(true)
+	elseif (GetHogTeamName(CurrentHedgehog) == teamB.name) then
+		local nextBandit = getNextBandit(CurrentHedgehog)
+		if nextBandit ~= nil then
+			if CurrentHedgehog ~= nextBandit then
+				AnimSwitchHog(nextBandit)
+			end
 		else
-			AnimSwitchHog(hero.gear)
-			EndTurn(true)
+			SkipTurn()
 		end
-	elseif CurrentHedgehog == ally.gear then
-		-- This switches back to hero (indirectly)
-		SwitchHog(bandit1.gear)
-		EndTurn(true)
 	end
 	-- frozen hogs accounting
 	if CurrentHedgehog == hero.gear and heroAtFinalStep and TurnTimeLeft > 0 then
@@ -405,6 +425,9 @@
 end
 
 function onHeroWin(gear)
+	if (not IsHogAlive(gear)) or (not StoppedGear(gear)) then
+		return false
+	end
 	if (not hero.dead and not bandit1.dead) and heroDamageAtCurrentTurn == 0 and (GetX(hero.gear)>=GetX(bandit1.gear)-80
 		and GetX(hero.gear)<=GetX(bandit1.gear)+80)	and (GetY(hero.gear)>=GetY(bandit1.gear)-30 and GetY(hero.gear)<=GetY(bandit1.gear)+30) then
 		return true
@@ -419,6 +442,7 @@
 	if not heroVisitedAntiFlyArea then
 		EndTurn(true)
 		FollowGear(hero.gear)
+		SetGearMessage(hero.gear, band(GetGearMessage(hero.gear), bnot(gmAllStoppable)))
 		AnimSwitchHog(bandit1.gear)
 		FollowGear(hero.gear)
 		HogSay(hero.gear, loc("My flying saucer stopped working!"), SAY_THINK)
@@ -440,7 +464,7 @@
 end
 
 function heroDeath(gear)
-	SendStat(siGameResult, loc("Hog Solo lost, try again!"))
+	SendStat(siGameResult, string.format(loc("%s lost, try again!"), hero.name))
 	SendStat(siCustomAchievement, loc("To win the game you have to stand next to Thanta."))
 	SendStat(siCustomAchievement, loc("Most of the time you'll be able to use the freezer only."))
 	SendStat(siCustomAchievement, loc("Use the bazooka and the flying saucer to get the freezer."))
@@ -470,7 +494,7 @@
 end
 
 function thantaDeath(gear)
-	SendStat(siGameResult, loc("Hog Solo lost, try again!"))
+	SendStat(siGameResult, string.format(loc("%s lost, try again!"), hero.name))
 	SendStat(siCustomAchievement, loc("Noo, Thanta has to stay alive!"))
 	SendStat(siCustomAchievement, loc("To win the game you have to go next to Thanta."))
 	SendStat(siCustomAchievement, loc("Most of the time you'll be able to use the freezer only."))
--- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/ice02.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/ice02.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -12,6 +12,7 @@
 -- globals
 local missionName = loc("Hard flying")
 local challengeStarted = false
+local challengeStartRequested = false
 local currentWaypoint = 1
 local radius = 75 -- Ring radius. Will become smaller and smaller
 local totalTime = 15000 -- Total available time. Initial value is start time; is added to later when player wins extra time
@@ -81,12 +82,14 @@
 	WaterRise = 0
 	HealthDecrease = 0
 
-	-- Hog Solo
-	AddTeam(teamA.name, teamA.color, "Simple", "Island", "Default", "hedgewars")
-	hero.gear = AddHog(hero.name, 0, 100, "war_desertgrenadier1")
+	-- Hero
+	teamA.name = AddMissionTeam(teamA.color)
+	hero.gear = AddMissionHog(100)
+	hero.name = GetHogName(hero.gear)
 	AnimSetGearPosition(hero.gear, hero.x, hero.y)
 	-- Ally
-	AddTeam(teamB.name, teamB.color, "heart", "Island", "Default", "cm_face")
+	teamB.name = AddTeam(teamB.name, teamB.color, "heart", "Island", "Default_qau", "cm_face")
+	SetTeamPassive(teamB.name, true)
 	ally.gear = AddHog(ally.name, 0, 100, "war_airwarden02")
 	AnimSetGearPosition(ally.gear, ally.x, ally.y)
 	HogTurnLeft(ally.gear, true)
@@ -126,10 +129,17 @@
 	AddAnim(dialog01)
 end
 
+function onEndTurn()
+	if not hero.dead and CurrentHedgehog == hero.gear and challengeStarted then
+		heroLost()
+	end
+end
+
 function onNewTurn()
-	if not hero.dead and CurrentHedgehog == ally.gear and challengeStarted then
-		heroLost()
-	elseif not hero.dead and CurrentHedgehog == hero.gear and challengeStarted then
+	if challengeStartRequested then
+		challengeStarted = true
+	end
+	if not hero.dead and CurrentHedgehog == hero.gear and challengeStarted then
 		SetWeapon(amJetpack)
 	end
 	heroTurn = CurrentHedgehog == hero.gear
@@ -166,14 +176,13 @@
 				end
 			end
 			SendStat(siCustomAchievement, string.format(loc("You have used %d flying saucers."), saucersUsed))
-			SendStat(siCustomAchievement, string.format(loc("You had %d additional flying saucers left."), saucersLeft))
 
 			local leastSaucersRecord = tonumber(GetCampaignVar("IceStadiumLeastSaucersUsed"))
 			if leastSaucersRecord == nil or saucersUsed < leastSaucersRecord then
 				SaveCampaignVar("IceStadiumLeastSaucersUsed", tostring(saucersUsed))
 			end
 
-			SendStat(siPointType, loc("milliseconds"))
+			SendStat(siPointType, "!TIME")
 			SendStat(siPlayerKills, totalTime, GetHogTeamName(hero.gear))
 			SaveCampaignVar("Mission6Won", "true")
 			checkAllMissionsCompleted()
@@ -185,6 +194,13 @@
 		local time = totalTime - TurnTimeLeft
 		local timePrinted  = time / 1000
 		SetTeamLabel(teamA.name, string.format(loc("%.1fs"), timePrinted))
+		if TurnTimeLeft <= 0 then
+			local wp = waypoints[currentWaypoint-1]
+			if wp ~= nil then
+				DeleteVisualGear(wp.gear)
+				DeleteVisualGear(wp.gear2)
+			end
+		end
 	end
 end
 
@@ -245,12 +261,14 @@
 ------------------ Other Functions -------------------
 
 function startFlying()
-	AnimSwitchHog(ally.gear)
+	challengeStartRequested = true
 	EndTurn(true)
-	challengeStarted = true
 end
 
 function placeNextWaypoint()
+	if gameEnded then
+		return
+	end
 	if currentWaypoint > 1 then
 		local wp = waypoints[currentWaypoint-1]
 		DeleteVisualGear(wp.gear)
@@ -308,7 +326,7 @@
 end
 
 function checkIfHeroInWaypoint()
-	if not hero.dead then
+	if (not hero.dead) and (TurnTimeLeft > 0) then
 		local wp = waypoints[currentWaypoint-1]
 		if gearIsInCircle(hero.gear, wp.x, wp.y, radius+4, false) then
 			SetWind(GetRandom(201)-100)
@@ -325,5 +343,6 @@
 	SendStat(siCustomAchievement, loc("Green double rings also give you a new flying saucer."))
 	SendStat(siCustomAchievement, loc("Use the attack key twice to change the flying saucer while being in air."))
 	sendSimpleTeamRankings({teamA.name})
+	gameEnded = true
 	EndGame()
 end
--- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/moon01.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/moon01.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -109,19 +109,20 @@
 	Explosives = 0
 	HealthDecrease = 0
 	WaterRise = 0
-	Delay = 5
 	Map = "moon01_map"
 	Theme = "Cheese" -- Because ofc moon is made of cheese :)
-	-- Hog Solo
-	AddTeam(teamD.name, teamD.color, "Simple", "Island", "Default", "hedgewars")
+	-- Hero
+	teamD.name = AddMissionTeam(teamD.color)
 	if tonumber(GetCampaignVar("HeroHealth")) then
-		hero.gear = AddHog(hero.name, 0, tonumber(GetCampaignVar("HeroHealth")), "war_desertgrenadier1")
+		hero.gear = AddMissionHog(tonumber(GetCampaignVar("HeroHealth")))
 	else
-		hero.gear = AddHog(hero.name, 0, 100, "war_desertgrenadier1")
+		hero.gear = AddMissionHog(100)
 	end
+	hero.name = GetHogName(hero.gear)
 	AnimSetGearPosition(hero.gear, hero.x, hero.y)
 	-- PAotH
-	AddTeam(teamA.name, teamA.color, "Earth", "Island", "Default", "cm_galaxy")
+	teamA.name = AddTeam(teamA.name, teamA.color, "Earth", "Island", "Default_qau", "cm_galaxy")
+	SetTeamPassive(teamA.name, true)
 	paoth1.gear = AddHog(paoth1.name, 0, 100, "scif_2001O")
 	AnimSetGearPosition(paoth1.gear, paoth1.x, paoth1.y)
 	HogTurnLeft(paoth1.gear, true)
@@ -135,12 +136,13 @@
 	AnimSetGearPosition(paoth4.gear, paoth4.x, paoth4.y)
 	HogTurnLeft(paoth4.gear, true)
 	-- Professor
-	AddTeam(teamC.name, teamC.color, "star", "Island", "Default", "cm_sine")
+	teamC.name = AddTeam(teamC.name, teamC.color, "star", "Island", "Default_qau", "cm_sine")
+	SetTeamPassive(teamC.name, true)
 	professor.gear = AddHog(professor.name, 0, professor.health, "tophats")
 	AnimSetGearPosition(professor.gear, professor.x, professor.y)
 	HogTurnLeft(professor.gear, true)
 	-- Minions
-	AddTeam(teamB.name, teamB.color, "eyecross", "Island", "Default", "cm_sine")
+	teamB.name = AddTeam(teamB.name, teamB.color, "eyecross", "Island", "Default_qau", "cm_sine")
 	minion1.gear = AddHog(minion1.name, 1, 50, "Gasmask")
 	AnimSetGearPosition(minion1.gear, minion1.x, minion1.y)
 	HogTurnLeft(minion1.gear, true)
@@ -173,8 +175,8 @@
 	AnimWait(hero.gear, 3000)
 	FollowGear(hero.gear)
 
-	ShowMission(campaignName, missionName, loc("Hog Solo has to refuel his saucer.")..
-	"|"..loc("Rescue the imprisoned PAotH team and get the fuel!"), -amSkip, 0)
+	ShowMission(campaignName, missionName, string.format(loc("%s has to refuel the saucer."), hero.name)..
+	"|"..loc("Rescue the imprisoned PAotH team and get the fuel!"), 10, 0)
 
 	AddAmmo(minion1.gear, amDEagle, 10)
 	AddAmmo(minion2.gear, amDEagle, 10)
@@ -253,9 +255,6 @@
 		elseif weaponsAcquired and not battleZoneReached and afterDialog02 then
 			battleZone(hero.gear)
 		end
-	elseif CurrentHedgehog == paoth1.gear or CurrentHedgehog == paoth2.gear
-		or CurrentHedgehog == paoth3.gear or CurrentHedgehog == paoth4.gear then
-		EndTurn(true)
 	elseif CurrentHedgehog == professor.gear then
 		if weaponsAcquired and not battleZoneReached and afterDialog02 then
 			battleZone(hero.gear)
@@ -362,7 +361,7 @@
 end
 
 function heroDeath(gear)
-	SendStat(siGameResult, loc("Hog Solo lost, try again!"))
+	SendStat(siGameResult, string.format(loc("%s lost, try again!"), hero.name))
 	SendStat(siCustomAchievement, loc("You have to get the weapons and rescue the PAotH researchers."))
 	sendSimpleTeamRankings({teamC.name, teamB.name, teamD.name, teamA.name})
 	EndGame()
@@ -388,7 +387,7 @@
 function victory()
 	AnimCaption(hero.gear, loc("Congrats! You won!"), 6000)
 	saveCompletedStatus(1)
-	SendStat(siGameResult, loc("Hog Solo wins, congratulations!"))
+	SendStat(siGameResult, string.format(loc("%s wins, congratulations!"), hero.name))
 	sendSimpleTeamRankings({teamD.name, teamA.name, teamC.name, teamB.name})
 	SaveCampaignVar("CosmosCheckPoint", "5") -- hero got fuels
 	resetCheckpoint() -- reset this mission
@@ -398,7 +397,9 @@
 
 function professorAndMinionsDeath(gear)
 	if gameOver then return end
-	SendStat(siCustomAchievement, loc("You have eliminated the whole evil team. You're pretty tough!"))
+	if (not IsHogAlive(hero.gear)) or (not StoppedGear(hero.gear)) then return end
+	SendStat(siCustomAchievement, loc("You have eliminated Professor Hogevil."))
+	SendStat(siCustomAchievement, loc("You have eliminated the evil minions."))
 
 	SaveCampaignVar("ProfDiedOnMoon", "1")
 	victory()
@@ -406,6 +407,7 @@
 
 function professorDeath(gear)
 	if gameOver then return end
+	if (not IsHogAlive(hero.gear)) or (not StoppedGear(hero.gear)) then return end
 	local m1h = GetHealth(minion1.gear)
 	local m2h = GetHealth(minion2.gear)
 	local m3h = GetHealth(minion3.gear)
@@ -422,6 +424,7 @@
 end
 
 function afterDialog06()
+	if (not IsHogAlive(hero.gear)) or (not StoppedGear(hero.gear)) then return end
 	EndTurn(true)
 	SendStat(siCustomAchievement, loc("You have eliminated Professor Hogevil."))
 	SendStat(siCustomAchievement, loc("You drove the minions away."))
@@ -430,6 +433,7 @@
 end
 
 function afterDialog05()
+	if (not IsHogAlive(hero.gear)) or (not StoppedGear(hero.gear)) then return end
 	EndTurn(true)
 	HideHog(professor.gear)
 	SendStat(siCustomAchievement, loc("You have eliminated the evil minions."))
@@ -442,6 +446,7 @@
 function minionsDeath(gear)
 	if professor.dead or GetHealth(professor.gear) == nil or GetHealth(professor.gear) == 0 then return end
 	if gameOver then return end
+	if (not IsHogAlive(hero.gear)) or (not StoppedGear(hero.gear)) then return end
 	AddAnim(dialog05)
 end
 
@@ -474,7 +479,7 @@
 	AddSkipFunction(dialog01, Skipanim, {dialog01})
 	table.insert(dialog01, {func = AnimWait, args = {hero.gear, 3000}})
 	table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("Near a PAotH base on the moon ..."),  4000}})
-	table.insert(dialog01, {func = AnimSay, args = {paoth1.gear, loc("Hey, Hog Solo! Finally you have come!"), SAY_SAY, 2000}})
+	table.insert(dialog01, {func = AnimSay, args = {paoth1.gear, string.format(loc("Hey, %s! Finally you have come!"), hero.name), SAY_SAY, 2000}})
 	table.insert(dialog01, {func = AnimSay, args = {paoth1.gear, loc("It seems that Professor Hogevil has prepared for your arrival!"), SAY_SAY, 4000}})
 	table.insert(dialog01, {func = AnimSay, args = {paoth1.gear, loc("He has captured the rest of the PAotH team and awaits to capture you!"), SAY_SAY, 5000}})
 	table.insert(dialog01, {func = AnimSay, args = {paoth1.gear, loc("We have to hurry! Are you armed?"), SAY_SAY, 4300}})
--- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/moon02.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/moon02.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -1,6 +1,6 @@
 ------------------- ABOUT ----------------------
 --
--- Hog Solo has to catch the other hog in order
+-- The hero has to catch the other hog in order
 -- to get informations about the origin of Pr. Hogevil
 
 HedgewarsScriptLoad("/Scripts/Locale.lua")
@@ -13,9 +13,16 @@
 local challengeObjectives = loc("Use the rope in order to catch the blue hedgehog").."|"..
 	loc("You have to stand very close to him")
 local currentPosition = 1
+local raceSectionStarted = false
+local runnerCaught = false
 local previousTimeLeft = 0
 local startChallenge = false
 local winningTime = nil
+local currentTime = 0
+local runnerTime = 0
+local record
+local lostGame = false
+local heroHurt = false
 -- dialogs
 local dialog01 = {}
 local dialog02 = {}
@@ -27,17 +34,21 @@
 local hero = {
 	name = loc("Hog Solo"),
 	x = 1300,
-	y = 850
+	y = 948
 }
 local runner = {
 	name = loc("Crazy Runner"),
 	places = {
-		{x = 1400,y = 850, turnTime = 0},
+		{x = 1400,y = 904, turnTime = 0},
 		{x = 3880,y = 33, turnTime = 30000},
 		{x = 250,y = 1780, turnTime = 25000},
 		{x = 3850,y = 1940, turnTime = 20000},
 	}
 }
+local runnerTimeTotal = 0
+for i=1, #runner.places do
+	runnerTimeTotal = runnerTimeTotal + runner.places[i].turnTime
+end
 -- teams
 local teamA = {
 	name = loc("Hog Solo"),
@@ -63,16 +74,18 @@
 	WaterRise = 0
 	HealthDecrease = 0
 
-	-- Hog Solo
-	AddTeam(teamA.name, teamA.color, "Simple", "Island", "Default", "hedgewars")
-	hero.gear = AddHog(hero.name, 0, 1, "war_desertgrenadier1")
+	-- Hero
+	teamA.name = AddMissionTeam(teamA.color)
+	hero.gear = AddMissionHog(1)
+	hero.name = GetHogName(hero.gear)
 	AnimSetGearPosition(hero.gear, hero.x, hero.y)
 	-- Crazy Runner
-	AddTeam(teamB.name, teamB.color, "ring", "Island", "Default", "cm_sonic")
+	teamB.name = AddTeam(teamB.name, teamB.color, "ring", "Island", "Default_qau", "cm_sonic")
 	runner.gear = AddHog(runner.name, 0, 100, "sth_Sonic")
 	AnimSetGearPosition(runner.gear, runner.places[1].x, runner.places[1].y)
 	HogTurnLeft(runner.gear, true)
 
+	record = tonumber(GetCampaignVar("FastestBlueHogCatch"))
 	initCheckpoint("moon02")
 
 	AnimInit(true)
@@ -84,7 +97,11 @@
 	FollowGear(hero.gear)
 
 	AddEvent(onHeroDeath, {hero.gear}, heroDeath, {hero.gear}, 0)
+	AddEvent(onRunnerDeath, {runner.gear}, runnerDeath, {runner.gear}, 0)
 
+	if record ~= nil then
+		goals[dialog01][3] = goals[dialog01][3] .. "|" .. string.format(loc("Personal best: %.3f seconds"), record/1000)
+	end
 	AddAmmo(hero.gear, amRope, 1)
 
 	SendHealthStatsOff()
@@ -110,17 +127,32 @@
 	if startChallenge and currentPosition < 5 then
 		if CurrentHedgehog ~= hero.gear then
 			EndTurn(true)
+			runnerTime = runnerTime + runner.places[currentPosition].turnTime
+			SetTeamLabel(teamB.name, string.format(loc("%.1fs"), runnerTime/1000))
 		else
-			if GetAmmoCount(hero.gear, amRope) == 0  then
-				lose()
-			end
 			SetWeapon(amRope)
 			SetTurnTimeLeft(runner.places[currentPosition].turnTime + previousTimeLeft)
 			previousTimeLeft = 0
+			if currentPosition > 1 then
+				raceSectionStarted = true
+			end
+			runnerCaught = false
 		end
 	end
 end
 
+function onEndTurn()
+	if raceSectionStarted and currentPosition > 1 and currentPosition < 5 then
+		if CurrentHedgehog == hero.gear and (not runnerCaught) and (not heroHurt) then
+			-- sndBoring played manually because lose calls EndGame, which suppresses
+			-- the taunt.
+			PlaySound(sndBoring, hero.gear)
+			lose()
+		end
+	end
+	raceSectionStarted = false
+end
+
 function onGameTick()
 	AnimUnWait()
 	if ShowAnimation() == false then
@@ -128,9 +160,15 @@
 	end
 	ExecuteAfterAnimations()
 	CheckEvents()
+	if GetHealth(hero.gear) and CurrentHedgehog == hero.gear and startChallenge and currentPosition < 5 and currentPosition > 1 and ReadyTimeLeft == 0 and band(GetState(CurrentHedgehog), gstHHDriven) ~= 0 then
+		currentTime = currentTime + 1
+	end
 end
 
 function onGameTick20()
+	if startChallenge and currentPosition < 5 and currentPosition > 1 and CurrentHedgehog == hero.gear and ReadyTimeLeft == 0 and band(GetState(CurrentHedgehog), gstHHDriven) ~= 0 then
+		SetTeamLabel(teamA.name, string.format(loc("%.1fs"), currentTime/1000))
+	end
 	if GetHealth(hero.gear) and startChallenge and isHeroNextToRunner() and currentPosition < 5 then
 		moveRunner()
 	end
@@ -142,6 +180,12 @@
 	end
 end
 
+function onGearDamage(gear)
+	if gear == hero.gear then
+		heroHurt = true
+	end
+end
+
 -------------- EVENTS ------------------
 
 function onHeroDeath(gear)
@@ -151,12 +195,23 @@
 	return false
 end
 
+function onRunnerDeath(gear)
+	if not GetHealth(runner.gear) then
+		return true
+	end
+	return false
+end
+
 -------------- ACTIONS ------------------
 
 function heroDeath(gear)
 	lose()
 end
 
+function runnerDeath(gear)
+	loseRunnerDeath()
+end
+
 -------------- ANIMATIONS ------------------
 
 function Skipanim(anim)
@@ -181,7 +236,7 @@
 	table.insert(dialog01, {func = AnimSay, args = {runner.gear, loc("Let's go!"), SAY_SAY, 2000}})
 	table.insert(dialog01, {func = ShowMission, args = goals[dialog01]})
 	table.insert(dialog01, {func = moveRunner, args = {}})
-	-- DIALOG 02 - Hog Solo story
+	-- DIALOG 02 - Professor Hogevil story
 	AddSkipFunction(dialog02, Skipanim, {dialog02})
 	table.insert(dialog02, {func = AnimWait, args = {hero.gear, 3200}})
 	table.insert(dialog02, {func = AnimCaption, args = {hero.gear, loc("The truth about Professor Hogevil"), 5000}})
@@ -201,9 +256,10 @@
 ------------- other functions ---------------
 
 function isHeroNextToRunner()
-	if GetGearType(hero.gear) == gtHedgehog and GetGearType(runner.gear) == gtHedgehog and
+	if IsHogAlive(hero.gear) and IsHogAlive(runner.gear) and
 			math.abs(GetX(hero.gear) - GetX(runner.gear)) < 75 and
-			math.abs(GetY(hero.gear) - GetY(runner.gear)) < 75 and StoppedGear(hero.gear) then
+			math.abs(GetY(hero.gear) - GetY(runner.gear)) < 75 and
+			StoppedGear(hero.gear) and StoppedGear(runner.gear) then
 		return true
 	end
 	return false
@@ -218,13 +274,9 @@
 		AddAnim(dialog02)
 
 		-- Update time record
-		local baseTime = 0
-		for i=1, #runner.places do
-			baseTime = baseTime + runner.places[i].turnTime
-		end
-		winningTime = baseTime - TurnTimeLeft
+		winningTime = runnerTimeTotal - TurnTimeLeft
+		SetTeamLabel(teamA.name, string.format(loc("%.3fs"), winningTime/1000))
 		SendStat(siCustomAchievement, string.format(loc("You have managed to catch the blue hedgehog in %.3f seconds."), winningTime/1000))
-		local record = tonumber(GetCampaignVar("FastestBlueHogCatch"))
 		if record ~= nil and winningTime >= record then
 			SendStat(siCustomAchievement, string.format(loc("Your personal best time so far: %.3f seconds"), record/1000))
 		end
@@ -242,11 +294,11 @@
 		end
 		AddAmmo(hero.gear, amRope, 1)
 		if currentPosition ~= 1 then
-			PlaySound(sndVictory)
 			if currentPosition > 1 and currentPosition < 4 then
 				AnimCaption(hero.gear, loc("Go, get him again!"), 3000)
 				AnimSay(runner.gear, loc("You got me!"), SAY_SAY, 3000)
 			end
+			runnerCaught = true
 			previousTimeLeft = TurnTimeLeft
 		end
 		currentPosition = currentPosition + 1
@@ -257,19 +309,44 @@
 end
 
 function lose()
+	if lostGame then
+		return
+	end
+	lostGame = true
 	SendStat(siGameResult, loc("Too slow! Try again ..."))
 	SendStat(siCustomAchievement, loc("You have to catch the other hog 3 times."))
 	SendStat(siCustomAchievement, loc("The time that you have left when you reach the blue hedgehog will be added to the next turn."))
 	SendStat(siCustomAchievement, loc("Each turn you'll have only one rope to use."))
 	SendStat(siCustomAchievement, loc("You'll lose if you die or if your time is up."))
-	sendSimpleTeamRankings({teamB.name, teamA.name})
+	SendStat(siPointType, "!TIME")
+	SendStat(siPlayerKills, tostring(runnerTimeTotal), teamB.name)
+	SendStat(siPointType, "!EMPTY")
+	SendStat(siPlayerKills, "0", teamA.name)
+	EndGame()
+end
+
+function loseRunnerDeath()
+	if lostGame then
+		return
+	end
+	lostGame = true
+	SendStat(siGameResult, loc("Race failed!"))
+	SendStat(siCustomAchievement, loc("The other hog has died, he should have survived!"))
+	SendStat(siCustomAchievement, loc("You have to catch the other hog 3 times."))
+	SendStat(siTeamRank, "1")
+	SendStat(siPlayerKills, tostring(GetTeamStats(teamB.name).Kills), teamB.name)
+	SendStat(siTeamRank, "1")
+	SendStat(siPlayerKills, tostring(GetTeamStats(teamA.name).Kills), teamA.name)
 	EndGame()
 end
 
 function win()
 	SendStat(siGameResult, loc("Congratulations, you are the fastest!"))
 	-- siCustomAchievements were added earlier
-	sendSimpleTeamRankings({teamA.name, teamB.name})
+	SendStat(siPointType, "!TIME")
+	SendStat(siPlayerKills, tostring(winningTime), teamA.name)
+	SendStat(siPointType, "!TIME")
+	SendStat(siPlayerKills, tostring(runnerTimeTotal), teamB.name)
 	SaveCampaignVar("Mission13Won", "true")
 	checkAllMissionsCompleted()
 	EndGame()
--- a/share/hedgewars/Data/Missions/Challenge/Basic_Training_-_Sniper_Rifle.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Challenge/Basic_Training_-_Sniper_Rifle.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -13,6 +13,7 @@
 -- about translations.
 -- We can use the function loc(text) to localize a string.
 
+HedgewarsScriptLoad("/Scripts/Utils.lua")
 HedgewarsScriptLoad("/Scripts/Locale.lua")
 
 -- This variable will hold the number of destroyed targets.
@@ -52,7 +53,7 @@
 local delayedTargetTargetX, delayedTargetY
 
 -- Team name of the player's team
-local playerTeamName = loc("Sniperz")
+local playerTeamName
 
 -- This is a custom function to make it easier to
 -- spawn more targets with just one line of code
@@ -123,8 +124,6 @@
 	MinesNum = 0
 	-- The number of explosives being placed
 	Explosives = 0
-	-- The delay between each round
-	Delay = 0
 	-- The map to be played
 	Map = "Ropes"
 	-- The theme to be used
@@ -134,10 +133,10 @@
 	HealthDecrease = 0
 
 	-- Create the player team
-	AddTeam(playerTeamName, -1, "Simple", "Island", "Default", "cm_crosshair")
+	playerTeamName = AddMissionTeam(-1)
 	-- And add a hog to it
-	player = AddHog(loc("Hunter"), 0, 1, "Sniper")
-	SetGearPosition(player, 602, 1465)
+	player = AddMissionHog(1)
+	SetGearPosition(player, 602, 1488)
 end
 
 -- This function is called when the round starts
@@ -149,13 +148,16 @@
 	-- Spawn the first target.
 	spawnTarget(860,1020)
 
+	local highscore = getReadableChallengeRecord("Highscore")
 	-- Show some nice mission goals.
 	-- Parameters are: caption, sub caption, description,
 	-- extra text, icon and time to show.
 	-- A negative icon parameter (-n) represents the n-th weapon icon
 	-- A positive icon paramter (n) represents the (n+1)-th mission icon
 	-- A timeframe of 0 is replaced with the default time to show.
-	ShowMission(loc("Sniper Training"), loc("Aiming Practice"), loc("Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."), -amSniperRifle, 0)
+	ShowMission(loc("Sniper Training"), loc("Aiming Practice"),
+	loc("Eliminate all targets before your time runs out.|You have unlimited ammo for this mission.")
+	.. "|" .. highscore, -amSniperRifle, 0)
 
 	-- Displayed initial player score
 	SetTeamLabel(playerTeamName, "0")
@@ -174,9 +176,6 @@
 	-- will be at "0 ms" right at the start of the game.
 	if TurnTimeLeft < 40 and TurnTimeLeft > 0 and score < score_goal and game_lost == false then
 		game_lost = true
-		-- ... and show a short message.
-		AddCaption(loc("Time's up!"))
-		ShowMission(loc("Sniper Training"), loc("Aiming Practice"), loc("Oh no! Time's up! Just try again."), -amSkip, 0)
 		-- and generate the stats and go to the stats screen
 		generateStats()
 		EndGame()
@@ -191,12 +190,11 @@
 			-- ... end the game ...
 			generateStats()
 			EndGame()
-		else
-			-- ... or just lower the timer by 1.
-			-- Reset the time left to stop the timer
-			SetTurnTimeLeft(time_goal)
+			if score == score_goal then
+				SetState(CurrentHedgehog, gstWinner)
+			end
 		end
-        end_timer = end_timer - 20
+        	end_timer = end_timer - 20
 	end
 end
 
@@ -305,6 +303,9 @@
 			elseif score == 9 then
 				spawnTarget(2930,1500)
 			elseif score == 10 then
+				-- The "tricky" target.
+				-- It spawns behind a wall
+				-- and needs at least 2 shots.
 				AddCaption(loc("This one's tricky."));
 				spawnTarget(700,720)
 			elseif score == 11 then
@@ -383,13 +384,21 @@
 				AddCaption(loc("Last Target!"));
 				spawnTarget(3480,1200)
 			end
-		else
-			if not game_lost then
+		elseif not game_lost then
 			-- Victory!
+			SaveMissionVar("Won", "true")
 			AddCaption(loc("Victory!"), capcolDefault, capgrpGameState)
 			ShowMission(loc("Sniper Training"), loc("Aiming Practice"), loc("Congratulations! You've eliminated all targets|within the allowed time frame."), 0, 0)
-			-- Also let the hogs shout "victory!"
-			PlaySound(sndVictory, CurrentHedgehog)
+			-- Play voice
+			if shots-1 <= score then
+				-- Flawless victory condition: Only 1 shot more than targets
+				-- (1 shot per "normal" target + 2 shots for the "tricky" target)
+				PlaySound(sndFlawless, CurrentHedgehog)
+			else
+				-- "Normal" victory
+				PlaySound(sndVictory, CurrentHedgehog)
+			end
+
 			FollowGear(CurrentHedgehog)
 
 			-- Unselect sniper rifle and disable hog controls
@@ -399,7 +408,9 @@
 
 			-- Save the time left so we may keep it.
 			time_goal = TurnTimeLeft
-			end
+
+			-- Freeze the clock because the challenge has been completed
+			SetTurnTimePaused(true)
 		end
 		SetTeamLabel(playerTeamName, getTargetScore())
 	end
@@ -408,31 +419,44 @@
 -- This function calculates the final score of the player and provides some texts and
 -- data for the final stats screen
 function generateStats()
-	local accuracy = 0
+	local accuracy
+	local accuracy_int
 	if shots > 0 then
+		-- NOTE: 100% accuracy is not possible due to the "tricky" target.
 		accuracy = (score/shots)*100
+		accuracy_int = div(score*100, shots)
 	end
 	local end_score_targets = getTargetScore()
 	local end_score_overall
 	if not game_lost then
 		local end_score_time = math.ceil(time_goal/5)
-		local end_score_accuracy = math.ceil(accuracy * 100)
+		local end_score_accuracy = 0
+		if shots > 0 then
+			end_score_accuracy = math.ceil(accuracy * 100)
+		end
 		end_score_overall = end_score_time + end_score_targets + end_score_accuracy
 		SetTeamLabel(playerTeamName, tostring(end_score_overall))
 
 		SendStat(siGameResult, loc("You have successfully finished the sniper rifle training!"))
 		SendStat(siCustomAchievement, string.format(loc("You have destroyed %d of %d targets (+%d points)."), score, score_goal, end_score_targets))
 		SendStat(siCustomAchievement, string.format(loc("You have made %d shots."), shots))
-		SendStat(siCustomAchievement, string.format(loc("Accuracy bonus: +%d points"), end_score_accuracy))
+		if end_score_accuracy > 0 then
+			SendStat(siCustomAchievement, string.format(loc("Accuracy bonus: +%d points"), end_score_accuracy))
+		end
 		SendStat(siCustomAchievement, string.format(loc("You had %.2fs remaining on the clock (+%d points)."), (time_goal/1000), end_score_time))
+
+		if(shots > 0) then
+			updateChallengeRecord("AccuracyRecord", accuracy_int)
+		end
 	else
-		SendStat(siGameResult, loc("You lose!"))
+		SendStat(siGameResult, loc("Challenge over!"))
 
 		SendStat(siCustomAchievement, string.format(loc("You have destroyed %d of %d targets (+%d points)."), score, score_goal, end_score_targets))
 		SendStat(siCustomAchievement, string.format(loc("You have made %d shots."), shots))
 		end_score_overall = end_score_targets
 	end
-	SendStat(siPointType, loc("points"))
+	SendStat(siPointType, "!POINTS")
 	SendStat(siPlayerKills, tostring(end_score_overall), playerTeamName)
+	updateChallengeRecord("Highscore", end_score_overall)
 end
 
--- a/share/hedgewars/Data/Missions/Challenge/Challenge_-_Speed_Shoppa_-_Hedgelove.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Challenge/Challenge_-_Speed_Shoppa_-_Hedgelove.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -2,11 +2,6 @@
 
 local params = {}
 params.missionTitle = loc("Shoppa Love")
-params.teamName = loc("Team of Hearts")
-params.hogName = loc("Heartful")
-params.teamFlag = "cm_heart"
-params.teamGrave = "heart"
-params.hogHat = "pinksunhat"
 params.crateType = "health"
 params.faceLeft = true
 
@@ -15,7 +10,7 @@
 params.theme = "Nature"
 
 params.hog_x = 410
-params.hog_y = 934
+params.hog_y = 983
 params.crates = {
 	{ x = 183, y = 710 },
 	{ x = 202, y = 519 },
--- a/share/hedgewars/Data/Missions/Challenge/Challenge_-_Speed_Shoppa_-_Ropes.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Challenge/Challenge_-_Speed_Shoppa_-_Ropes.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -2,17 +2,14 @@
 
 local params = {}
 params.missionTitle = loc("Ropes and Crates")
-params.teamName = loc("Shoppa Union")
-params.hogName = loc("Hook")
-params.teamFlag = "cm_shoppa"
-params.hogHat = "NoHat"
+params.faceLeft = true
 
 params.time = 115000
 params.map = "Ropes"
 params.theme = "City"
 
 params.hog_x = 3754
-params.hog_y = 1742
+params.hog_y = 1779
 params.crates = {
 	{ x = 3533, y = 1404 },
 	{ x = 3884, y = 1048 },
--- a/share/hedgewars/Data/Missions/Challenge/Challenge_-_Speed_Shoppa_-_ShoppaKing.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Challenge/Challenge_-_Speed_Shoppa_-_ShoppaKing.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -2,11 +2,6 @@
 
 local params = {}
 params.missionTitle = loc("The Customer is King")
-params.teamName = loc("Shoppa Union")
-params.hogName = loc("King Customer")
-params.teamFlag = "cm_shoppa"
-params.teamGrave = "money"
-params.hogHat = "crown"
 
 params.time = 160000
 params.map = "ShoppaKing"
--- a/share/hedgewars/Data/Missions/Challenge/ClimbHome.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Challenge/ClimbHome.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -23,8 +23,8 @@
     Explosives = 0
     MineDudPercent = 0
     Map = "ClimbHome"
-    AddTeam(loc("Lonely Hog"), -1, "bubble", "Island", "Default")
-    player = AddHog(loc("Climber"), 0, 1, "NoHat")
+    AddMissionTeam(-1)
+    player = AddMissionHog(1)
     if showWaterStats then
         dummyHog = AddHog(" ", 0, 1, "NoHat")
         HH[dummyHog] = nil
--- a/share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Bazooka_easy.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Bazooka_easy.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -9,10 +9,8 @@
 	map = "Lonely_Island",
 	theme = "Island",
 	hog_x = 1439,
-	hog_y = 482,
-	hogName = loc("Zook"),
-	hogHat = "war_americanww2helmet",
-	teamName = loc("Team Zook"),
+	hog_y = 511,
+	faceLeft = true,
 	targets = {
 		{ x = 1310, y = 756 },
 		{ x = 1281, y = 893 },
--- a/share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Bazooka_hard.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Bazooka_hard.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -10,10 +10,7 @@
 	map = "SB_Grassy",
 	theme = "Castle",
 	hog_x = 2112,
-	hog_y = 913,
-	hogName = loc("Zook"),
-	hogHat = "war_americanww2helmet",
-	teamName = loc("Team Zook"),
+	hog_y = 935,
 	targets = {
 		{ x = 2660, y = 936 },
 		{ x = 2857, y = 629 },
--- a/share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Cluster_Bomb.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Cluster_Bomb.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -9,10 +9,8 @@
 	map = "Trash",
 	theme = "Golf",
 	hog_x = 756,
-	hog_y = 370,
-	hogName = loc("Private Nolak"),
-	hogHat = "war_desertgrenadier1",
-	teamName = loc("The Hogies"),
+	hog_y = 403,
+	faceLeft = true,
 	targets = {
 		{ x = 628, y = 0 },
 		{ x = 891, y = 0 },
--- a/share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Grenade_easy.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Grenade_easy.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -9,11 +9,8 @@
 	map = "SB_Crystal",
 	theme = "Cave",
 	hog_x = 2039,
-	hog_y = 684,
-	hogName = loc("Grenadier"),
-	hogHat = "war_desertgrenadier2",
-	teamName = loc("Grenade Group"),
-	teamFlag = "cm_grenade",
+	hog_y = 701,
+	faceLeft = true,
 	targets = {
 		{ x = 1834, y = 747 },
 		{ x = 2308, y = 729 },
--- a/share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Grenade_hard.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Grenade_hard.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -9,11 +9,8 @@
 	map = "SB_Crystal",
 	theme = "Cave",
 	hog_x = 1456,
-	hog_y = 669,
-	hogName = loc("Grenadier"),
-	hogHat = "war_desertgrenadier2",
-	teamName = loc("Grenade Group"),
-	teamFlag = "cm_grenade",
+	hog_y = 731,
+	faceLeft = true,
 	targets = {
 		{ x = 1190, y = 694 },
 		{ x = 962, y = 680 },
--- a/share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Homing_Bee.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Homing_Bee.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -8,10 +8,7 @@
 	map = "Hedgewars",
 	theme = "Nature",
 	hog_x = 1990,
-	hog_y = 514,
-	hogHat = "NoHat",
-	teamGrave = "bp2",
-	teamFlag = "cm_flower",
+	hog_y = 533,
 	targets = {
 		{ x = 1949, y = 273 },
 		{ x = 1734, y = 322 },
--- a/share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Shotgun.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Shotgun.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -8,10 +8,7 @@
 	map = "SB_Haunty",
 	theme = "Halloween",
 	hog_x = 320,
-	hog_y = 324,
-	hogHat = "NoHat",
-	hogGrave = "Bones",
-	teamFlag = "cm_crosshair",
+	hog_y = 347,
 	targets = {
 		{ x = 495, y = 501 },
 		{ x = 227, y = 530 },
--- a/share/hedgewars/Data/Missions/Challenge/User_Mission_-_RCPlane_Challenge.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Challenge/User_Mission_-_RCPlane_Challenge.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -1,7 +1,9 @@
+HedgewarsScriptLoad("/Scripts/Utils.lua")
 HedgewarsScriptLoad("/Scripts/Locale.lua")
 HedgewarsScriptLoad("/Scripts/Achievements.lua")
 
 local player = nil
+local playerTeamName = nil
 local RCGear = nil
 local planesUsed = 0
 local planeTimer = 0
@@ -34,27 +36,33 @@
 	MinesNum = 0
 	Explosives = 0
 
-	AddTeam(loc("Wannabe Flyboys"), -1, "Simple", "Island", "Default", "cm_scout")
-	player = AddHog(loc("Ace"), 0, 80, "Gasmask")
-	SetGearPosition(player, 1380, 1500)
+	playerTeamName = AddMissionTeam(-1)
+	player = AddMissionHog(80)
+	SetGearPosition(player, 1380, 1582)
+	HogTurnLeft(player, true)
 
 end
 
 
+local function spawnCrate(x, y)
+	local c = SpawnFakeHealthCrate(x, y, false, false)
+	SetGearValues(c, nil, nil, nil, nil, nil, 0) -- Karma
+end
 
 function onGameStart()
 
 	SendHealthStatsOff()
 
+	local recordInfo = getReadableChallengeRecord("Lowscore")
 	ShowMission     (
                                 loc("RC Plane Challenge"),
                                 loc("Challenge"),
 
                                 loc("Collect or destroy all the health crates.") .. "|" ..
                                 loc("Compete to use as few planes as possible!") .. "|" ..
-								"", -amRCPlane, 4000
+                                recordInfo, -amRCPlane, 4000
                                 )
-	SetTeamLabel(loc("Wannabe Flyboys"), "0")
+	SetTeamLabel(playerTeamName, "0")
 
 	PlaceGirder(2192, 508, 6)
 	PlaceGirder(2192, 670, 6)
@@ -142,25 +150,25 @@
 	PlaceGirder(2803, 1373, 2)
 	PlaceGirder(2811, 1559, 2)
 
-	SpawnFakeHealthCrate(930, 557, false, false)
-	SpawnFakeHealthCrate(979, 692, false, false)
-	SpawnFakeHealthCrate(876, 703, false, false)
-	SpawnFakeHealthCrate(2309, 1260, false, false)
-	SpawnFakeHealthCrate(1733, 1127, false, false)
-	SpawnFakeHealthCrate(1738, 1320, false, false)
-	SpawnFakeHealthCrate(3249, 1460, false, false)
-	SpawnFakeHealthCrate(3051, 617, false, false)
-	SpawnFakeHealthCrate(2972, 353, false, false)
-	SpawnFakeHealthCrate(2548, 358, false, false)
+	spawnCrate(930, 557)
+	spawnCrate(979, 692)
+	spawnCrate(876, 703)
+	spawnCrate(2309, 1260)
+	spawnCrate(1733, 1127)
+	spawnCrate(1738, 1320)
+	spawnCrate(3249, 1460)
+	spawnCrate(3051, 617)
+	spawnCrate(2972, 353)
+	spawnCrate(2548, 358)
 
-	SpawnFakeHealthCrate(2090, 1580, false, false)
-	SpawnFakeHealthCrate(1752, 1753, false, false)
-	SpawnFakeHealthCrate(1865, 1758, false, false)
-	SpawnFakeHealthCrate(1985, 1760, false, false)
-	SpawnFakeHealthCrate(2429, 1760, false, false)
-	SpawnFakeHealthCrate(2810, 1480, false, false)
-	SpawnFakeHealthCrate(2800, 1277, false, false)
-	SpawnFakeHealthCrate(2806, 1107, false, false)
+	spawnCrate(2090, 1580)
+	spawnCrate(1752, 1753)
+	spawnCrate(1865, 1758)
+	spawnCrate(1985, 1760)
+	spawnCrate(2429, 1760)
+	spawnCrate(2810, 1480)
+	spawnCrate(2800, 1277)
+	spawnCrate(2806, 1107)
 
 	PlaceGirder(1897, 903, 6)
 	PlaceGirder(1916, 784, 3)
@@ -231,26 +239,26 @@
 	PlaceGirder(3210, 179, 2)
 	PlaceGirder(2932, 181, 2)
 
-	SpawnFakeHealthCrate(3804, 1461, false, false)
-	SpawnFakeHealthCrate(3269, 1742, false, false)
-	SpawnFakeHealthCrate(3066, 121, false, false)
-	SpawnFakeHealthCrate(3207, 104, false, false)
-	SpawnFakeHealthCrate(2928, 103, false, false)
-	SpawnFakeHealthCrate(1997, 202, false, false)
-	SpawnFakeHealthCrate(2253, 159, false, false)
-	SpawnFakeHealthCrate(2132, 774, false, false)
-	SpawnFakeHealthCrate(2549, 490, false, false)
-	SpawnFakeHealthCrate(3527, 694, false, false)
-	SpawnFakeHealthCrate(3777, 78, false, false)
-	SpawnFakeHealthCrate(1124, 1746, false, false)
-	SpawnFakeHealthCrate(1056, 1740, false, false)
-	SpawnFakeHealthCrate(993, 1742, false, false)
-	SpawnFakeHealthCrate(799, 1298, false, false)
-	SpawnFakeHealthCrate(577, 1126, false, false)
-	SpawnFakeHealthCrate(596, 1463, false, false)
-	SpawnFakeHealthCrate(3854, 1043, false, false)
-	SpawnFakeHealthCrate(1944, 567, false, false)
-	SpawnFakeHealthCrate(338, 1748, false, false)
+	spawnCrate(3804, 1461)
+	spawnCrate(3269, 1742)
+	spawnCrate(3066, 121)
+	spawnCrate(3207, 104)
+	spawnCrate(2928, 103)
+	spawnCrate(1997, 202)
+	spawnCrate(2253, 159)
+	spawnCrate(2132, 774)
+	spawnCrate(2549, 490)
+	spawnCrate(3527, 694)
+	spawnCrate(3777, 78)
+	spawnCrate(1124, 1746)
+	spawnCrate(1056, 1740)
+	spawnCrate(993, 1742)
+	spawnCrate(799, 1298)
+	spawnCrate(577, 1126)
+	spawnCrate(596, 1463)
+	spawnCrate(3854, 1043)
+	spawnCrate(1944, 567)
+	spawnCrate(338, 1748)
 
 end
 
@@ -287,7 +295,7 @@
 	if GetGearType(gear) == gtRCPlane then
 		RCGear = gear
 		planesUsed = planesUsed + 1
-		SetTeamLabel(loc("Wannabe Flyboys"), tostring(planesUsed))
+		SetTeamLabel(playerTeamName, tostring(planesUsed))
 		planeTimer = 0
 		missiles = 0
 	end
@@ -407,6 +415,8 @@
 				SendStat(siGameResult, loc("You have finished the challenge!"))
 				SendStat(siCustomAchievement, string.format(loc("You have used %d RC planes."), planesUsed))
 			end
+			SaveMissionVar("Won", "true")
+			updateChallengeRecord("Lowscore", planesUsed)
 		
 			if(totalMissiles > 1) then
 				SendStat(siCustomAchievement, string.format(loc("You have dropped %d missiles."), totalMissiles))
@@ -434,12 +444,10 @@
                                 string.format(loc("Planes used: %d"), planesUsed) .. "|" ..
                                 "", 0, 0
                                 )
-			SetState(player, gstWinner)
 			PlaySound(sound, player)
 
-
-			DismissTeam(loc("Wannabe Flyboys"))
 			EndGame()
+			SetState(player, gstWinner)
 		end
 
 		if RCGear ~= nil then
--- a/share/hedgewars/Data/Missions/Challenge/User_Mission_-_Rope_Knock_Challenge.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Challenge/User_Mission_-_Rope_Knock_Challenge.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -1,7 +1,9 @@
+HedgewarsScriptLoad("/Scripts/Utils.lua")
 HedgewarsScriptLoad("/Scripts/Locale.lua")
 
 local hhs = {}
 local missionWon = nil
+local missionEndHandled = false
 local endTimer = 1000
 local hogsKilled = 0
 local finishTime
@@ -71,7 +73,7 @@
 
 				}
 
-local playerTeamName = loc("Wannabe Shoppsta")
+local playerTeamName
 
 function GetKillScore()
 	return math.ceil((hogsKilled / 16)*6000)
@@ -90,13 +92,15 @@
 	valkyriesTimer = -1
 	missionWon = false
 	ProtectEnemies()
-	ShowMission(loc("Rope-knocking Challenge"), loc("Challenge over!"), loc("Oh no! Just try again!"), -amSkip, 0)
 	SendStat(siGameResult, loc("Challenge over!"))
 	local score = GetKillScore()
 	SendStat(siCustomAchievement, string.format(loc("You have killed %d of 16 hedgehogs (+%d points)."), hogsKilled, score))
-	SendStat(siPointType, loc("points"))
+	SendStat(siPointType, "!POINTS")
 	SendStat(siPlayerKills, tostring(score), playerTeamName)
-	PlaySound(sndHellish)
+
+	-- Update highscore
+	updateChallengeRecord("Highscore", score)
+
 	EndGame()
 end
 
@@ -112,10 +116,13 @@
 
 	SendStat(siCustomAchievement, string.format(loc("You have killed %d of 16 hedgehogs (+%d points)."), hogsKilled, hogScore))
 	SendStat(siCustomAchievement, string.format(loc("You have completed this challenge in %.2f s (+%d points)."), completeTime, timeScore))
-	SendStat(siPointType, loc("points"))
+	SendStat(siPointType, "!POINTS")
 	SendStat(siPlayerKills, tostring(score), playerTeamName)
 	SetTeamLabel(playerTeamName, tostring(score))
 
+	-- Update highscore
+	updateChallengeRecord("Highscore", score)
+
 	if hhs[0] and GetHealth(hhs[0]) then
 		SetEffect(hhs[0], heInvulnerable, 1)
 	end
@@ -154,7 +161,6 @@
 	GameFlags = gfBorder + gfSolidLand
 
 	TurnTime = 180 * 1000
-	Delay = 500
 	Map = "Ropes"
 	Theme = "Eyes"
 
@@ -166,9 +172,8 @@
 	MinesNum = 0
 	Explosives = 0
 
-	AddTeam(playerTeamName, -1, "money", "Island", "Default", "cm_shoppa")
-	hhs[0] = AddHog(loc("Ace"), 0, 1, "Gasmask")
-	SetGearPosition(player, 1380, 1500)
+	playerTeamName = AddMissionTeam(-1)
+	hhs[0] = AddMissionHog(1)
 
 	AddTeam(loc("Unsuspecting Louts"), -2, "Simple", "Island", "Default", "cm_face")
 	for i = 1, 8 do
@@ -188,11 +193,17 @@
 function onGameStart()
 	SendHealthStatsOff()
 
+	local recordInfo = getReadableChallengeRecord("Highscore")
+	if recordInfo == nil then
+		recordInfo = ""
+	else
+		recordInfo = "|" .. recordInfo
+	end
 	ShowMission     (
                         loc("Rope-knocking Challenge"),
                         loc("Challenge"),
                         loc("Use the rope to knock your enemies to their doom.") .. "|" ..
-                        loc("Finish this challenge as fast as possible to earn bonus points."),
+                        loc("Finish this challenge as fast as possible to earn bonus points.").. recordInfo,
                         -amRope, 4000)
 	SetTeamLabel(playerTeamName, "0")
 
@@ -215,6 +226,7 @@
 	SetGearPosition(hhs[14], 3360, 659)
 	SetGearPosition(hhs[15], 3885, 285)
 	SetGearPosition(hhs[16], 935, 1160)
+	HogTurnLeft(hhs[0], true)
 
 	for i = 1, 16 do
 		AssignCharacter(i)
@@ -235,10 +247,12 @@
 			EndGame()
 		end
 
-		if missionWon == true then
-			AddCaption(loc("Victory!"), capcolDefault, capgrpGameState)
-		else
-			AddCaption(loc("Challenge over!"), capcolDefault, capgrpGameState)
+		if not missionEndHandled then
+			if missionWon == true then
+				SaveMissionVar("Won", "true")
+				AddCaption(loc("Victory!"), capcolDefault, capgrpGameState)
+			end
+			missionEndHandled = true
 		end
 
 	end
--- a/share/hedgewars/Data/Missions/Challenge/User_Mission_-_That_Sinking_Feeling.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Challenge/User_Mission_-_That_Sinking_Feeling.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -1,9 +1,11 @@
 
 
 HedgewarsScriptLoad("/Scripts/Locale.lua")
+HedgewarsScriptLoad("/Scripts/Utils.lua")
 HedgewarsScriptLoad("/Scripts/Achievements.lua")
 
 local player
+local playerTeamName, haplessTeamName
 local hh = {}
 local hhCount = 8
 local GameOver = false
@@ -15,6 +17,17 @@
 local watGear = nil
 local cinematic = false
 
+function printMission()
+	local highscore = tonumber(GetMissionVar("Highscore"))
+	local show = (type(highscore) == "number") and (highscore > 0)
+	local recordInfo = ""
+	if show then
+		recordInfo = getReadableChallengeRecord("Highscore")
+	end
+	ShowMission(loc("That Sinking Feeling"), loc("Challenge"), loc("Save as many hogs as possible!")
+	.. "|" .. recordInfo, 10, 0)
+end
+
 -- allow skipping of the intro via hitting precise key
 function onPrecise()
 	if introStage < 100 then
@@ -22,7 +35,7 @@
 		genCounter = 0
 		FollowGear(CurrentHedgehog)
 		AddCaption(loc("Good luck out there!"))
-		ShowMission(loc("That Sinking Feeling"), loc("Challenge"), loc("Save as many hapless hogs as possible!"), 4, 0)
+		printMission()
 		SetInputMask(0xFFFFFFFF)
 	end
 end
@@ -36,12 +49,12 @@
 	MinesNum = 0
 	MinesTime  = 3000
 	Explosives = 0
-	Delay = 10
 	Map = "Islands"
 	Theme = "City"
-	SuddenDeathTurns = 1
+	HealthDecrease = 0
+	WaterRise = 0
 
-	AddTeam(loc("Hapless Hogs"), -1, "Simple", "Island", "Default")
+	haplessTeamName = AddTeam(loc("Hapless Hogs"), -1, "Simple", "Island", "Default_qau")
 	hh[0] = AddHog(loc("Sinky"), 1, 100, "fr_lemon")
 	hh[1] = AddHog(loc("Drowner"), 1, 100, "fr_orange")
 	hh[2] = AddHog(loc("Heavy"), 1, 100, "dish_Teapot")
@@ -51,8 +64,9 @@
 	hh[6] = AddHog(loc("Sponge"), 1, 100, "sf_chunli")
 	hh[7] = AddHog(loc("Deadweight"), 1, 100, "dish_Teacup")
 
-	AddTeam(loc("Nameless Heroes"), -1, "Simple", "Island", "Default", "cm_crossedswords")
-	player = AddHog(loc("The Nameless One"), 0, 1, "NoHat")
+	playerTeamName = AddMissionTeam(-1)
+	player = AddMissionHog(1)
+	HogTurnLeft(player, false)
 
 	SetGearPosition(player, 3992, 733)
 	SetGearPosition(hh[0], 938, 1369)
@@ -70,11 +84,12 @@
 
 
 function onGameStart()
-    cinematic = true
-    SetCinematicMode(true)
+	cinematic = true
+	SetCinematicMode(true)
 	SendHealthStatsOff()
 
-	ShowMission(loc("That Sinking Feeling"), loc("Challenge"), loc("Save as many hapless hogs as possible!"), 4, 1)
+	printMission()
+	HideMission()
 
 	HogTurnLeft(hh[0], false)
 	HogTurnLeft(hh[1], true)
@@ -200,7 +215,7 @@
 			if genCounter == 2000 then
 				introStage = 110
 				FollowGear(CurrentHedgehog)
-				ShowMission(loc("That Sinking Feeling"), loc("User Challenge"), loc("Save as many hapless hogs as possible!"), 4, 0)
+				ShowMission(loc("That Sinking Feeling"), loc("User Challenge"), loc("Save as many hogs as possible!"), 10, 0)
 				SetInputMask(0xFFFFFFFF)
 			end
 
@@ -227,8 +242,8 @@
 				GameOver = true
 				AddCaption(loc("The flood has stopped! Challenge over."))
 				SendStat(siGameResult, loc("Challenge completed!"))
-				SendStat(siPointType, loc("rescues"))
-				SendStat(siPlayerKills, tostring(hhCount), loc("Nameless Heroes"))
+				SendStat(siPointType, "!POINTS")
+				SendStat(siPlayerKills, tostring(hhCount), playerTeamName)
 
 				-- Do not count drowning hedgehogs
 				local hhLeft = hhCount
@@ -239,12 +254,19 @@
 					end
 				end
 
-				SendStat(siCustomAchievement, string.format(loc("You saved %d of 8 Hapless Hogs."), hhLeft))
+				SendStat(siCustomAchievement, string.format(loc("You saved %d of 8 hegehogs."), hhLeft))
+
+				-- Update highscore
+				updateChallengeRecord("Highscore", hhLeft)
 
 				if hhLeft == 8 then
+					SaveMissionVar("Won", "true")
 					awardAchievement(loc("Lively Lifeguard"))
 				end
 				EndGame()
+				for _, hog in pairs(hh) do
+					SetState(hog, gstWinner)
+				end
 
 			end
 
@@ -275,25 +297,28 @@
 function onGearDelete(gear)
 
 	if GetGearType(gear) == gtHedgehog then
-		if GetHogTeamName(gear) == loc("Hapless Hogs") then
+		if GetHogTeamName(gear) == haplessTeamName then
 			hhCount = hhCount - 1
-			AddCaption(string.format(loc("%d Hapless Hogs left"), hhCount))
+			AddCaption(string.format(loc("Hedgehogs left: %d"), hhCount))
 		end
 	end
 
 	if ((gear == player) or (hhCount == 0)) and (GameOver == false) then
 		SetHealth(player, 0)
-		AddCaption(loc("Disqualified!"))
+		AddCaption(loc("Challenge failed!"))
 		if gear == player then
 			SendStat(siCustomAchievement, loc("Your hedgehog died!"))
 			SendStat(siCustomAchievement, loc("You must survive the flood in order to score."))
 		else
 			SendStat(siCustomAchievement, loc("You haven't rescued anyone."))
 		end
-		SendStat(siPointType, loc("points"))
-		SendStat(siPlayerKills, "0", loc("Nameless Heroes"))
+		SendStat(siPointType, "!POINTS")
+		SendStat(siPlayerKills, "0", playerTeamName)
+		local highscore = tonumber(GetMissionVar("Highscore"))
+		show = (type(highscore) == "number") and (highscore > 0)
+		updateChallengeRecord("Highscore", 0, show)
 
-		SendStat(siGameResult, loc("Disqualified!"))
+		SendStat(siGameResult, loc("Challenge failed!"))
 		GameOver = true
 		EndGame()
 	end
--- a/share/hedgewars/Data/Missions/Scenario/Bazooka_Battlefield.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Scenario/Bazooka_Battlefield.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -14,24 +14,16 @@
 		[amBazooka] = { count = 9 },
 	},
 	teams = {
-		{ name = loc("Pincer Knights"),
-		flag = "cm_swordshield",
-		grave = "Grave",
+		{ isMissionTeam = true,
 		hogs = {
 			{
-			name = loc("Left Tong"),
 			health = 100,
 			x = 276, y = 825,
-			botLevel = 0,
-			hat = "knight",
 			ammo = { [amSwitch] = 100 },
 			},
 			{
-			name = loc("Right Tong"),
 			health = 100,
 			x = 1794, y = 716,
-			botLevel = 0,
-			hat = "knight",
 			faceLeft = true,
 			},
 		}, },
--- a/share/hedgewars/Data/Missions/Scenario/Big_Armory.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Scenario/Big_Armory.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -28,16 +28,12 @@
 		* relevant GameFlag: gfDisableLandObjects ]]
 	},
 	teams = {
-		{ name = loc("Pro Killers"),
+		{ isMissionTeam = true,
 		clanID = 0,
-		flag = "cm_scout",
-		grave = "Bone",
 		hogs = {
 			{
-			name = loc("Ultrasoldier"),
 			health = 100,
-			x = 543, y = 1167,
-			hat = "Terminator_Glasses",
+			x = 543, y = 1198,
 			ammo = heroAmmo,
 			}
 		}, },
@@ -47,14 +43,14 @@
 		flag = "cm_galaxy",
 		grave = "Earth",
 		hogs = {
-			{name=loc("Rocket"), x=796, y=1184, faceLeft=true},
-			{name=loc("Star"), x=733, y=1525, faceLeft=true},
-			{name=loc("Asteroid"), x=738, y=1855, faceLeft=true},
-			{name=loc("Comet"), x=937, y=1318, faceLeft=true},
-			{name=loc("Sunflame"), x=3424, y=1536},
-			{name=loc("Eclipse"), x=3417, y=1081},
-			{name=loc("Jetpack"), x=2256, y=1246},
-			{name=loc("Void"), x=1587, y=1231, faceLeft=true},
+			{name=loc("Rocket"), x=796, y=1208, faceLeft=true},
+			{name=loc("Star"), x=733, y=1546, faceLeft=true},
+			{name=loc("Asteroid"), x=738, y=1887, faceLeft=true},
+			{name=loc("Comet"), x=937, y=1344, faceLeft=true},
+			{name=loc("Sunflame"), x=3424, y=1555},
+			{name=loc("Eclipse"), x=3417, y=1119},
+			{name=loc("Jetpack"), x=2256, y=1280},
+			{name=loc("Void"), x=1587, y=1265, faceLeft=true},
 		}, },
 	},
 	customNonGoals = {
--- a/share/hedgewars/Data/Missions/Scenario/Tentacle_Terror.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Scenario/Tentacle_Terror.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -16,16 +16,12 @@
 	},
 	wind = -50,
 	teams = {
-		{ name = loc("Hell Army"),
-		flag = "cm_hellish",
-		grave = "Simple_reversed",
+		{ isMissionTeam = true,
 		hogs = { {
-			name = loc("Lord Evil"),
 			faceLeft = true,
 			health = 30,
 			x = 1210, y = 1446,
-			hat = "Evil",
-			botLevel = 0 } }
+			} }
 		},
 		{ name = loc("Heavenly Defense"),
 		flag = "cm_fcw",
--- a/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Bamboo_Thicket.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Bamboo_Thicket.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -2,6 +2,7 @@
 HedgewarsScriptLoad("/Scripts/Locale.lua")
 HedgewarsScriptLoad("/Scripts/Achievements.lua")
 
+local playerTeamName
 local player = nil 
 local enemy = nil
 local firedShell = false
@@ -24,10 +25,10 @@
 	WaterRise = 0
 	GameFlags = gfDisableWind
 
-	AddTeam(loc("Pathetic Resistance"), -1, "Plinko", "Island", "Default", "cm_yinyang")
-	player = AddHog(loc("Ikeda"), 0, 10, "StrawHat")
+	playerTeamName = AddMissionTeam(-1)
+	player = AddMissionHog(10)
 			
-	AddTeam(loc("Cybernetic Empire"), -6, "ring", "Island", "Robot", "cm_cyborg")
+	AddTeam(loc("Cybernetic Empire"), -6, "ring", "Island", "Robot_qau", "cm_cyborg")
 	enemy = AddHog(loc("Unit 835"), 1, 10, "cyborg1")
 
 	SetGearPosition(player,142,656)
@@ -75,18 +76,19 @@
 
 end
 
-function onGearDelete(gear)
+function onGameResult(winner)
 
-	if (gear == enemy) then
+	if (winner == GetTeamClan(playerTeamName)) then
 		
-		ShowMission(loc("Bamboo Thicket"), loc("MISSION SUCCESSFUL"), loc("Congratulations!"), 0, 0)
+		SaveMissionVar("Won", "true")
+		SendStat(siGameResult, loc("Mission succeeded!"))
 		
 		if (turnNumber < 6) and (firedShell == false) then
 			awardAchievement(loc("Energetic Engineer"))
 		end
 
-	elseif gear == player then
-		ShowMission(loc("Bamboo Thicket"), loc("MISSION FAILED"), loc("Oh no! Just try again!"), -amSkip, 0)
+	else
+		SendStat(siGameResult, loc("Mission failed!"))
 	end
 
 end
--- a/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Dangerous_Ducklings.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Dangerous_Ducklings.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -3,6 +3,7 @@
 HedgewarsScriptLoad("/Scripts/Achievements.lua")
 
 local player = nil -- This variable will point to the hog's gear
+local playerTeamName, enemyTeamName = nil, nil
 local instructor = nil
 local enemy = nil
 
@@ -24,18 +25,17 @@
 	CaseFreq = 0 -- The frequency of crate drops
 	MinesNum = 0 -- The number of mines being placed
 	Explosives = 0 -- The number of explosives being placed
-	Delay = 0 -- The delay between each round
 	Map = "Bath" -- The map to be played
 	Theme = "Bath" -- The theme to be used
 	-- Disable Sudden Death
 	HealthDecrease = 0
 	WaterRise = 0
 
-	AddTeam(loc("Bloody Rookies"), -1, "Rubberduck", "Island", "Default", "cm_duckhead")
-	player = AddHog(loc("Hunter"), 0, 1, "NoHat")
+	playerTeamName = AddMissionTeam(-1)
+	player = AddMissionHog(1)
 	instructor = AddHog(loc("Instructor"), 0, 100, "sf_vega")
 
-	AddTeam(loc("Blue Team"), -2, "bubble", "Island", "Default", "somalia")
+	enemyTeamName = AddTeam(loc("Blue Team"), -2, "bubble", "Island", "Default_qau", "somalia")
 	enemy = AddHog(loc("Filthy Blue"), 1, 100, "Skull")
 
 	SetGearPosition(player,146,902)
@@ -55,7 +55,7 @@
 
 	FollowGear(player)
 
-	ShowMission(loc("Dangerous Ducklings"), loc("Scenario"), loc("Eliminate the Blue Team before the time runs out."), -amRope, 5000);
+	ShowMission(loc("Dangerous Ducklings"), loc("Scenario"), loc("Eliminate the enemy before the time runs out."), -amRope, 5000);
 
 end
 
@@ -113,11 +113,9 @@
 		endTimer = endTimer + 1
 		if (CurrentHedgehog ~= nil) and (CurrentHedgehog == instructor) then
 			if endTimer >= 3000 then
-				--SetHealth(instructor,0)
 				SetTurnTimeLeft(1)
-				DismissTeam(loc("Bloody Rookies"))
+				DismissTeam(playerTeamName)
 			end
-			ShowMission(loc("Dangerous Ducklings"), loc("MISSION FAILED"), loc("You've failed. Try again."), -amRope, 5000);
 		end
 	end
 
@@ -138,7 +136,7 @@
 			HogSay(player, loc("See ya!"), SAY_THINK)
 			Retreat(3000)
 			awardAchievement(loc("Naughty Ninja"))
-			DismissTeam(loc("Blue Team"))
+			DismissTeam(enemyTeamName)
 			gameWon = true
 		elseif gear == enemy then
 			HogSay(player, loc("Enjoy the swim..."), SAY_THINK)
@@ -148,3 +146,12 @@
 
 	end
 end
+
+function onGameResult(winner)
+	if winner == GetTeamClan(playerTeamName) then
+		SaveMissionVar("Won", "true")
+		SendStat(siGameResult, loc("Mission succeeded!"))
+	else
+		SendStat(siGameResult, loc("Mission failed!"))
+	end
+end
--- a/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Diver.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Diver.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -1,6 +1,7 @@
 
 HedgewarsScriptLoad("/Scripts/Locale.lua")
 
+local playerTeamName
 local player = nil -- This variable will point to the hog's gear
 local enemy = nil
 
@@ -19,7 +20,6 @@
 	MinesNum = 0 -- The number of mines being placed
 	MinesTime  = 1000
 	Explosives = 0 -- The number of explosives being placed
-	Delay = 10 -- The delay between each round
 	Map = "Hydrant" -- The map to be played
 	Theme = "City" -- The theme to be used
 
@@ -27,10 +27,10 @@
 	HealthDecrease = 0
 	WaterRise = 0
 
-	AddTeam(loc("Bloody Rookies"), -1, "deadhog", "Island", "Default", "cm_eyes")
-	player = AddHog(loc("Hunter"), 0, 1, "NoHat")
+	playerTeamName = AddMissionTeam(-1)
+	player = AddMissionHog(1)
 			
-	AddTeam(loc("Toxic Team"), -6, "skull", "Island", "Default", "cm_magicskull")
+	AddTeam(loc("Toxic Team"), -6, "skull", "Island", "Default_qau", "cm_magicskull")
 	enemy = AddHog(loc("Poison"), 1, 100, "Skull")
 
 	SetGearPosition(player,430,516)
@@ -95,12 +95,14 @@
 
 end
 
-function onGearDelete(gear)
+function onGameResult(winner)
 
-	if (gear == enemy) and (GameOver == false) then
-		ShowMission(loc("Diver"), loc("MISSION SUCCESSFUL"), loc("Congratulations!"), 0, 0)
-	elseif gear == player then
-		ShowMission(loc("Diver"), loc("MISSION FAILED"), loc("Oh no! Just try again!"), -amSkip, 0)		
+	if winner == GetTeamClan(playerTeamName) then
+		SendStat(siGameResult, loc("Mission succeeded!"))
+		SaveMissionVar("Won", "true")
+		GameOver = true
+	else
+		SendStat(siGameResult, loc("Mission failed!"))
 		GameOver = true
 	end
 
--- a/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Newton_and_the_Hammock.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Newton_and_the_Hammock.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -13,19 +13,17 @@
 		MapFeatureSize = 12,
 	},
 	teams = {
-		{ name = loc("Pathetic Resistance"),
+		{ isMissionTeam = true,
 		clanID = 0,
-		flag = "cm_yinyang",
-		grave = "Plinko",
 		hogs = {
-			{name = loc("Ikeda"), health = 48, x = 397, y = 865, hat = "StrawHat"}
+			{health = 48, x = 397, y = 865}
 		}, },
 
 		{ name = loc("Cybernetic Empire"),
 		clanID = 5,
 		flag = "cm_cyborg",
 		grave = "ring",
-		voice = "Robot",
+		voice = "Robot_qau",
 		hogs = {
 			{name=loc("Unit 881"), x=561, y=1365, health=100, hat="cyborg1", botLevel=1,
 			ammo = {
--- a/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Nobody_Laugh.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Nobody_Laugh.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -7,7 +7,7 @@
 
 SimpleMission({
 	missionTitle = loc("Nobody Laugh"),
-	missionIcon = 0,
+	missionIcon = -amHammer,
 	goalText = 
 		loc("Eliminate the enemy.") .. "|" ..
 		loc("Unlimited Attacks: Attacks don't end your turn") .. "|"..
@@ -24,33 +24,24 @@
 		[amSwitch] = { count = 9 },
 	},
 	teams = {
-		{ name = loc("Nameless Heroes"),
-		flag = "cm_crossedswords",
-		grave = "eyecross",
-		voice = "HillBilly",
+		{ isMissionTeam = true,
 		clanID = 0,
 		hogs = {
 			{
-			name = loc("Hunter"),
 			health = 1,
 			x = 1267, y = 451,
-			hat = "Skull",
-			botLevel = 0,
 			ammo = { [amParachute] = 1, [amHammer] = 1 },
 			},
 			{
-			name = loc("Drowner"),
 			health = 31,
 			x = 1332, y = 451,
-			hat = "mp3",
-			botLevel = 0,
 			ammo = { [amWhip] = 1 },
 			},
 		}},
 		{ name = loc("Clowns"),
 		flag = "cm_face",
 		grave = "Duck2",
-		voice = "Mobster",
+		voice = "Mobster_qau",
 		clanID = 5,
 		hogs = {
 			{ name = loc("Poison"), health = 100, x = 1133, y = 446, hat = "WhySoSerious", botLevel = 1, ammo = enemyAmmo },
--- a/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Spooky_Tree.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Spooky_Tree.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -3,6 +3,7 @@
 
 ---------------------------------------------------------------
 
+local playerTeamName
 local player = nil -- This variable will point to the hog's gear
 local instructor = nil
 local enemy = nil
@@ -23,16 +24,15 @@
 	MinesNum = 0 -- The number of mines being placed
 	MinesTime  = 1
 	Explosives = 0 -- The number of explosives being placed
-	Delay = 10 -- The delay between each round
 	Map = "Tree" -- The map to be played
 	Theme = "Halloween" -- The theme to be used
 	-- Disable Sudden Death
 	HealthDecrease = 0
 	WaterRise = 0
 
-	AddTeam(loc("Bloody Rookies"), -1, "deadhog", "Island", "Default", "cm_eyes")
-	player = AddHog(loc("Hunter"), 0, 1, "NoHat")
-	AddTeam(loc("Toxic Team"), -6, "skull", "Island", "Default", "cm_magicskull")
+	playerTeamName = AddMissionTeam(-1)
+	player = AddMissionHog(1)
+	AddTeam(loc("Toxic Team"), -6, "skull", "Island", "Default_qau", "cm_magicskull")
 	enemy = AddHog(loc("Poison"), 1, 10, "Skull")
 
 	SetGearPosition(player,970,23)
@@ -117,7 +117,6 @@
 	end
 
 	if TurnTimeLeft == 1 then
-		--ShowMission(loc(caption), loc(subcaption), loc(timeout), -amSkip, 0);
 		SetHealth(player, 0)
 		GameOver = true
 	end
@@ -147,11 +146,15 @@
 		SetTurnTimeLeft(TurnTimeLeft + 5000)
 	end
 
-	if (gear == enemy) and (GameOver == false) then
-		ShowMission(loc("Spooky Tree"), loc("MISSION SUCCESSFUL"), loc("Congratulations!"), 0, 0);
-	elseif gear == player then
-		ShowMission(loc("Spooky Tree"), loc("MISSION FAILED"), loc("Oh no! Just try again!"), -amSkip, 0)
+end
+
+function onGameResult(winner)
+	if winner == GetTeamClan(playerTeamName) then
+		SaveMissionVar("Won", "true")
+		SendStat(siGameResult, loc("Mission succeeded!"))
+		GameOver = true
+	else
+		SendStat(siGameResult, loc("Mission failed!"))
 		GameOver = true
 	end
-
 end
--- a/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Teamwork.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Teamwork.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -4,6 +4,7 @@
 local p2 = nil
 local enemy = nil
 local bCrate = nil
+local playerTeamName = loc("Feeble Resistance")
 
 local GameOver = false
 
@@ -17,18 +18,17 @@
 	MinesNum = 0 -- The number of mines being placed
 	MinesTime  = 1
 	Explosives = 0 -- The number of explosives being placed
-	Delay = 10 -- The delay between each round
 	Map = "Mushrooms" -- The map to be played
 	Theme = "Nature" -- The theme to be used
 	-- Disable Sudden Death
 	HealthDecrease = 0
 	WaterRise = 0
 
-	AddTeam(loc("Feeble Resistance"), -1, "Statue", "Island", "Default", "cm_kiwi")
-	player = AddHog(loc("Greg"), 0, 50, "NoHat")
-	p2 = AddHog(loc("Mark"), 0, 20, "NoHat")
+	playerTeamName = AddMissionTeam(-1)
+	player = AddMissionHog(50)
+	p2 = AddMissionHog(20)
 
-	AddTeam(loc("Cybernetic Empire"), -6, "ring", "Island", "Robot", "cm_cyborg")
+	AddTeam(loc("Cybernetic Empire"), -6, "ring", "Island", "Robot_qau", "cm_cyborg")
 	enemy = AddHog(loc("Unit 3378"), 5, 30, "cyborg1")
 
 	SetGearPosition(player,1403,235)
@@ -66,7 +66,7 @@
 	SpawnSupplyCrate(1543,744,amJetpack)
 	SpawnSupplyCrate(227,442,amDrill)
 
-	ShowMission(loc("Teamwork"), loc("Scenario"), loc("Eliminate Unit 3378.") .. "|" .. loc("Both your hedgehogs must survive.") .. "|" .. loc("Mines time: 0 seconds"), 0, 0)
+	ShowMission(loc("Teamwork"), loc("Scenario"), loc("Eliminate Unit 3378.") .. "|" .. loc("Both your hedgehogs must survive.") .. "|" .. loc("Mines time: 0 seconds"), 1, 0)
 
 end
 
@@ -94,10 +94,20 @@
 	end
 	-- Note: The victory sequence is done automatically by Hedgewars
 	if  ( ((gear == player) or (gear == p2)) and (GameOver == false)) then
-		ShowMission(loc("Teamwork"), loc("MISSION FAILED"), loc("Oh no! Just try again!"), -amSkip, 0)
 		GameOver = true
 		SetHealth(p2,0)
 		SetHealth(player,0)
 	end
 
 end
+
+function onGameResult(winner)
+	if winner == GetTeamClan(playerTeamName) then
+		SaveMissionVar("Won", "true")
+		SendStat(siGameResult, loc("Mission succeeded!"))
+		GameOver = true
+	else
+		SendStat(siGameResult, loc("Mission failed!"))
+		GameOver = true
+	end
+end
--- a/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Teamwork_2.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Teamwork_2.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -9,6 +9,7 @@
 local Pack = nil
 local help = false
 local GameOver = false
+local playerTeamName
 
 function onGameInit()
 	Seed = 0
@@ -22,15 +23,14 @@
 	WaterRise = 0
 
 	Explosives = 0
-	Delay = 10
 	Map = "CrazyMission"
 	Theme = "CrazyMission"
 
-	AddTeam(loc("Feeble Resistance"), -1, "Statue", "Island", "Default", "cm_kiwi")
-	player = AddHog(loc("Greg"), 0, 30, "NoHat")
-	hlayer = AddHog(loc("Mark"), 0, 40, "NoHat")
+	playerTeamName = AddMissionTeam(-1)
+	player = AddMissionHog(30)
+	hlayer = AddMissionHog(40)
 
-	AddTeam(loc("Cybernetic Empire"), -6, "ring", "Island", "Robot", "cm_binary")
+	AddTeam(loc("Cybernetic Empire"), -6, "ring", "Island", "Robot_qau", "cm_binary")
 	enemy = AddHog(loc("WatchBot 4000"), 5, 50, "cyborg1")
 
 	SetGearPosition(player, 180, 555)
@@ -101,9 +101,19 @@
 	end
 	-- Note: The victory sequence is done automatically by Hedgewars
 	if ( ((gear == player) or (gear == hlayer)) and (GameOver == false)) then
-		ShowMission(loc("Teamwork 2"), loc("MISSION FAILED"), loc("Oh no! Just try again!"), -amSkip, 0)
 		GameOver = true
 		SetHealth(hlayer, 0)
 		SetHealth(player, 0)
 	end
 end
+
+function onGameResult(winner)
+	if winner == GetTeamClan(playerTeamName) then
+		SaveMissionVar("Won", "true")
+		SendStat(siGameResult, loc("Mission succeeded!"))
+		GameOver = true
+	else
+		SendStat(siGameResult, loc("Mission failed!"))
+		GameOver = true
+	end
+end
--- a/share/hedgewars/Data/Missions/Scenario/User_Mission_-_The_Great_Escape.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_The_Great_Escape.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -19,10 +19,8 @@
 		[amFirePunch] = { ammoInCrate = 3 },
 	},
 	teams = {
-		{ name = loc("Hero Team"),
-		flag = "cm_swordshield",
-		grave = "star",
-		hogs = {{ name = loc("Good Dude"), health = 1, x = 1050, y = 534 }},
+		{ isMissionTeam = true,
+		hogs = {{ health = 1, x = 1050, y = 534 }},
 		},
 		{ name = loc("Bad Team"),
 		flag = "cm_dragonrb",
--- a/share/hedgewars/Data/Missions/Scenario/order.cfg	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Scenario/order.cfg	Fri Aug 16 10:59:50 2019 -0600
@@ -1,4 +1,3 @@
-User_Mission_-_Dangerous_Ducklings
 Bazooka_Battlefield
 User_Mission_-_Bamboo_Thicket
 User_Mission_-_The_Great_Escape
@@ -8,6 +7,7 @@
 User_Mission_-_Diver
 User_Mission_-_Spooky_Tree
 User_Mission_-_Nobody_Laugh
+User_Mission_-_Dangerous_Ducklings
 portal
 Tentacle_Terror
 Big_Armory
--- a/share/hedgewars/Data/Missions/Scenario/portal.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Scenario/portal.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -2,8 +2,9 @@
 HedgewarsScriptLoad("/Scripts/Utils.lua")
 
 local MineArray = {}
-local player
-local adviceGiven = false
+local player, playerTeamName
+local adviceGiven0 = false
+local adviceGiven1 = false
 local adviceGiven2 = false
 
 function onGameInit()
@@ -13,17 +14,16 @@
 	CaseFreq = 0 -- The frequency of crate drops
 	MinesNum = 0 -- The number of mines being placed
 	Explosives = 0 -- The number of explosives being placed
-	Delay = 10 -- The delay between each round
 	Map = "portal" -- The map to be played
 	Theme = "Hell" -- The theme to be used
 	-- Disable Sudden Death
 	HealthDecrease = 0
 	WaterRise = 0
 
-	AddTeam(loc("Subjects"), -9, "Simple", "Island", "Default", "cm_test")
-	player = AddHog(loc("Subject 1"), 0, 10, "Terminator_Glasses")
+	playerTeamName = AddMissionTeam(-1)
+	player = AddMissionHog(10)
 
-	AddTeam(loc("Hell Army"), -1, "skull", "Island", "Default", "cm_hellish")
+	AddTeam(loc("Hell Army"), -9, "skull", "Island", "Default_qau", "cm_hellish")
 	enemy1 = AddHog(loc("Lucifer"), 1, 200, "InfernalHorns")
 	enemy2 = AddHog(loc("Voldemort"), 1, 150, "WizardHat")
 	enemy3 = AddHog(loc("Zombi"), 1, 100, "Zombi")
@@ -33,27 +33,34 @@
 	enemy7 = AddHog(loc("C-2"), 1, 50, "cyborg1")
 	enemy8 = AddHog(loc("Rider"), 1, 50, "scif_SparkssHelmet")
 
-	AddTeam(loc("Badmad"), -1, "skull", "Island", "Default", "cm_pentagram")
+	AddTeam(loc("Badmad"), -9, "skull", "Island", "Default_qau", "cm_pentagram")
 	enemy9 = AddHog(loc("C-1"), 1, 50, "cyborg2")
 	enemy10 = AddHog(loc("Hidden"), 1, 40, "bushhider")
 	enemy11 = AddHog(loc("Ronald"), 1, 70, "clown")
 	enemy12 = AddHog(loc("Phosphat"), 1, 50, "chef")
 	enemy13 = AddHog(loc("Lestat"), 1, 30, "vampirichog")
 
-	SetGearPosition(player, 350, 1820)
-	SetGearPosition(enemy1, 2037, 1313)
-	SetGearPosition(enemy2, 1369, 1605)
-	SetGearPosition(enemy3, 1750, 1937)
-	SetGearPosition(enemy4, 3125, 89)
-	SetGearPosition(enemy5, 743, 900)
-	SetGearPosition(enemy6, 130, 360)
-	SetGearPosition(enemy7, 1333, 640)
-	SetGearPosition(enemy8, 1355, 200)
-	SetGearPosition(enemy9, 2680, 225)
-	SetGearPosition(enemy10, 2970, 800)
-	SetGearPosition(enemy11, 4050, 1964)
-	SetGearPosition(enemy12, 2666, 950)
-	SetGearPosition(enemy13, 3306, 1205)
+	SetGearPosition(player, 350, 1835)
+	SetGearPosition(enemy1, 2037, 1361)
+	SetGearPosition(enemy2, 1369, 1626)
+	SetGearPosition(enemy3, 1750, 1961)
+	SetGearPosition(enemy4, 3125, 138)
+	SetGearPosition(enemy5, 743, 938)
+	SetGearPosition(enemy6, 130, 388)
+	SetGearPosition(enemy7, 1333, 673)
+	SetGearPosition(enemy8, 1355, 231)
+	SetGearPosition(enemy9, 2680, 264)
+	SetGearPosition(enemy10, 2970, 868)
+	SetGearPosition(enemy11, 4050, 1985)
+	SetGearPosition(enemy12, 2666, 963)
+	SetGearPosition(enemy13, 3306, 1306)
+
+	HogTurnLeft(enemy1, true)
+	HogTurnLeft(enemy2, true)
+	HogTurnLeft(enemy4, true)
+	HogTurnLeft(enemy8, true)
+	HogTurnLeft(enemy9, true)
+	HogTurnLeft(enemy11, true)
 
 end
 
@@ -76,6 +83,12 @@
 
 end
 
+function onGearAdd(gear)
+	if (GetGearType(gear) == gtHedgehog) and (GetHogTeamName(gear) ~= playerTeamName) then
+		SetEffect(gear, heArtillery, 1)
+	end
+end
+
 function onGameStart()
 
 	SetWind(100)
@@ -160,15 +173,20 @@
 		loc("In this mission you have infinite time.") .. "|" ..
 		loc("Mines time: 0 seconds"),
 		-amPortalGun, 5000)
-	HogSay(player, loc("I should get myself a portal device, maybe this crate has one."), SAY_THINK)
+end
 
+function onNewTurn()
+	if (adviceGiven0 == false) then
+		adviceGiven0 = true
+		HogSay(player, loc("I should get myself a portal device, maybe this crate has one."), SAY_THINK)
+	end
 end
 
 function onGameTick()
 
 	if (player ~= nil)  then
-		if (gearIsInBox(player, 1650, 1907, 200, 60) and (adviceGiven == false)) then
-			adviceGiven = true
+		if (gearIsInBox(player, 1650, 1907, 200, 60) and (adviceGiven1 == false)) then
+			adviceGiven1 = true
 			HogSay(player, loc("Hmmm, I’ll have to find some way of moving him off this anti-portal surface."), SAY_THINK)
 		elseif (gearIsInBox(player, 2960, 790, 200, 60) and (adviceGiven2 == false)) then
 			adviceGiven2 = true
@@ -203,3 +221,11 @@
 	end
 end
 
+function onGameResult(winningClan)
+	if winningClan == GetHogClan(player) then
+		SaveMissionVar("Won", "true")
+		SendStat(siGameResult, loc("Mission succeeded!"))
+	else
+		SendStat(siGameResult, loc("Mission failed!"))
+	end
+end
--- a/share/hedgewars/Data/Missions/Training/Basic_Training_-_Bazooka.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Training/Basic_Training_-_Bazooka.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -47,12 +47,13 @@
 
 	------ TEAM LIST ------
 
-	AddTeam(loc("Bazooka Team"), -1, "Flower", "Earth", "Default", "hedgewars")
-	hog = AddHog(loc("Greenhorn"), 0, 100, "NoHat")
+	AddMissionTeam(-1)
+	hog = AddMissionHog(100)
 	SetGearPosition(hog, 1485, 2001)
 	SetEffect(hog, heResurrectable, 1)
 
 	SendHealthStatsOff()
+	SendRankingStatsOff()
 end
 
 function onGearResurrect(gear, vGear)
@@ -130,23 +131,42 @@
 end
 
 function newGamePhase()
+	local ctrl = ""
 	-- Spawn targets, update wind and ammo, show instructions
 	if gamePhase == 0 then
+		if INTERFACE == "desktop" then
+			ctrl = loc("Open ammo menu: [Right click]").."|"..
+			loc("Select weapon: [Left click]")
+		elseif INTERFACE == "touch" then
+			ctrl = loc("Open ammo menu: Tap the [Suitcase]")
+		end
 		ShowMission(loc("Basic Bazooka Training"), loc("Select Weapon"), loc("To begin with the training, select the bazooka from the ammo menu!").."|"..
-		loc("Open ammo menu: [Right click]").."|"..
-		loc("Select weapon: [Left click]"), 2, 5000)
+		ctrl, 2, 5000)
 	elseif gamePhase == 1 then
-		ShowMission(loc("Basic Bazooka Training"), loc("My First Bazooka"), loc("Let's get started!").."|"..
+		if INTERFACE == "desktop" then
+			ctrl = loc("Attack: [Space]").."|"..
+			loc("Aim: [Up]/[Down]").."|"..
+			loc("Walk: [Left]/[Right]")
+		elseif INTERFACE == "touch" then
+			ctrl = loc("Attack: Tap the [Bomb]").."|"..
+			loc("Aim: [Up]/[Down]").."|"..
+			loc("Walk: [Left]/[Right]")
+		end
+		ShowMission(loc("Basic Bazooka Training"), loc("My First Bazooka"),
+		loc("Let's get started!").."|"..
 		loc("Launch some bazookas to destroy the targets!").."|"..
 		loc("Hold the Attack key pressed for more power.").."|"..
 		loc("Don't hit yourself!").."|"..
-		loc("Attack: [Space]").."|"..
-		loc("Aim: [Up]/[Down]").."|"..
-		loc("Walk: [Left]/[Right]"), 2, 10000)
+		ctrl, 2, 10000)
 		spawnTargets()
 	elseif gamePhase == 2 then
+		if INTERFACE == "desktop" then
+			ctrl = loc("You see the wind strength at the bottom right corner.")
+		elseif INTERFACE == "touch" then
+			ctrl = loc("You see the wind strength at the top.")
+		end
 		ShowMission(loc("Basic Bazooka Training"), loc("Wind"), loc("Bazookas are influenced by wind.").."|"..
-		loc("You see the wind strength at the bottom right corner.").."|"..
+		ctrl.."|"..
 		loc("Destroy the targets!"), 2, 5000)
 		SetWind(50)
 		spawnTargets()
@@ -181,15 +201,19 @@
 		SetWind(-33)
 		spawnTargets()
 	elseif gamePhase == 6 then
+		if INTERFACE == "desktop" then
+			ctrl = loc("Precise Aim: [Left Shift] + [Up]/[Down]").."|"
+		end
 		ShowMission(loc("Basic Bazooka Training"), loc("Final Targets"),
 		loc("The final targets are quite tricky. You need to aim well.").."|"..
-		loc("Precise Aim: [Left Shift] + [Up]/[Down]").."|"..
+		ctrl..
 		loc("Hint: It might be easier if you vary the angle only slightly."),
 		2, 12000)
 		SetWind(75)
 		spawnTargets()
 	elseif gamePhase == 7 then
-		ShowMission(loc("Basic Bazooka Training"), loc("Training complete!"), loc("Congratulations!"), 0, 0)
+		SaveMissionVar("Won", "true")
+		ShowMission(loc("Basic Bazooka Training"), loc("Training complete!"), loc("Congratulations!"), 4, 0)
 		SetInputMask(0)
 		AddAmmo(CurrentHedgehog, amBazooka, 0)
 		if shotsFired > maxTargets then
@@ -205,8 +229,8 @@
 		end
 		SendStat(siCustomAchievement, loc("Good job!"))
 		SendStat(siGameResult, loc("You have completed the Basic Bazooka Training!"))
-		SendStat(siPlayerKills, "0", loc("Bazooka Team"))
 		EndGame()
+		SetState(hog, gstWinner)
 		gameOver = true
 	end
 	gamePhase = gamePhase + 1
--- a/share/hedgewars/Data/Missions/Training/Basic_Training_-_Flying_Saucer.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Training/Basic_Training_-_Flying_Saucer.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -27,6 +27,7 @@
 local Player = nil -- Pointer to hog created in: onGameInit
 local Target = nil -- Pointer to target hog
 local Objective = false -- Get to the target
+local Flawless = true -- Track flawless victory
 
 local TargetNumber = 0 -- The current target number
 local GrenadeThrown = false -- Used for the Boom Target
@@ -44,18 +45,21 @@
 
 local TargetPos = {} -- Table of targets
 
-local StartPos = { X = 742, Y = 290 }
+local StartPos = { X = 742, Y = 316 }
 
 --[[
 List of all targets (or "objectives"). The player has to complete them one-by-one and must always land safely afterwards.
 Some target numbers have names for easier reference.
 ]]
+-- Intro
 TargetPos[1] =  {
 	Targets = {{ X = 1027, Y = 217 }},
 	Ammo = { },
 	Message = loc("Here you will learn how to fly the flying saucer|and get so learn some cool tricks.") .. "|" ..
 	loc("Collect the first crate to begin!"),
 	MessageIcon = -amJetpack, }
+
+-- First flight, infinite fuel
 TargetPos[2] = {
 	Targets = {{ X = 1369, Y = 265 }},
 	Ammo = { [amJetpack] = 100 },
@@ -64,6 +68,8 @@
 	Message = loc("Get to the crate using your flying saucer!") .. "|" ..
 	loc("Press [Attack] (space bar by default) to start,|repeatedly tap the up, left and right movement keys to accelerate.") .. "|" ..
 	loc("Try to land softly, as you can still take fall damage!"), }
+
+-- First flight, limited fuel
 TargetPos[3] = {
 	Targets = {{ X = 689, Y = 58 }},
 	Ammo = { [amJetpack] = 100 },
@@ -72,19 +78,23 @@
 	loc("Tip: If you get stuck in this training, use \"Skip turn\" to restart the current objective.") }
 
 -- The Double Target
-local DoubleTarget = 4
 TargetPos[4] = {
-	Targets = { { X = 84, Y = -20 }, { X = 1980 , Y = -20 } },
+	Targets = { { X = 178, Y = -20 }, { X = 1962 , Y = -20 } },
 	Ammo = { [amJetpack] = 2 },
+	CratesContainAmmo = true,
 	MessageTime = 9000,
 	Message = loc("Now collect the 2 crates to the far left and right.") .. "|" ..
 	loc("You only have 2 flying saucers this time.") .. "|" ..
 	loc("Tip: You can change your flying saucer|in mid-flight by hitting the [Attack] key twice."), }
+
+-- Intermission
 TargetPos[5] = {
 	Targets = {{ X = 47, Y = 804 }},
 	Ammo = { [amJetpack] = 100 },
 	MessageTime = 5000,
 	Message = loc("Time for a more interesting stunt, but first just collect the next crate!"), }
+
+-- First Dive
 TargetPos[6] = {
 	Targets = {{ X = 604, Y = 871}},
 	MessageTime = 15000,
@@ -93,16 +103,19 @@
 	loc("You only have one flying saucer this time.") .. "|" ..
 	loc("Beware, though, you will only be able to move slowly through the water.") .. "|" ..
 	loc("Warning: Never ever leave the flying saucer while in water!"),
-	Ammo = { [amJetpack] = 1 }, }
+	Ammo = { [amJetpack] = 1 },
+	Respawn = { X = 758, Y = 847, FaceLeft = false }, }
 
+-- Second Dive
 TargetPos[7] = { 
 	Targets = {{ X = 1884, Y = 704 }},
 	MessageTime = 6500,
 	Message = loc("Now dive just one more time and collect the next crate.") .. "|" ..
 		loc("Tip: Don't remain for too long in the water, or you won't make it."),
-	Ammo = { [amJetpack] = 1}, }
+	Ammo = { [amJetpack] = 2 },
+	Respawn = { X = 1968, Y = -1, FaceLeft = true }, }
 
--- The Boom Target
+-- The Grenade Drop Target
 local BoomTarget = 8
 TargetPos[8] = {
 	Modifier = true, Func = function()
@@ -128,7 +141,7 @@
 
 	end,
 	Ammo = { [amJetpack] = 100 },
-	Respawn = { X = 2000, Y = 742 }, }
+	Respawn = { X = 2000, Y = 742, FaceLeft = true }, }
 
 -- The Launch Target
 local LaunchTarget = 9
@@ -143,9 +156,8 @@
 		loc("You can even change your aiming direction in mid-flight if you first hold [Precise] and then press [Up] or [Down].") .. "|" ..
 		loc("Tip: Changing your aim while flying is very difficult, so adjust it before you take off."),
 	Ammo = { [amJetpack] = 1, },
-	Respawn = { X = 1764, Y = 916 },
+	Respawn = { X = 1760, Y = 754, FaceLeft = true },
 	ExtraFunc = function()
-		HogTurnLeft(Player, true)
 		if SaucerGear ~= nil then
 			AddAmmo(Player, amBazooka, 2)
 		else
@@ -165,7 +177,7 @@
 	loc("Based on what you've learned, destroy the target on the girder and as always, land safely!"), 
 	Targets = {{ X = 1200, Y = 930, Type = gtTarget }},
 	Ammo = { [amJetpack] = 1, },
-	Respawn = { X = 1027, Y = 217 },
+	Respawn = { X = 1027, Y = 217, FaceLeft = true },
 	ExtraFunc = function()
 		if SaucerGear ~= nil then
 			AddAmmo(Player, amBazooka, 1)
@@ -174,6 +186,7 @@
 		end
 		BazookasLeft = 1
 	end }
+-- Final target / Sandbox
 TargetPos[11] = {
 	Targets = {{ X = 742, Y = 290 }},
 	MessageTime = 5000,
@@ -182,6 +195,7 @@
 	loc("Collect or destroy the final crate to finish the training."),
 	Ammo = { [amJetpack] = 100, [amGrenade] = 100, [amBazooka] = 100 },
 	InfFuel = true, }
+-- Outro
 TargetPos[12] = { Modifier = true, Func = function()
 	Objective = true
 	AddCaption(loc("Training complete!"), capcolDefault, capgrpGameState)
@@ -192,14 +206,19 @@
 	end
 	SetState(Player, band(GetState(Player), bnot(gstHHDriven)))
 	SetState(Player, bor(GetState(Player), gstWinner))
-	PlaySound(sndVictory, Player)
+	if Flawless then
+		PlaySound(sndFlawless, Player)
+	else
+		PlaySound(sndVictory, Player)
+	end
+	SaveMissionVar("Won", "true")
 
 	SendStat(siGameResult, loc("You have finished the Flying Saucer Training!"))
 	SendStat(siCustomAchievement, loc("Good job!"))
-	SendStat(siPlayerKills, "0", loc("Hogonauts"))
 
 	EndTurn(true)
 	EndGame()
+	SetState(Player, gstWinner)
 end,
 }
 
@@ -223,6 +242,9 @@
 	if Barrels[2] == nil then
 		Barrels[2] = AddGear(1648, 463, gtExplosives, 0, 0, 0, 0)
 	end
+	if Barrels[3] == nil then
+		Barrels[3] = AddGear(1513, 575, gtExplosives, 0, 0, 0, 0)
+	end
 
 	for i=1,#Barrels do
 		SetHealth(Barrels[i], 1)
@@ -234,18 +256,22 @@
 	for i=1,#TargetPos[TargetNumber].Targets do
 		if TargetGears[i] == nil then
 			SpawnTarget(TargetPos[TargetNumber].Targets[i].X, TargetPos[TargetNumber].Targets[i].Y,
-				TargetPos[TargetNumber].Targets[i].Type, i)
+				TargetPos[TargetNumber].Targets[i].Type, i, TargetPos[TargetNumber].CratesContainAmmo )
 		end
 	end
 end
 
-function SpawnTarget( PosX, PosY, Type, ID )
+function SpawnTarget( PosX, PosY, Type, ID, ContainsAmmo )
 	if Type ~= nil and Type ~= gtCase then
 		if Type == gtTarget then
 			TargetGears[ID] = AddGear(PosX, PosY, gtTarget, 0, 0, 0, 0)
 		end
 	else
-		TargetGears[ID] = SpawnFakeUtilityCrate(PosX, PosY, false, false)
+		if ContainsAmmo == true then
+			TargetGears[ID] = SpawnSupplyCrate(PosX, PosY, amJetpack)
+		else
+			TargetGears[ID] = SpawnFakeUtilityCrate(PosX, PosY, false, false)
+		end
 	end
 	TargetsRemaining = TargetsRemaining + 1
 end
@@ -328,12 +354,13 @@
 
 	CleanUpGears()
 
-	local X, Y
+	local X, Y, FaceLeft
 	if TargetNumber == 1 then
 		X, Y = StartPos.X, StartPos.Y
 	else
 		if TargetPos[TargetNumber-1].Modifier or TargetPos[TargetNumber-1].Respawn ~= nil then
 			X, Y = TargetPos[TargetNumber-1].Respawn.X, TargetPos[TargetNumber-1].Respawn.Y
+			FaceLeft = TargetPos[TargetNumber-1].Respawn.FaceLeft
 		else
 			X, Y = TargetPos[TargetNumber-1].Targets[1].X, TargetPos[TargetNumber-1].Targets[1].Y
 		end
@@ -360,6 +387,9 @@
 	UpdateInfFuel()
 
 	SetGearPosition(Player, X, Y)
+	if FaceLeft ~= nil then
+		HogTurnLeft(Player, FaceLeft)
+	end
 end
 
 function onGameInit()
@@ -376,24 +406,24 @@
 	WaterRise = 0
 	HealthDecrease = 0
 
-	-- Team name is a pun on “hedgehog” and “astronauts”
-	AddTeam( loc( "Hogonauts" ), -9, "earth", "Earth", "Default", "cm_galaxy" )
+	AddMissionTeam(-9)
 
-	-- Hedgehog name is a pun on “Neil Armstrong”
-	Player = AddHog( loc( "Neil Hogstrong" ), 0, 1, "NoHat" )
+	Player = AddMissionHog(1)
 	SetGearPosition( Player, StartPos.X, StartPos.Y)
 	SetEffect( Player, heResurrectable, 1 )
 end
 
 function onGameStart()
 	SendHealthStatsOff()
+	SendRankingStatsOff()
 
 	-- Girder near first crate
 	PlaceGirder(1257, 204, 6)
 
 	-- The upper girders
-	PlaceGirder(84, 16, 0)
-	PlaceGirder(1980, 16, 0)
+	PlaceGirder(84, 16, 4)
+	PlaceGirder(243, 16, 4)
+	PlaceGirder(1967, 16, 4)
 
 	-- The lower girder platform at the water pit
 	PlaceGirder(509, 896, 4)
@@ -415,9 +445,9 @@
 end
 
 function onAmmoStoreInit()
-	SetAmmo(amJetpack, 0, 0, 0, 0)
-	SetAmmo(amGrenade, 0, 0, 0, 0)
-	SetAmmo(amBazooka, 0, 0, 0, 0)
+	SetAmmo(amJetpack, 0, 0, 0, 1)
+	SetAmmo(amGrenade, 0, 0, 0, 1)
+	SetAmmo(amBazooka, 0, 0, 0, 1)
 
 	-- Added for resetting current target/objective when player is stuck somehow
 	SetAmmo(amSkip, 9, 0, 0, 0)
@@ -482,7 +512,8 @@
 			AddAmmo(Player, amBazooka, 0)
 		end
 	end
-	if GetGearType(Gear) == gtCase and GetGearType(Player) ~= nil then
+	-- Fake crate collected
+	if GetGearType(Gear) == gtCase and band(GetGearMessage(Gear), gmDestroy) ~= 0 and band(GetGearPos(Gear), 0x8) ~= 0 then
 		PlaySound(sndShotgunReload)
 	end
 	if Gear == Barrels[1] then
@@ -492,6 +523,9 @@
 		Barrels[2] = nil
 		AddCaption(loc("Kaboom!"), capcolDefault, capgrpMessage)
 	end
+	if Gear == Barrels[3] then
+		Barrels[3] = nil
+	end
 end
 
 
@@ -543,6 +577,7 @@
 
 function onGearDamage(Gear)
 	if Gear == Player then
+		Flawless = false
 		CleanUpGears()
 		GrenadeThrown = false
 		Check = false
@@ -551,6 +586,7 @@
 
 function onGearResurrect(Gear, VGear)
 	if Gear == Player then
+		Flawless = false
 		AddCaption(loc("Oh no! You have died. Try again!"), capcolDefault, capgrpMessage2)
 		ResetCurrentTarget()
 		if VGear then
@@ -560,6 +596,7 @@
 end
 
 function onSkipTurn()
+	Flawless = false
 	AddCaption(loc("Try again!"), capcolDefault, capgrpMessage2)
 	ResetCurrentTarget()
 end
--- a/share/hedgewars/Data/Missions/Training/Basic_Training_-_Grenade.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Training/Basic_Training_-_Grenade.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -39,12 +39,13 @@
 
 	------ TEAM LIST ------
 
-	AddTeam(loc("Grenade Team"), -1, "Flower", "Earth", "Default", "cm_grenade")
-	hog = AddHog(loc("Greenhorn"), 0, 1, "NoHat")
+	AddMissionTeam(-1)
+	hog = AddMissionHog(1)
 	SetGearPosition(hog, 570, 157)
 	SetEffect(hog, heResurrectable, 1)
 
 	SendHealthStatsOff()
+	SendRankingStatsOff()
 end
 
 function onGearResurrect(gear, vGear)
@@ -83,7 +84,7 @@
 local function spawnTargets()
 	-- Warm-up
 	if gamePhase == 0 then
-		AddGear(882, 39, gtTarget, 0, 0, 0, 0)
+		AddGear(945, 498, gtTarget, 0, 0, 0, 0)
 	-- Timer
 	elseif gamePhase == 2 then
 		AddGear(233, 97, gtTarget, 0, 0, 0, 0)
@@ -93,12 +94,12 @@
 	elseif gamePhase == 3 then
 		AddGear(15, 240, gtTarget, 0, 0, 0, 0)
 		AddGear(61, 9, gtTarget, 0, 0, 0, 0)
-		AddGear(945, 498, gtTarget, 0, 0, 0, 0)
+		AddGear(882, 39, gtTarget, 0, 0, 0, 0)
 	-- Bounciness
 	elseif gamePhase == 4 then
-		AddGear(323, 960, gtTarget, 0, 0, 0, 0)
 		AddGear(1318, 208, gtTarget, 0, 0, 0, 0)
 		AddGear(1697, 250, gtTarget, 0, 0, 0, 0)
+		AddGear(323, 960, gtTarget, 0, 0, 0, 0)
 		AddGear(1852, 100, gtTarget, 0, 0, 0, 0)
 	-- Grand Final
 	elseif gamePhase == 5 then
@@ -117,24 +118,42 @@
 
 function newGamePhase()
 	-- Spawn targets, update wind and ammo, show instructions
+	local ctrl = ""
 	if gamePhase == 0 then
+		if INTERFACE == "desktop" then
+			ctrl = loc("Open ammo menu: [Right click]").."|"..
+			loc("Select weapon: [Left click]")
+		else
+			ctrl = loc("Open ammo menu: Tap the [Suitcase]")
+		end
 		ShowMission(loc("Basic Grenade Training"), loc("Select Weapon"), loc("To begin with the training, select the grenade from the ammo menu!").."|"..
-		loc("Open ammo menu: [Right click]").."|"..
-		loc("Select weapon: [Left click]"), 2, 5000)
+		ctrl, 2, 5000)
 	elseif gamePhase == 1 then
+		if INTERFACE == "desktop" then
+			ctrl = loc("Attack: [Space]").."|"..
+			loc("Aim: [Up]/[Down]").."|"..
+			loc("Change direction: [Left]/[Right]")
+		elseif INTERFACE == "touch" then
+			ctrl = loc("Attack: Tap the [Bomb]").."|"..
+			loc("Aim: [Up]/[Down]").."|"..
+			loc("Change direction: [Left]/[Right]")
+		end
 		ShowMission(loc("Basic Grenade Training"), loc("Warming Up"),
 		loc("Throw a grenade to destroy the target!").."|"..
 		loc("Hold the Attack key pressed for more power.").."|"..
-		loc("Attack: [Space]").."|"..
-		loc("Aim: [Up]/[Down]").."|"..
-		loc("Change direction: [Left]/[Right]").."|"..
+		ctrl.."|"..
 		loc("Note: Walking is disabled in this mission."), 2, 20000)
 		spawnTargets()
 	elseif gamePhase == 2 then
+		if INTERFACE == "desktop" then
+			ctrl = loc("Set detonation timer: [1]-[5]")
+		elseif INTERFACE == "touch" then
+			ctrl = loc("Change detonation timer: Tap the [Clock]")
+		end
 		ShowMission(loc("Basic Grenade Training"), loc("Timer"),
 		loc("You can change the detonation timer of grenades.").."|"..
 		loc("Grenades explode after 1 to 5 seconds (you decide).").."|"..
-		loc("Set detonation timer: [1]-[5]"), 2, 15000)
+		ctrl, 2, 15000)
 		spawnTargets()
 	elseif gamePhase == 3 then
 		ShowMission(loc("Basic Grenade Training"), loc("No Wind Influence"), loc("Unlike bazookas, grenades are not influenced by wind.").."|"..
@@ -142,21 +161,31 @@
 		SetWind(50)
 		spawnTargets()
 	elseif gamePhase == 4 then
-		ShowMission(loc("Basic Grenade Training"), loc("Bounciness"),
-		loc("You can set the bounciness of grenades (and grenade-like weapons).").."|"..
+		local caption = loc("Bounciness")
+		ctrl = loc("You can set the bounciness of grenades (and grenade-like weapons).").."|"..
 		loc("Grenades with high bounciness bounce a lot and behave chaotic.").."|"..
 		loc("With low bounciness, it barely bounces at all, but it is much more predictable.").."|"..
-		loc("Try out different bounciness levels to reach difficult targets.").."|"..
-		loc("Set bounciness: [Left Shift] + [1]-[5]"),
-		2, 20000)
+		loc("Try out different bounciness levels to reach difficult targets.").."|"
+		if INTERFACE == "desktop" then
+			ctrl = ctrl .. loc("Set bounciness: [Left Shift] + [1]-[5]")
+		elseif INTERFACE == "touch" then
+			ctrl = ctrl .. loc("Change bounciness: Tap [B]")
+		end
+
+		ShowMission(loc("Basic Grenade Training"), caption, ctrl, 2, 20000)
 		spawnTargets()
 	elseif gamePhase == 5 then
+		if INTERFACE == "desktop" then
+			ctrl = loc("Precise Aim: [Left Shift] + [Up]/[Down]")
+			-- FIXME: No precise aim in touch interface yet :(
+		end
 		ShowMission(loc("Basic Grenade Training"), loc("Final Targets"), loc("Good job! Now destroy the final targets to finish the training.").."|"..
-		loc("Precise Aim: [Left Shift] + [Up]/[Down]"),
+		ctrl,
 		2, 7000)
 		spawnTargets()
 	elseif gamePhase == 6 then
-		ShowMission(loc("Basic Grenade Training"), loc("Training complete!"), loc("Congratulations!"), 0, 0)
+		SaveMissionVar("Won", "true")
+		ShowMission(loc("Basic Grenade Training"), loc("Training complete!"), loc("Congratulations!"), 4, 0)
 		SetInputMask(0)
 		AddAmmo(CurrentHedgehog, amGrenade, 0)
 		if shotsFired > maxTargets then
@@ -169,9 +198,9 @@
 		end
 		SendStat(siCustomAchievement, loc("Good job!"))
 		SendStat(siGameResult, loc("You have completed the Basic Grenade Training!"))
-		SendStat(siPlayerKills, "0", loc("Grenade Team"))
 		EndGame()
 		gameOver = true
+		SetState(hog, gstWinner)
 	end
 	gamePhase = gamePhase + 1
 end
--- a/share/hedgewars/Data/Missions/Training/Basic_Training_-_Movement.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Training/Basic_Training_-_Movement.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -24,6 +24,7 @@
 local tookDamage = false
 local switchTextDelay = -1
 local missionPanelConfirmed = false
+local missionPanelConfirmedTimer = 0
 local turnStarted = false
 
 local map = {
@@ -109,23 +110,24 @@
 	CaseFreq = 0
 	WaterRise = 0
 	HealthDecrease = 0
+	HealthCaseAmount = 5
 
 	-- DRAW MAP --
 	drawMap()
 
 	------ HOG LIST ------
-	AddTeam(loc("Training Team"), -1, "deadhog", "SteelTower", "Default", "hedgewars")
+	AddMissionTeam(-1)
 	
-	hhs[1] = AddHog(loc("Greenhorn"), 0, 100, "NoHat")
+	hhs[1] = AddMissionHog(100)
 	SetGearPosition(hhs[1], 404, 1714)
 	SetEffect(hhs[1], heResurrectable, 1)
 
-	hhs[2] = AddHog(loc("Rhombus"), 0, 100, "NoHat")
+	hhs[2] = AddMissionHog(100)
 	SetGearPosition(hhs[2], 620, 1538)
 	SetEffect(hhs[2], heResurrectable, 1)
 	HogTurnLeft(hhs[2], true)
 
-	hhs[3] = AddHog(loc("Trapped"), 0, 100, "NoHat")
+	hhs[3] = AddMissionHog(100)
 	SetGearPosition(hhs[3], 1573, 1824)
 	SetEffect(hhs[3], heResurrectable, 1)
 	
@@ -134,14 +136,26 @@
 	SetEffect(hhs[4], heResurrectable, 1)
 	HogTurnLeft(hhs[4], true)
 	
-	hhs[5] = AddHog(loc("Ice"), 0, 100, "NoHat")
+	hhs[5] = AddMissionHog(100)
 	SetGearPosition(hhs[5], 1813, 1285)
 	SetEffect(hhs[5], heResurrectable, 1)
 
 	hog_greenhorn = hhs[1]
 	hog_cappy = hhs[4]
+
+	for i=1,#hhs do
+		if hhs[i] ~= hog_cappy then
+			if GetHogName(hhs[i]) == loc("Cappy") then
+				SetHogName(hhs[i], loc("Greenhorn"))
+			end
+			if GetHogHat(hhs[i]) == "cap_red" then
+				SetHogHat(hhs[i], "NoHat")
+			end
+		end
+	end
 	
 	SendHealthStatsOff()
+	SendRankingStatsOff()
 end
 
 local function LoadGearData()
@@ -241,21 +255,27 @@
 	crates[7] = SpawnHealthCrate(1198, 1750)		-- Back Jumping 2
 	crates[8] = SpawnSupplyCrate(1851, 1402, amSwitch, 100)	-- Switch Hedgehog
 	crates[9] = SpawnHealthCrate(564, 1772)			-- Health
-	crates[10] = SpawnHealthCrate(2290, 1622)		-- Turning Around
+	-- FIXME: Not available in touch because no “precise” button
+	if INTERFACE ~= "touch" then
+		crates[10] = SpawnHealthCrate(2290, 1622)		-- Turning Around
+	end
 end
 
 local function victory()
-	ShowMission(loc("Basic Movement Training"), loc("Training complete!"),loc("Congratulations! You have completed the obstacle course!"), 0, 0)
+	SaveMissionVar("Won", "true")
+	ShowMission(loc("Basic Movement Training"), loc("Training complete!"),loc("Congratulations! You have completed the obstacle course!"), 4, 0)
 	SendStat(siGameResult, loc("You have completed the Basic Movement Training!"))
 	SendStat(siCustomAchievement, loc("Congratulations!"))
 	SendStat(siCustomAchievement, loc("Return to the training menu by pressing the “Go back” button."))
-	SendStat(siPlayerKills, "0", loc("Training Team"))
 	PlaySound(sndVictory, CurrentHedgehog)
 	-- Disable controls, end game
 	SetInputMask(0)
 	SetWeapon(amNothing)
 	SetGearMessage(CurrentHedgehog, band(GetGearMessage(CurrentHedgehog), bnot(gmAllStoppable)))
 	EndGame()
+	for i=1,#hhs do
+		SetState(hhs[i], gstWinner)
+	end
 end
 
 local function switchHedgehogText()
@@ -265,11 +285,17 @@
 		loc("To finish hedgehog selection, just do anything|with him, like walking."),
 		2, 20000)
 	else
+		local ctrl = ""
+		if INTERFACE == "desktop" then
+			ctrl = loc("Hit the “Switch Hedgehog” key until you have|selected Cappy, the hedgehog with the cap!").."|"..
+			loc("Switch hedgehog: [Tabulator]")
+		else
+			ctrl = loc("Tap the “rotating arrow” button on the left|until you have selected Cappy, the hedgehog with the cap!")
+		end
 		ShowMission(loc("Basic Movement Training"), loc("Switch Hedgehog (2/3)"),
 		loc("You have activated Switch Hedgehog!").."|"..
 		loc("The spinning arrows above your hedgehog show|which hedgehog is selected right now.").."|"..
-		loc("Hit the “Switch Hedgehog” key until you have|selected Cappy, the hedgehog with the cap!").."|"..
-		loc("Switch hedgehog: [Tabulator]"), 2, 20000)
+		ctrl, 2, 20000)
 	end
 end
 
@@ -281,6 +307,7 @@
 end
 
 function onGearDelete(gear)
+	local ctrl = ""
 	-- Switching done
 	if GetGearType(gear) == gtSwitcher then
 		switcherGear = nil
@@ -290,57 +317,103 @@
 			loc("Collect the remaining crates to complete the training."),
 			2, 0)
 		else
+			if INTERFACE == "desktop" then
+				ctrl = loc("Open ammo menu: [Right click]").."|"..
+				loc("Attack: [Space]")
+			elseif INTERFACE == "touch" then
+				ctrl = loc("Open ammo menu: Tap the [Suitcase]").."|"..
+				loc("Attack: Tap the [Bomb]")
+			end
 			ShowMission(loc("Basic Movement Training"), loc("Switch Hedgehog (Failed!)"),
 			loc("Oops! You have selected the wrong hedgehog! Just try again.").."|"..
 			loc("Select “Switch Hedgehog” from the ammo menu and|hit the “Attack” key to proceed.").."|"..
-			loc("Open ammo menu: [Right click]").."|"..
-			loc("Attack: [Space]"), 2, 0)
+			ctrl, 2, 0)
 		end
 
 	-- Crate collected (or destroyed, but this should not be possible)
 	elseif gear == crates[1] then
+		if INTERFACE == "desktop" then
+			ctrl = loc("Long Jump: [Enter]")
+		elseif INTERFACE == "touch" then
+			ctrl = loc("Long Jump: Tap the [Curvy Arrow] button for long")
+		end
 		ShowMission(loc("Basic Movement Training"), loc("Jumping"),
 		loc("Get the next crate by jumping over the abyss.").."|"..
 		loc("Careful, hedgehogs can't swim!").."|"..
-		loc("Long Jump: [Enter]"), 2, 5000)
+		ctrl, 2, 5000)
 	elseif gear == crates[2] then
 		victory()
 	elseif gear == crates[4] then
+		if INTERFACE == "desktop" then
+			ctrl = loc("High Jump: [Backspace]").."|"..loc("Back Jump: [Backspace] ×2")
+		elseif INTERFACE == "touch" then
+			ctrl = loc("High Jump: Tap the [Curvy Arrow] shortly").."|"..loc("Back Jump: Double-tap the [Curvy Arrow]")
+		end
 		ShowMission(loc("Basic Movement Training"), loc("Back Jumping (1/2)"),
 		loc("For the next crate, you have to do back jumps.") .. "|" ..
 		loc("To reach higher ground, walk to a ledge, look to the left, then do a back jump.") .. "|" ..
-		loc("High Jump: [Backspace]").."|"..loc("Back Jump: [Backspace] ×2"), 2, 6600)
+		ctrl, 2, 6600)
 	elseif gear == crates[7] then
+		if INTERFACE == "desktop" then
+			ctrl = loc("High Jump: [Backspace]").."|"..loc("Back Jump: [Backspace] ×2")
+		elseif INTERFACE == "touch" then
+			ctrl = loc("High Jump: Tap the [Curvy Arrow] shortly").."|"..loc("Back Jump: Double-tap the [Curvy Arrow]")
+		end
 		ShowMission(loc("Basic Movement Training"), loc("Back Jumping (2/2)"),
 		loc("To get over the next obstacles, keep some distance from the wall before you back jump.").."|"..
 		loc("Hint: To jump higher, wait a bit before you hit “High Jump” a second time.").."|"..
-		loc("High Jump: [Backspace]").."|"..loc("Back Jump: [Backspace] ×2"), 2, 15000)
+		ctrl, 2, 15000)
 	elseif gear == crates[5] then
+		-- FIXME: Touch doesn't have precise aim yet :(
+		if INTERFACE == "desktop" then
+			ctrl = "|" ..
+			loc("You can also hold down the key for “Precise Aim” to prevent slipping.") .. "|" ..
+			loc("Precise Aim: [Left Shift]")
+		end
 		ShowMission(loc("Basic Movement Training"), loc("Walking on Ice"),
 		loc("These girders are slippery, like ice.").."|"..
 		loc("And you need to move to the top!").."|"..
-		loc("If you don't want to slip away, you have to keep moving!").."|"..
-		loc("You can also hold down the key for “Precise Aim” to prevent slipping.").."|"..
-		loc("Precise Aim: [Left Shift]"), 2, 9000)
+		loc("If you don't want to slip away, you have to keep moving!")..
+		ctrl, 2, 9000)
 	elseif gear == crates[6] then
+		-- FIXME: Touch doesn't have precise aim yet :(
+		if INTERFACE == "desktop" then
+			ctrl = "|" .. loc("Remember: Hold down [Left Shift] to prevent slipping")
+		end
 		ShowMission(loc("Basic Movement Training"), loc("A mysterious Box"),
-		loc("The next crate is an utility crate.").."|"..loc("What's in the box, you ask? Let's find out!").."|"..
-		loc("Remember: Hold down [Left Shift] to prevent slipping"), 2, 6000)
+		loc("The next crate is an utility crate.").."|"..loc("What's in the box, you ask? Let's find out!")..
+		ctrl, 2, 6000)
 	elseif gear == crates[8] then
+		if INTERFACE == "desktop" then
+			ctrl = loc("Open ammo menu: [Right click]").."|"..
+			loc("Attack: [Space]")
+		elseif INTERFACE == "touch" then
+			ctrl = loc("Open ammo menu: Tap the [Suitcase]").."|"..
+			loc("Attack: Tap the [Bomb]")
+		end
 		ShowMission(loc("Basic Movement Training"), loc("Switch Hedgehog (1/3)"),
 		loc("You have collected the “Switch Hedgehog” utility!").."|"..
 		loc("This allows to select any hedgehog in your team!").."|"..
 		loc("Select “Switch Hedgehog” from the ammo menu and|hit the “Attack” key.").."|"..
-		loc("Open ammo menu: [Right click]").."|"..
-		loc("Attack: [Space]"), 2, 30000)
+		ctrl, 2, 30000)
 	elseif gear == crates[3] then
 		ShowMission(loc("Basic Movement Training"), loc("Rubber"), loc("As you probably noticed, these rubber bands|are VERY elastic. Hedgehogs and many other|things will bounce off without taking any damage.").."|"..
 		loc("Now try to get out of this bounce house|and take the next crate."), 2, 8000)
 	elseif gear == crates[9] then
+		if INTERFACE == "desktop" then
+			ctrl = loc("Look around: [Mouse movement]") .. "|" ..
+			loc("Zoom: [Rotate mouse wheel]")
+		elseif INTERFACE == "touch" then
+			ctrl = loc("Look around: [Tap or swipe on the screen]") .. "|" ..
+			-- multi-touch gesture
+			loc("Zoom: [Pinch] with 2 fingers")
+		end
 		ShowMission(loc("Basic Movement Training"), loc("Health"), loc("You just got yourself some extra health.|The more health your hedgehogs have, the better!").."|"..
+		loc("The health of your current hedgehog|is shown at the top right corner.").."|"..
 		loc("Now go to the next crate.").."|"..
-		loc("Look around: [Mouse movement]"), 2, 10000)
+		ctrl, 2, 11500)
 	elseif gear == crates[10] then
+		-- FIXME: This crate is unused in touch atm
 		ShowMission(loc("Basic Movement Training"), loc("Turning Around"),
 		loc("By the way, you can turn around without walking|by holding down Precise when you hit a walk control.").."|"..
 		loc("Get the final crate to the right to complete the training.").."|"..
@@ -350,7 +423,7 @@
 end
 
 function onGearDamage(gear)
-	if GetGearType(gear) == gtHedgehog and tookDamage == false then
+	if GetGearType(gear) == gtHedgehog and tookDamage == false and GetX(gear) > 1362 then
 		ShowMission(loc("Basic Movement Training"), loc("Fall Damage"), loc("Ouch! You just took fall damage.").."|"..
 		loc("Better get yourself another health crate to heal your wounds."), 2, 5000)
 		tookDamage = true
@@ -366,20 +439,29 @@
 end
 
 local function firstMission()
-	-- This part is CRITICALLY important for all future missions.
-	-- Because the player must know how to show the current mission texts again.
+	-- Here we teach player must know how to show the current mission texts again.
 	-- We force the player to hit Attack before the actual training begins.
+	-- Later, the mission panel key is perma-shown as caption.
+	local ctrl = ""
+	if INTERFACE == "desktop" then
+		ctrl = loc("IMPORTANT: To see the mission panel again, hold the mission panel key.").."| |"..
+		loc("Note: This basic training assumes default controls.").."|"..
+		loc("Mission panel: [M]").."|"..
+		loc("Quit: [Esc]").."|"..
+		loc("Pause: [P]").."| |"..
+		loc("To begin with the training, hit the attack key!").."|"..
+		loc("Attack: [Space]")
+	elseif INTERFACE == "touch" then
+		ctrl = loc("IMPORTANT: To see the mission panel again, pause the game.").."| |"..
+		loc("Pause: Tap the [Pause] button").."| |"..
+		loc("To begin with the training, tap the attack button!").."|"..
+		loc("Attack: Tap the [Bomb]")
+	end
 	ShowMission(loc("Basic Movement Training"), loc("Mission Panel"),
 	loc("This is the mission panel.").."|"..
 	loc("Here you will find the current mission instructions.").."|"..
 	loc("Normally, the mission panel disappears after a few seconds.").."|"..
-	loc("IMPORTANT: To see the mission panel again, hold the mission panel key.").."| |"..
-	loc("Note: This basic training assumes default controls.").."|"..
-        loc("Mission panel: [M]").."|"..
-	loc("Quit: [Esc]").."|"..
-	loc("Pause: [P]").."| |"..
-	loc("To begin with the training, hit the attack key!").."|"..
-	loc("Attack: [Space]"), 2, 900000, true)
+	ctrl, 2, 900000, true)
 
 	-- TODO: This and other training missions are currently hardcoding control names.
 	-- This should be fixed eventually.
@@ -396,6 +478,19 @@
 		-- Forces the first mission panel to be displayed without time limit
 		firstMission()
 	end
+	if missionPanelConfirmed then
+		missionPanelConfirmedTimer = missionPanelConfirmedTimer + 20
+		--[[ After confirming the initial mission panel,
+		show the mission panel key as permanent caption
+		so the player can't overlook or forget it. ]]
+		if missionPanelConfirmedTimer > 7000 then
+			if INTERFACE == "desktop" then
+				AddCaption(loc("Press [M] to see the mission texts"), capcolDefault, capgrpMessage2)
+			elseif INTERFACE == "touch" then
+				AddCaption(loc("Tap [Pause] to see the mission texts"), capcolDefault, capgrpMessage2)
+			end
+		end
+	end
 end
 
 function onGearResurrect(gear, vGear)
@@ -444,7 +539,7 @@
 	SetInputMask(0)
 	SetSoundMask(sndYesSir, true)
 	LoadGearData()
-	ShowMission(loc("Basic Movement Training"), loc("Basic Training"), loc("Complete the obstacle course."), 1, 0)
+	ShowMission(loc("Basic Movement Training"), loc("Basic Training"), loc("Complete the obstacle course."), 10, 0)
 	FollowGear(hog_greenhorn)
 end
 
--- a/share/hedgewars/Data/Missions/Training/Basic_Training_-_Rope.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Missions/Training/Basic_Training_-_Rope.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -9,7 +9,7 @@
 	- Multiple shots / rope re-use to go over water hazard
 	- Drop grenade from rope
 	- Special rules when you only got 1 rope (i.e. when the rope is officially used up)
-	- Rope around obstacles and mines
+	- Rope around obstacles
 ]]
 
 HedgewarsScriptLoad("/Scripts/Locale.lua")
@@ -32,7 +32,6 @@
 -- Gears
 local hog
 local ropeGear
-local mines = {}
 
 -- Status vars
 local ropeSelected = false	-- rope was selected the first time, used for msg
@@ -42,12 +41,14 @@
 local wasFirstTurn = false	-- first turn msg was displayed
 local gameOver = false		-- game over (only victory possible)
 local currentTarget = 0		-- current target ID. First target = 1
+local flawless = true		-- flawless if no damage taken and no mistake made
 
 local cpX, cpY = 208, 1384	-- hog checkpoint, initialized with start coords
 
 -- "Constants"
 local initHogHealth = 50
-local teamName = loc("Wannabe Ropers")
+local initHogHealthFinal = 1
+local teamName
 
 local girderData = {
 	{2012, 1366, 6}, -- water gate
@@ -61,28 +62,6 @@
 	{3809, 1375, 0}, -- post-water gate
 }
 
-local mineData = {
-	{1261, 549},
-	{1395, 554},
-	{1719, 458},
-	{1489, 558},
-	{1686, 565},
-	{1581, 561},
-	{1904, 539},
-	{2047, 539},
-	{2226, 608},
-	{2387, 541},
-	{2523, 396},
-	{2899, 324},
-	{3428, 546},
-	{3373, 546},
-	{3271, 546},
-	{3123, 545},
-	{3012, 544},
-	{2907, 544},
-	{2793, 543},
-}
-
 local targetData = {
 	-- 1: Start
 	{504, 1215},
@@ -118,34 +97,32 @@
 	WaterRise = 0
 	HealthDecrease = 0
 
-	AddTeam(teamName, -1, "Plinko", "Snail", "Default", "cm_yinyang")
-	hog = AddHog(loc("Roper"), 0, initHogHealth, "StrawHat")
+	teamName = AddMissionTeam(-1)
+	hog = AddMissionHog(initHogHealth)
 	SetGearPosition(hog, cpX, cpY)
 	SetEffect(hog, heResurrectable, 1)
 
 	drawMap()
 
 	SendHealthStatsOff()
+	SendRankingStatsOff()
 
 end
 
--- The final challenge is to rope through a mined obstacle course with only 1 rope.
+-- The final challenge is to rope through an obstacle course with only 1 rope.
 -- If the player screws up, this functinon will restart it.
-local function resetMineChallenge(setPos)
+local function resetFinalChallenge(setPos)
 	if setPos == nil then
 		setPos = true
 	end
-	SetHealth(hog, initHogHealth)
+	SetHealth(hog, initHogHealthFinal)
 	AddAmmo(hog, amRope, 1)
-	for gear, _ in pairs(mines) do
-		DeleteGear(gear)
-	end
+	SetGearVelocity(hog, 0, 0)
 
-	for m=1, #mineData do
-		AddGear(mineData[m][1], mineData[m][2], gtMine, 0, 0, 0, 0)
-	end
 	if setPos then
+		PlaySound(sndWarp)
 		SetGearPosition(hog, cpX, cpY)
+		AddVisualGear(cpX, cpY, vgtExplosion, 0, false)
 		FollowGear(hog)
 	end
 end
@@ -154,7 +131,31 @@
 local function eraseGirder(id)
 	EraseSprite(girderData[id][1], girderData[id][2], sprAmGirder, girderData[id][3], false, false, false, false)
 	PlaySound(sndVaporize)
-	AddVisualGear(girderData[id][1], girderData[id][2], vgtSteam, false, 0)
+	local dir = girderData[id][3]
+	if dir == 4 then
+		-- long horizontal
+		for i=-4,4 do
+			AddVisualGear(girderData[id][1] + i * 18, girderData[id][2], vgtSteam, false, 0)
+		end
+	elseif dir == 0 then
+		-- short horizontal
+		for i=-2,1 do
+			AddVisualGear(10 + girderData[id][1] + i * 20, girderData[id][2], vgtSteam, false, 0)
+		end
+	elseif dir == 6 then
+		-- long vertical
+		for i=-4,4 do
+			AddVisualGear(girderData[id][1], girderData[id][2] + i * 18, vgtSteam, false, 0)
+		end
+	elseif dir == 2 then
+		-- short vertical
+		for i=-2,1 do
+			AddVisualGear(girderData[id][1], 10 + girderData[id][2] + i * 20, vgtSteam, false, 0)
+		end
+	else
+		AddVisualGear(girderData[id][1], girderData[id][2], vgtSteam, false, 0)
+	end
+
 	AddCaption(loc("Barrier unlocked!"))
 end
 
@@ -164,6 +165,8 @@
 		PlaceGirder(unpack(girderData[g]))
 	end
 
+	PlaceSprite(1678, 546, sprTargetBee, 0)
+
 	------ BARRELS ------
 	local barrels = {}
 	table.insert(barrels, AddGear(1370, 1223, gtExplosives, 0, 0, 0, 0))
@@ -175,11 +178,6 @@
 		SetHealth(barrels[b], 1)
 	end
 
-	------ MINES ------
-	for m=1, #mineData do
-		AddGear(mineData[m][1], mineData[m][2], gtMine, 0, 0, 0, 0)
-	end
-
 	------ FIRST TARGET ------
 	currentTarget = 1
 	AddGear(targetData[currentTarget][1], targetData[currentTarget][2], gtTarget, 0, 0, 0, 0)
@@ -194,15 +192,18 @@
 end
 
 function onNewTurn()
+	local ctrl = ""
 	if not wasFirstTurn then
+		if INTERFACE == "desktop" then
+			ctrl = loc("Open ammo menu: [Right click]")
+		elseif INTERFACE == "touch" then
+			ctrl = loc("Open ammo menu: Tap the [Suitcase]")
+		end
 		ShowMission(loc("Basic Rope Training"), loc("Select Rope"),
 		loc("Select the rope to begin!").."|"..
-		loc("Open ammo menu: [Right click]"), 2, 7500)
+		ctrl, 2, 7500)
 		wasFirstTurn = true
 	end
-	if isInMineChallenge then
-		resetMineChallenge()
-	end
 end
 
 function onGameTick()
@@ -212,11 +213,18 @@
 
 	-- First rope selection
 	if not ropeSelected and GetCurAmmoType() == amRope then
+		local ctrl = ""
+		if INTERFACE == "desktop" then
+			ctrl = loc("Aim: [Up]/[Down]").."|"..
+			loc("Attack: [Space]")
+		elseif INTERFACE == "touch" then
+			ctrl = loc("Aim: [Up]/[Down]").."|"..
+			loc("Attack: Tap the [Bomb]")
+		end
 		ShowMission(loc("Basic Rope Training"), loc("Getting Started"),
 		loc("You can use the rope to reach new places.").."|"..
 		loc("Aim at the ceiling and hold [Attack] pressed until the rope attaches.").."|"..
-		loc("Aim: [Up]/[Down]").."|"..
-		loc("Attack: [Space]"), 2, 15000)
+		ctrl, 2, 15000)
 		ropeSelected = true
 	-- Rope attach
 	elseif ropeGear and band(GetState(ropeGear), gstCollision) ~= 0 then
@@ -229,7 +237,7 @@
 			loc("Swing: [Left]/[Right]").."|"..
 			loc("Release rope: [Attack]"), 2, 15000)
 			ropeAttached = true
-		elseif currentTarget > 1 then
+		elseif currentTarget > 1 and (not (currentTarget == 6 and barrelsBoom)) then
 			HideMission()
 		end
 	end
@@ -244,6 +252,19 @@
 	else
 		SetInputMask(band(GetInputMask(), bnot(gmAttack)))
 	end
+	if isInFinalChallenge then
+		local dX, dY = GetGearVelocity(CurrentHedgehog)
+		local x, y = GetGearPosition(CurrentHedgehog)
+		if band(GetState(CurrentHedgehog), gstHHDriven) ~= 0 and GetAmmoCount(CurrentHedgehog, amRope) == 0 and
+				GetFlightTime(CurrentHedgehog) == 0 and (not ropeGear) and
+				math.abs(dX) < 5 and math.abs(dY) < 5 and
+				(x < 3417 or y > 471) then
+			flawless = false
+			AddCaption(loc("Your rope is gone! Try again!"))
+			resetFinalChallenge()
+			PlaySound(sndWarp)
+		end
+	end
 end
 
 function onGameTick20()
@@ -258,8 +279,6 @@
 function onGearAdd(gear)
 	if GetGearType(gear) == gtRope then
 		ropeGear = gear
-	elseif GetGearType(gear) == gtMine then
-		mines[gear] = true
 	elseif GetGearType(gear) == gtGrenade then
 		if not ropeGear then
 			DeleteGear(gear)
@@ -270,18 +289,35 @@
 function onGearResurrect(gear, vGear)
 	-- Teleport hog to previous checkpoint
 	if gear == hog then
+		flawless = false
 		SetGearPosition(hog, cpX, cpY)
 		if vGear then
 			SetVisualGearValues(vGear, GetX(hog), GetY(hog))
 		end
 		FollowGear(hog)
 		AddCaption(loc("Your hedgehog has been revived!"))
-		if isInMineChallenge then
-			resetMineChallenge(false)
+		if isInFinalChallenge then
+			resetFinalChallenge(false)
 		end
 	end
 end
 
+function onGearDamage(gear)
+	if gear == hog then
+		flawless = false
+	end
+end
+
+local function dropNadeText(time)
+	ShowMission(loc("Basic Rope Training"), loc("Rope Weapons"),
+	loc("Some weapons can be dropped from the rope.").."|"..
+	loc("Collect the weapon crate and drop|a grenade from rope to destroy the barrels.").."|"..
+	loc("Step 1: Start roping").."|"..
+	loc("Step 2: Select grenade").."|"..
+	loc("Step 3: Drop the grenade").."| |"..
+	loc("Drop weapon (while on rope): [Long Jump]"), 2, time)
+end
+
 function onGearDelete(gear)
 	if GetGearType(gear) == gtTarget then
 		-- Update checkpoint
@@ -311,15 +347,9 @@
 			eraseGirder(8)
 			eraseGirder(9)
 		elseif currentTarget == 5 then
-			ShowMission(loc("Basic Rope Training"), loc("Rope Weapons"),
-			loc("Some weapons can be dropped from the rope.").."|"..
-			loc("Collect the weapon crate and drop|a grenade from rope to destroy the barrels.").."|"..
-			loc("Step 1: Start roping").."|"..
-			loc("Step 2: Select grenade").."|"..
-			loc("Step 3: Drop the grenade").."| |"..
-			loc("Drop weapon (while on rope): [Long Jump]"), 2, 20000)
+			dropNadeText(20000)
 			AddAmmo(hog, amBaseballBat, 0)
-			SpawnAmmoCrate(1849, 920, amGrenade, 100)
+			SpawnAmmoCrate(1849, 920, amGrenade, AMMO_INFINITE)
 		elseif currentTarget == 6 then
 			ShowMission(loc("Basic Rope Training"), loc("Finite Ropes"),
 			loc("So far, you had infinite ropes, but in the|real world, ropes are usually limited.").."|"..
@@ -328,25 +358,29 @@
 			loc("If you miss a shot while trying to|re-attach, your rope is gone, too!").."| |"..
 			loc("Final Challenge:").." |"..
 			loc("Reach and destroy the final target to win.").."|"..
-			loc("You only get 1 rope this time, don't waste it!").."|"..
-			loc("Avoid the mines!").."|"..
-			loc("Skip your turn to try again."), 2, 25000)
+			loc("You only get 1 rope this time, don't waste it!"),
+			2, 25000)
 			eraseGirder(4)
 			eraseGirder(5)
 			AddAmmo(hog, amRope, 1)
-			AddAmmo(hog, amSkip, 100)
-			isInMineChallenge = true
+			SetHealth(hog, initHogHealthFinal)
+			isInFinalChallenge = true
 		elseif currentTarget == 7 then
+			SaveMissionVar("Won", "true")
 			ShowMission(loc("Basic Rope Training"), loc("Training complete!"),
-			loc("Congratulations!"), 0, 0)
-			PlaySound(sndVictory, hog)
+			loc("Congratulations!"), 4, 0)
+			if flawless then
+				PlaySound(sndFlawless, hog)
+			else
+				PlaySound(sndVictory, hog)
+			end
 			AddAmmo(hog, amBaseballBat, 0)
 			AddAmmo(hog, amGrenade, 0)
 			AddAmmo(hog, amRope, 0)
 			SendStat(siCustomAchievement, loc("Oh yeah! You sure know how to rope!"))
 			SendStat(siGameResult, loc("You have finished the Basic Rope Training!"))
-			SendStat(siPlayerKills, "0", teamName)
 			EndGame()
+			SetState(hog, gstWinner)
 			gameOver = true
 			SetInputMask(0)
 		end
@@ -360,22 +394,31 @@
 		if not barrelsBoom then
 			barrelsBoom = true
 			AddAmmo(hog, amGrenade, 0)
-			AddAmmo(hog, amBaseballBat, 100)
+			AddAmmo(hog, amBaseballBat, AMMO_INFINITE)
 			eraseGirder(2)
 			eraseGirder(3)
+			ShowMission(loc("Basic Rope Training"),
+				loc("Kaboom!"),
+				loc("Follow the path and destroy the next target."),
+				2, 5000)
 		end
 	elseif GetGearType(gear) == gtRope then
 		ropeGear = nil
 		if ropeAttached and not target1Reached then
+			local ctrl = ""
+			if INTERFACE == "desktop" then
+				ctrl = loc("Aim: [Up]/[Down]").."|"..
+				loc("Attack: [Space]")
+			elseif INTERFACE == "touch" then
+				ctrl = loc("Aim: [Up]/[Down]").."|"..
+				loc("Attack: Tap the [Bomb]")
+			end
 			ShowMission(loc("Basic Rope Training"), loc("How to Rope"),
 			loc("Go to the target.").."|"..
 			loc("Hold [Attack] to attach the rope.").."|"..
-			loc("Aim: [Up]/[Down]").."|"..
-			loc("Attack: [Space]"), 2, 13000)
+			ctrl, 2, 13000)
 			ropeAttached = false
 		end
-	elseif GetGearType(gear) == gtMine then
-		mines[gear] = nil
 	elseif GetGearType(gear) == gtCase then
 		eraseGirder(6)
 		eraseGirder(7)
@@ -387,16 +430,10 @@
 	SetAmmo(amBaseballBat, 9, 0, 0, 1)
 end
 
-function onHogAttack(ammoType)
-	-- Allow to manually reset final challenge with skip
-	if ammoType == amSkip then
-		resetMineChallenge()
-	end
-end
-
 function onAttack()
 	if GetCurAmmoType() == amGrenade and not ropeGear then
 		AddCaption(loc("You have to drop the grenade from rope!"), 0xFF4000FF, capgrpMessage)
+		dropNadeText(5000)
 		PlaySound(sndDenied)
 	end
 end
Binary file share/hedgewars/Data/Music/Jungle.ogg has changed
Binary file share/hedgewars/Data/Music/Jungle.opus has changed
--- a/share/hedgewars/Data/Music/credits.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Music/credits.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -1,12 +1,12 @@
-City.ogg=HSR ( http://elhombresinremedio.com )
+City.ogg=HSR <http://elhombresinremedio.com>
 Compost.ogg=HG
 EarthRise.ogg=Jonatan Nilsson
 Fruit.ogg=Valentin Kraevskiy
 Jungle.ogg=Valentin Kraevskiy
 Nature.ogg=John Dum
 Pirate.ogg=Jonatan Nilsson
-Rock.ogg=HSR ( http://elhombresinremedio.com )
-olympics_sd.ogg=yd ( http://opengameart.org/users/yd )
+Rock.ogg=HSR <http://elhombresinremedio.com>
+olympics_sd.ogg=yd <http://opengameart.org/users/yd>
 oriental.ogg=Jonatan Nilsson
 sdmusic.ogg=Kevin MacLeod - "Hitman" [sheepluva edit]
 snow.ogg=Jonatan Nilsson
--- a/share/hedgewars/Data/Names/README.md	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Names/README.md	Fri Aug 16 10:59:50 2019 -0600
@@ -42,7 +42,9 @@
 * Each hog of this team gets a random hat of this list. Repeat a hat name to
   jack up its probability.
 
-Each team is again separated by a separator line.
+Each team is again separated by a separator line. The team name must not
+contain characters that would be forbidden in a file name (such as “/”,
+“\” or “:”).
 
 At the end of the final team, this line must be written (without the spaces):
 
--- a/share/hedgewars/Data/Scripts/Animate.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Scripts/Animate.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -8,6 +8,12 @@
 local skipping
 local baseInputMask = 0xFFFFFFFF
 local extraInputMask = baseInputMask
+
+-- DEBUGGING STUFF --
+--[[ Number of animation ticks to decrease whenever AnimUnWait()
+     is called (usually every game tick). Default: 1
+     Increase this number to increase overall animation speed. ]]
+local animSpeed = 1
 --------------------------------Animation---------------------------------
 --------------------------(In-game cinematics)----------------------------
 
@@ -102,8 +108,7 @@
 end
 
 function AnimSwitchHog(gear)
-  --SetGearMessage(gear, 0)
-  --SetState(gear, 0)
+  SetGearMessage(gear, band(GetGearMessage(gear), bnot(gmAllStoppable)))
   SwitchHog(gear)
   FollowGear(gear)
   return true
@@ -126,7 +131,10 @@
 
 function AnimUnWait()
   if globalWait > 0 then
-    globalWait = globalWait - 1
+    globalWait = globalWait - animSpeed
+    if globalWait < 0 then
+      globalWait = 0
+    end
   end
 end
 
@@ -236,6 +244,10 @@
 end
 
 function AnimOutOfNowhere(gear, destX, destY)
+  if (not destX) or (not destY) then
+    destX = GetX(gear)
+    destY = GetY(gear)
+  end
   AnimSetGearPosition(gear, destX, destY)
   AddVisualGear(destX, destY, vgtBigExplosion, 0, false)
   PlaySound(sndExplosion)
--- a/share/hedgewars/Data/Scripts/Multiplayer/Balanced_Random_Weapon.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Balanced_Random_Weapon.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -264,6 +264,14 @@
     end
 end
 
+function onHogHide(gear)
+    trackHiding(gear)
+end
+
+function onHogRestore(gear)
+    trackRestoring(gear)
+end
+
 function onGearDelete(gear)
     trackDeletion(gear)
 end
--- a/share/hedgewars/Data/Scripts/Multiplayer/Battalion.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Battalion.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -266,6 +266,8 @@
 
 local kingLinkPerc = 50 -- Percentage of life to share from the team
 
+local teamKingsAlive = {} -- whether the king of each team is still alive
+
 local pointsWepBase = 5 -- Game start points weapons
 local pointsHlpBase = 2 -- Game start points helpers
 local pointsKeepPerc = 80 -- Percentage of points to take to next round
@@ -717,6 +719,7 @@
   if mode == 'king' then
     counter[team]['King'] = 1
     table.insert(group[team], 'King')
+    teamKingsAlive[team] = true
   end
 end
 
@@ -923,18 +926,17 @@
   end
 end
 
-function RandomTurnEvents()
+function onCaseDrop()
   if GetRandom(100) < weaponCrateChance then
     SpawnFakeAmmoCrate(0, 0, false, false)
-    return 5000
+    PlaySound(sndReinforce, CurrentHedgehog)
   elseif GetRandom(100) < utilCrateChance then
     SpawnFakeUtilityCrate(0, 0, false, false)
-    return 5000
+    PlaySound(sndReinforce, CurrentHedgehog)
   elseif GetRandom(100) < healthCrateChance then
     SpawnFakeHealthCrate(0, 0, false, false)
-    return 5000
+    PlaySound(sndReinforce, CurrentHedgehog)
   end
-  return 0
 end
 
 --[[
@@ -944,6 +946,9 @@
 ]]--
 
 function onSuddenDeathDamage(hog)
+  if GetEffect(hog, heInvulnerable) ~= 0 then
+    return
+  end
   local hp = GetHealth(hog)
   local maxHp = getHogInfo(hog, 'maxHp')
   local newHp = 0
@@ -975,8 +980,16 @@
     hpDec = hp - newHp
 
     SetHealth(hog, newHp)
-    local effect = AddVisualGear(GetX(hog), GetY(hog) +cratePickupGap, vgtHealthTag, hpDec, false)
-    SetVisualGearValues(effect, nil, nil, nil, nil, nil, nil, nil, nil, nil, msgColor)
+    if hpDec > 0 then
+      local r = math.random(1, 2)
+      if r == 1 then
+         PlaySound(sndPoisonCough, hog, true)
+      else
+         PlaySound(sndPoisonMoan, hog, true)
+      end
+      local effect = AddVisualGear(GetX(hog), GetY(hog) +cratePickupGap, vgtHealthTag, hpDec, false)
+      SetVisualGearValues(effect, nil, nil, nil, nil, nil, nil, nil, nil, nil, msgColor)
+    end
   end
 end
 
@@ -1164,18 +1177,18 @@
   local msgColor = getHogInfo(KingHog, 'clanColor')
 
   AddCaption(string.format(loc("The king of %s has died!"), team), capcolDefault, capgrpGameState)
+  SetState(KingHog, gstHHDeath)
 
   -- Kill the rest of the team normally, just like the official King Mode game modifier
   for hog, val in pairs(hogInfo) do
     if getHogInfo(hog, 'team') == team then
       hp = GetHealth(hog)
       if hp ~= nil and hp > 0 then
-        SetState(KingHog, gstHHDeath)
         SetHealth(hog, 0)
-        SetGearValues(hog, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 0)
       end
     end
   end
+  teamKingsAlive[team] = false
 
   -- We don't use DismissTeam, it causes a lot of problems and nasty side-effects.
 
@@ -1314,6 +1327,20 @@
   addTurnAmmo(hog)
 end
 
+function checkKingAlive(gear)
+  -- This workaround works because in King Mode, we made
+  -- sure only kings can have the crown.
+  if GetHogHat(gear) == 'crown' then
+    teamKingsAlive[getHogInfo(gear, 'team')] = true
+  end
+end
+
+function killLonelyMinion(gear)
+  if teamKingsAlive[getHogInfo(gear, 'team')] == false then
+    SetHealth(gear, 0)
+  end
+end
+
 function onEndTurn()
   if not firstTurnOver then
     firstTurnOver = true
@@ -1342,8 +1369,11 @@
     savePoints(CurHog)
   end
 
-  -- Run random turn events
-  RandomTurnEvents()
+  -- In King Mode, kill all hogs without king in their team
+  if mode == 'king' then
+    runOnGears(checkKingAlive)
+    runOnGears(killLonelyMinion)
+  end
 end
 
 function savePoints(hog)
@@ -1444,12 +1474,6 @@
 
   if suddenDeath == true then
     onSuddenDeathTurn()
-  else
-    local RoundsTillSD = (SuddenDeathTurns+2) - (TotalRounds+1)
-    -- Show SD reminder every couple of turns, and in the first turn
-    if (not firstTurnOver) or (RoundsTillSD <= 6) or (RoundsTillSD <= 25 and RoundsTillSD % 5 == 0) or (RoundsTillSD % 10 == 0) then
-        AddCaption(string.format(loc("Rounds until Sudden Death: %d"), RoundsTillSD), capcolDefault, capgrpGameState)
-    end
   end
 
   -- Generate new weapons for last hog if it's still alive
@@ -1746,4 +1770,11 @@
   else
     DisableGameFlags(gfPerHogAmmo)
   end
+  if mode ~= 'points' and mode ~= 'highland' and mode ~= 'king' then
+    if GetGameFlag(gfKing) then
+      mode = 'king'
+      modeExplicit = true
+    end
+  end
+  DisableGameFlags(gfKing)
 end
--- a/share/hedgewars/Data/Scripts/Multiplayer/Capture_the_Flag.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Capture_the_Flag.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -89,6 +89,7 @@
 
 local gameStarted = false
 local gameOver = false
+local winningClan = -1
 local captureLimit = 3
 
 --------------------------
@@ -138,15 +139,52 @@
 --flag methods
 ------------------------
 
+local RankTeams = function(teamList)
+	local teamRank = function(a, b)
+		if a.score ~= b.score then
+			return a.score > b.score
+		else
+			return a.clan > b.clan
+		end
+	end
+	table.sort(teamList, teamRank)
+	local rank, plusRank, score, clan
+	for i=1, #teamList do
+		if i == 1 then
+			rank = 1
+			plusRank = 1
+			score = teamList[i].score
+			clan = teamList[i].clan
+		end
+		if (teamList[i].score < score) then
+			rank = rank + plusRank
+			plusRank = 1
+		end
+		if (teamList[i].score == score and teamList[i].clan ~= clan) then
+			plusRank = plusRank + 1
+		end
+		teamList[i].rank = rank
+		score = teamList[i].score
+		clan = teamList[i].clan
+	end
+
+	for i=1, #teamList do
+		SendStat(siPointType, "!POINTS")
+		SendStat(siTeamRank, tostring(teamList[i].rank))
+		SendStat(siPlayerKills, tostring(teamList[i].score), teamList[i].name)
+	end
+end
+
 function CheckScore(clanID)
 
 	if fCaptures[clanID] == captureLimit then
 		gameOver = true
+		winningClan = clanID
 		-- Capture limit reached! We have a winner!
 		for i = 0, (numhhs-1) do
 			if hhs[i] ~= nil then
 				-- Kill all losers
-				if GetHogClan(hhs[i]) ~= clanID then
+				if GetHogClan(hhs[i]) ~= winningClan then
 					SetEffect(hhs[i], heResurrectable, 0)
 					SetHealth(hhs[i],0)
 				end
@@ -165,15 +203,7 @@
 			local clan = GetTeamClan(name)
 			table.insert(teamList, { score = fCaptures[clan], name = name, clan = clan })
 		end
-		local teamRank = function(a, b)
-			return a.score > b.score
-		end
-		table.sort(teamList, teamRank)
-
-		for i=1, #teamList do
-			SendStat(siPointType, loc("point(s)"))
-			SendStat(siPlayerKills, tostring(teamList[i].score), teamList[i].name)
-		end
+		RankTeams(teamList)
 
 		if mostCaptures >= 2 then
 			SendStat(siCustomAchievement, string.format(loc("%s (%s) has captured the flag %d times."), mostCapturesHogName, mostCapturesHogTeam, mostCaptures))
@@ -475,7 +505,7 @@
 		loc("- Dropped flags may be returned or recaptured").."|"..
 		loc("- Hogs will be revived")
 
-	ShowMission(loc("Capture The Flag"), loc("A Hedgewars minigame"), rules, 0, 0)
+	ShowMission(loc("Capture The Flag"), loc("A Hedgewars minigame"), rules, 11, 0)
 end
 
 function updateScores()
@@ -496,9 +526,12 @@
 		fCaptures[i] = 0
 	end
 
-	for h=1, numhhs do
+	for h=0, numhhs-1 do
 		-- Hogs are resurrected for free, so this is pointless
 		AddAmmo(hhs[h], amResurrector, 0)
+		-- Remove suicidal weapons as they might wipe out the team
+		AddAmmo(hhs[h], amKamikaze, 0)
+		AddAmmo(hhs[h], amPiano, 0)
 	end
 
 	updateScores()
@@ -598,6 +631,10 @@
 			break
 		end
 	end
+	if gameOver and GetHogClan(gear) ~= winningClan then
+		SetEffect(gear, heResurrectable, 0)
+		SetHealth(gear, 0)
+	end
 end
 
 function onHogAttack(ammoType)
--- a/share/hedgewars/Data/Scripts/Multiplayer/Construction_Mode.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Construction_Mode.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -106,6 +106,7 @@
 local fortMode = false -- is using a fort map?
 local tempID_CheckProximity = nil -- temporary structure variable for CheckProximity
 local cGear = nil -- detects placement of girders and objects (using airattack)
+local cGearPlacementDone = false
 local uniqueStructureID = 0 -- Counter and ID for structures. Is incremented each time a structure spawns
 
 -- Colors
@@ -153,6 +154,7 @@
 	{amMortar,	 1*costFactor},
 	{amDrill,	 3*costFactor},
 	{amSnowball,	 3*costFactor},
+	{amKnife,	 2*costFactor},
 
 	{amGrenade,	 2*costFactor},
 	{amClusterBomb,	 3*costFactor},
@@ -165,7 +167,6 @@
 	{amDEagle,	 2*costFactor},
 	{amSniperRifle,	 3*costFactor},
 	--{amSineGun,	 6*costFactor},
-	{amFlamethrower, 4*costFactor},
 	{amIceGun,	15*costFactor},
 	{amMinigun,	13*costFactor},
 
@@ -187,7 +188,7 @@
 
 	{amPickHammer,	 2*costFactor},
 	{amBlowTorch,	 4*costFactor},
-	{amKnife,	 2*costFactor},
+	{amFlamethrower, 4*costFactor},
 
 	{amBirdy,	 7*costFactor},
 }
@@ -1385,17 +1386,19 @@
 		local x,y = GetGearTarget(cGear)
 
 		if GetGearType(cGear) == gtAirAttack then
-			DeleteGear(cGear)
-			PlaceObject(x, y)
+			SetGearMessage(cGear, bor(GetGearMessage(cGear), gmDestroy))
+			if not cGearPlacementDone then
+				PlaceObject(x, y)
+				cGearPlacementDone = true
+			end
 		elseif GetGearType(cGear) == gtTeleport then
-
-				CheckTeleport(cGear, x, y)
-				cGear = nil
+			CheckTeleport(cGear, x, y)
+			cGear = nil
+			cGearPlacementDone = true
 		elseif GetGearType(cGear) == gtGirder then
-
 			currentGirderRotation = GetState(cGear)
-
 			PlaceObject(x, y)
+			cGearPlacementDone = true
 		end
 
 	end
@@ -1877,6 +1880,7 @@
 	local gt = GetGearType(gear)
 	if (gt == gtAirAttack) or (gt == gtTeleport) or (gt == gtGirder) then
 		cGear = gear
+		cGearPlacementDone = false
 	end
 
 	if isATrackedGear(gear) then
--- a/share/hedgewars/Data/Scripts/Multiplayer/Continental_supplies.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Continental_supplies.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -15,29 +15,6 @@
 HedgewarsScriptLoad("/Scripts/Utils.lua")
 HedgewarsScriptLoad("/Scripts/Tracker.lua")
 
---approximative version of square root. This function follows the babylonian method.
-function IntegerSqrt(num)
-	local temp=num
-	while(temp*temp-div(temp,2)>num)
-	do
-		temp=div((temp+div(num,temp)),2)
-	end
-
-	return math.abs(temp)
-end
-
--- sqrt(x^2,y^2), work without desyncs. is approximative
-function Norm(xx,yy)
-	--to fix overflows
-	if(((math.abs(xx)^2)+(math.abs(yy)^2))>2^26)
-	then
-		local bitr=2^13
-		return IntegerSqrt((div(math.abs(xx),bitr)^2)+(div(math.abs(yy),bitr)^2))*bitr
-	else
-		return IntegerSqrt((math.abs(xx)^2)+(math.abs(yy)^2))
-	end
-end
-
 -- returns 1 or -1 depending on where it is
 function GetIfNegative(num)
 	if(num<0)
@@ -67,9 +44,8 @@
 	SetVisualGearValues(healthtag, nil, nil, nil, nil, nil, nil, nil, nil, nil, GetClanColor(GetHogClan(hog)))
 end
 
---will use IntegerSqrt
 function FireGear(hedgehog,geartype,vx,vy,timer)
-	local hypo=Norm(vx,vy)
+	local hypo=integerHypotenuse(vx,vy)
 	return AddGear(div((GetGearRadius(hedgehog)*2*vx),hypo)+GetX(hedgehog), div((GetGearRadius(hedgehog)*2*vy),hypo)+GetY(hedgehog), geartype, 0, vx, vy, timer)
 end
 
@@ -552,6 +528,7 @@
 	elseif not CS.GAME_STARTED then
 		AddCaption(CS.CONTINENT_INFORMATION[continent][1], GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo)
 	end
+	SetContinentTeamLabel()
 end
 
 --will show a circle of gears (eye candy)
@@ -861,7 +838,7 @@
 				SetState(CurrentHedgehog, gstMoving)
 			end
 			SetGearPosition(hog, GetX(hog),GetY(hog)-3)
-			hypo=Norm(math.abs(GetX(hog)-GetX(CS.TEMP_VALUE)),math.abs(GetY(hog)-GetY(CS.TEMP_VALUE)))
+			hypo=integerHypotenuse(math.abs(GetX(hog)-GetX(CS.TEMP_VALUE)),math.abs(GetY(hog)-GetY(CS.TEMP_VALUE)))
 			SetGearVelocity(hog, div((power_radius_outer-hypo)*power_sa*GetIfNegative(GetX(hog)-GetX(CS.TEMP_VALUE)),power_radius_outer), div((power_radius_outer-hypo)*power_sa*GetIfNegative(GetY(hog)-GetY(CS.TEMP_VALUE)),power_radius_outer))
 		end
 	end
@@ -1169,6 +1146,16 @@
 	SuddenDeathTurns= SuddenDeathTurns+1
 end
 
+function onEndTurn()
+	if(CS.TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]==0)
+	then
+		CS.TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=GetRandom(#CS.CONTINENT_INFORMATION)+1
+		SetContinentWeapons()
+		HideMission()
+	end
+	SetContinentTeamLabel()
+end
+
 --what happen when a turn starts
 function onNewTurn()
 	--will refresh the info on each tab weapon
@@ -1225,6 +1212,11 @@
 			InitWeaponsMenu(CurrentHedgehog)
 			CS.TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=0
 			CS.INIT_TEAMS[GetHogTeamName(CurrentHedgehog)] = 2
+			if GetHogLevel(CurrentHedgehog) ~= 0 then
+				-- Set random continent for bots
+				SetWeapon(amNothing)
+				CS.CONFIRM_CONTINENT_SELECTION=500
+			end
 
 		else
 			--if its not the initialization turn
@@ -1650,6 +1642,12 @@
 	end
 end
 
+function SetContinentTeamLabel()
+	if not CS.GAME_STARTED then
+		SetTeamLabel(GetHogTeamName(CurrentHedgehog), CS.CONTINENT_INFORMATION[CS.TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]][1])
+	end
+end
+
 function onGameTick()
 	-- This is a trick to show the continent label delayed by 1 tick
 	if CS.CONTINENT_LABEL_TIMER > 0 then
@@ -1690,7 +1688,7 @@
 			CS.TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]=GetRandom(#CS.CONTINENT_INFORMATION)+1
 			SetContinentWeapons()
 			HideMission()
-			ShowContinentLabel(0)
+			ShowContinentLabel()
 		else
 			ShowContinentLabel()
 		end
--- a/share/hedgewars/Data/Scripts/Multiplayer/DiagonalMaze.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Scripts/Multiplayer/DiagonalMaze.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -1,13 +1,38 @@
+HedgewarsScriptLoad("/Scripts/Params.lua")
+local overrideFeatureSize = true
+local mazeScale = 0
 
 function onPreviewInit()
 onGameInit()
 end
 
+function onParameters()
+    parseParams()
+    if params["scalemap"] ~= nil then 
+        overrideFeatureSize = false 
+    end
+    if params["mazescale"] ~= nil then
+        mazeScale = tonumber(params["mazescale"])
+    end
+end
+
+
 function onGameInit()
+    local step
+    local width 
+
     MapGen = mgDrawn
     TemplateFilter = 0
-    local step = 80 + 10 * MapFeatureSize
-    local width = 1 + div(math.max(0, MapFeatureSize-12), 6)
+
+    if mazeScale > 0 then
+        step = 80 + 10 * mazeScale
+        width = 1 + div(math.max(0, mazeScale-12), 6)
+    else
+        step = 80 + 10 * MapFeatureSize
+        width = 1 + div(math.max(0, MapFeatureSize-12), 6)
+    end
+    -- reset feature size after use, to disable scaling
+    if overrideFeatureSize then MapFeatureSize = 12 end
     -- center maze
     local xoff = div((4000 % step), 2)
     for y = 48,2048,step do
--- a/share/hedgewars/Data/Scripts/Multiplayer/Frenzy.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Frenzy.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -11,12 +11,12 @@
 local frenzyAmmos = {
 	amBazooka,
 	amGrenade,
-	amMolotov,
 	amShotgun,
 	amFirePunch,
 	amMine,
+	amMolotov,
+	amBlowTorch,
 	amJetpack,
-	amBlowTorch,
 	amTeleport,
 	amLowGravity
 }
@@ -26,21 +26,24 @@
 	ruleSet = "" ..
 	loc("RULES:") .. " |" ..
 	loc("Each turn is only ONE SECOND!") .. "|" ..
-	loc("Use your ready time to think.") .. "|" ..
-	loc("Slot keys save time! (F1-F10 by default)") .. "| |"
-	for i=1, #frenzyAmmos do
-		ruleSet = ruleSet .. string.format(loc("Slot %d: %s"), i, GetAmmoName(frenzyAmmos[i])) .. "|"
+	loc("Use your ready time to think.")
+	if INTERFACE ~= "touch" then
+		ruleSet = ruleSet .. "|" ..
+		loc("Slot keys save time! (F1-F10 by default)") .. "| |"
+		for i=1, #frenzyAmmos do
+			ruleSet = ruleSet .. string.format(loc("Slot %d: %s"), i, GetAmmoName(frenzyAmmos[i])) .. "|"
+		end
 	end
 
 	ShowMission(loc("FRENZY"),
                 loc("A frenetic Hedgewars mini-game"),
-                ruleSet, 0, 4000)
+                ruleSet, -amMolotov, 4000)
 
 end
 
 function onGameInit()
 
-	if TurnTime > 10001 then
+	if TurnTime > 8000 then
 		Ready = 8000
 	else
 		Ready = TurnTime
@@ -63,6 +66,10 @@
 	--WaterRise = 47
 	--HealthDecrease = 0
 
+	for s=1, #frenzyAmmos do
+		SetAmmoSlot(frenzyAmmos[s], s)
+	end
+	SetAmmoSlot(amSkip, 10)
 end
 
 function onGameStart()
--- a/share/hedgewars/Data/Scripts/Multiplayer/HedgeEditor.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Scripts/Multiplayer/HedgeEditor.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -297,8 +297,6 @@
 
 -- Misc. state variables
 local hedgeEditorMissionPanelShown = false
-local tagGears = {}
-local showGearTags = true
 
 local tagCursorX, tagCursorY
 
@@ -314,6 +312,7 @@
 				{amMortar, 	"amMortar"},
 				{amDrill, 	"amDrill"},
 				{amSnowball, 	"amSnowball"},
+				{amKnife,	"amKnife"},
 
 				{amGrenade,	"amGrenade"},
 				{amClusterBomb,	"amClusterBomb"},
@@ -326,7 +325,6 @@
 				{amDEagle,	"amDEagle"},
 				{amSniperRifle,	"amSniperRifle"},
 				{amSineGun, 	"amSineGun"},
-				{amFlamethrower,"amFlamethrower"},
 				{amIceGun, 	"amIceGun"},
 				{amMinigun, 	"amMinigun"},
 
@@ -353,7 +351,7 @@
 
 				{amPickHammer,	"amPickHammer"},
 				{amBlowTorch, 	"amBlowTorch"},
-				{amKnife,	"amKnife"},
+				{amFlamethrower,"amFlamethrower"},
 
 				{amBirdy,	"amBirdy"},
 
@@ -594,6 +592,7 @@
 local waypointPreviewSprite = nil
 
 local cGear = nil -- detects placement of girders and objects (using airattack)
+local cGearPlacementDone = false
 local curWep = amNothing
 local leftHeld = false
 local rightHeld = false
@@ -2261,33 +2260,33 @@
 	WriteLnToConsole("")
 	WriteLnToConsole("	if victoryObj > 0 then ")
 	WriteLnToConsole("		if victoryObj == 1 then ")
-	WriteLnToConsole("			vComment = loc(\"- Destroy the red target\") .. \"|\"")
+	WriteLnToConsole([[			vComment = loc("- Destroy the red target") .. "|"]])
 	WriteLnToConsole("		else ")
-	WriteLnToConsole("			vComment = loc(\"- Destroy the red targets\") .. \"|\"")
+	WriteLnToConsole([[			vComment = loc("- Destroy the red targets") .. "|"]])
 	WriteLnToConsole("		end")
 	WriteLnToConsole("	end")
 	WriteLnToConsole("")
 	WriteLnToConsole("	if collectObj > 0 then ")
 	WriteLnToConsole("		if collectObj == 1 then ")
-	WriteLnToConsole("			collectComment = loc(\"- Collect the blue crate\") .. \"|\"")
+	WriteLnToConsole([[			collectComment = loc("- Collect the blue crate") .. "|"]])
 	WriteLnToConsole("		else ")
-	WriteLnToConsole("			collectComment = loc(\"- Collect all the blue crates\") .. \"|\"")
+	WriteLnToConsole([[			collectComment = loc("- Collect all the blue crates") .. "|"]])
 	WriteLnToConsole("		end")
 	WriteLnToConsole("	end")
 	WriteLnToConsole("")
 	WriteLnToConsole("	if (collectObj == 0) and (victoryObj == 0) then")
-	WriteLnToConsole("		vComment = loc(\"- Destroy the enemy\") .. \"|\"")
+	WriteLnToConsole([[		vComment = loc("- Destroy the enemy") .. "|"]])
 	WriteLnToConsole("	end")
 	WriteLnToConsole("")
 	WriteLnToConsole("	if failObj > 0 then ")
 	WriteLnToConsole("		if failObj == 1 then ")
-	WriteLnToConsole("			fComment = loc(\"- The green target must survive\") .. \"|\"")
+	WriteLnToConsole([[			fComment = loc("- The green target must survive") .. "|"]])
 	WriteLnToConsole("		else ")
-	WriteLnToConsole("			fComment = loc(\"- The green targets must survive\") .. \"|\"")
+	WriteLnToConsole([[			fComment = loc("- The green targets must survive") .. "|"]])
 	WriteLnToConsole("		end")
 	WriteLnToConsole("	end")
 	WriteLnToConsole("")
-	WriteLnToConsole("	ShowMission(loc(\"User Mission\"), loc(\"Mission\"), collectComment .. vComment .. fComment, 1, 0)")
+	WriteLnToConsole([[	ShowMission(loc("User Mission"), loc("Mission"), collectComment .. vComment .. fComment, 1, 0)]])
 	WriteLnToConsole("")
 	WriteLnToConsole("end")
 
@@ -2338,12 +2337,12 @@
 	WriteLnToConsole("")
 	WriteLnToConsole("			if (c ==  \"victory\") and (GetHogLevel(hhs[i]) ~= 0) then")
 	WriteLnToConsole("				DismissTeam(GetHogTeamName(hhs[i]))")
-	WriteLnToConsole("				AddCaption(loc(\"Victory!\"), capcolDefault, capgrpGameState)")
-	WriteLnToConsole("				ShowMission(loc(\"User Mission\"), loc(\"Mission\"), loc(\"Mission succeeded!\"), 0, 0)")
+	WriteLnToConsole([[				AddCaption(loc("Victory!"), capcolDefault, capgrpGameState)]])
+	WriteLnToConsole([[				ShowMission(loc("User Mission"), loc("Mission"), loc("Mission succeeded!"), 0, 0)]])
 	WriteLnToConsole("			elseif (c ==  \"failure\") and (GetHogLevel(hhs[i]) == 0) then")
 	WriteLnToConsole("				DismissTeam(GetHogTeamName(hhs[i]))")
-	WriteLnToConsole("				AddCaption(loc(\"Defeat!\"), capcolDefault, capgrpGameState)")
-	WriteLnToConsole("				ShowMission(loc(\"User Mission\"), loc(\"Mission\"), loc(\"Mission failed!\"), -amSkip, 0)")
+	WriteLnToConsole([[				AddCaption(loc("Defeat!"), capcolDefault, capgrpGameState)]])
+	WriteLnToConsole([[				ShowMission(loc("User Mission"), loc("Mission"), loc("Mission failed!"), -amSkip, 0)]])
 	WriteLnToConsole("			elseif (c ==  \"victory\") and (GetHogLevel(hhs[i]) == 0) then")
 	WriteLnToConsole("				PlaySound(sndVictory,hhs[i]) -- check if we actually need this")
 	WriteLnToConsole("			end")
@@ -2539,7 +2538,6 @@
 				loc("Deletion Mode: [5]") .. "|" ..
 				" " .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
-				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
 				"", -amGirder, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
@@ -2557,7 +2555,6 @@
 				loc("Deletion Mode: [5]") .. "|" ..
 				" " .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
-				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
 				"", -amRubber, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
@@ -2572,7 +2569,6 @@
 				" " .. "|" ..
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
-				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
 				"", 8, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
@@ -2586,7 +2582,6 @@
 				" " .. "|" ..
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
-				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
 				"", -amKnife, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
@@ -2600,7 +2595,6 @@
 				" " .. "|" ..
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
-				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
 				"", 1, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
@@ -2615,7 +2609,6 @@
 				" " .. "|" ..
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
-				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
 				"", -amCMGearPlacementTool, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
@@ -2630,7 +2623,6 @@
 				" " .. "|" ..
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
-				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
 				"", -amMine, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
@@ -2645,7 +2637,6 @@
 				" " .. "|" ..
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
-				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
 				"", 9, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
@@ -2660,7 +2651,6 @@
 				" " .. "|" ..
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
-				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
 				"", -amSMine, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
@@ -2675,7 +2665,6 @@
 				" " .. "|" ..
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
-				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
 				"", -amAirMine, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
@@ -2690,7 +2679,6 @@
 				" " .. "|" ..
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
-				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
 				"", 7, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
@@ -2705,7 +2693,6 @@
 				" " .. "|" ..
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
-				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
 				"", 5, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
@@ -2720,7 +2707,6 @@
 				" " .. "|" ..
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
-				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
 				"", 6, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
@@ -2735,7 +2721,6 @@
 				" " .. "|" ..
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
-				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
 				"", -amCMGearPlacementTool, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
@@ -2756,7 +2741,6 @@
 				" " .. "|" ..
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
-				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
 				"", 2, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
@@ -2777,7 +2761,6 @@
 				" " .. "|" ..
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
-				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
 				"", -amCMGearPlacementTool, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
@@ -2792,7 +2775,6 @@
 				" " .. "|" ..
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
-				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
 				"", 0, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
@@ -2806,7 +2788,6 @@
 				" " .. "|" ..
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
-				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
 				"", 3, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
@@ -2821,7 +2802,6 @@
 				" " .. "|" ..
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
-				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
 				"", 3, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
@@ -2836,7 +2816,6 @@
 				" " .. "|" ..
 				loc("Change Placement Mode: [Up], [Down]") .. "|" ..
 				loc("Toggle Help: [Precise]+[1]") .. "|" ..
-				loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
 				"", 2, 60000, not helpDisabled
 				)
 		hedgeEditorMissionPanelShown = false
@@ -3092,14 +3071,15 @@
 		x,y = GetGearTarget(cGear)
 
 		if GetGearType(cGear) == gtAirAttack and GetCurAmmoType() == amCMGearPlacementTool then
-			DeleteGear(cGear)
+			SetGearMessage(cGear, bor(GetGearMessage(cGear), gmDestroy))
+			if not cGearPlacementDone then
+				PlaceObject(x, y)
+				cGearPlacementDone = true
+			end
+		elseif GetGearType(cGear) == gtGirder and not cGearPlacementDone then
+			CGR = GetState(cGear)
 			PlaceObject(x, y)
-		elseif GetGearType(cGear) == gtGirder then
-
-			CGR = GetState(cGear)
-
-			-- improve rectangle test based on CGR when you can be bothered
-			PlaceObject(x, y)
+			cGearPlacementDone = true
 		end
 
 	end
@@ -3107,122 +3087,6 @@
 	-- Show cursor coords
 	updateCursorCoords()
 
-	-- Barrel health tags, mine timer tags and health crate health tags
-	do
-		local actualValue	-- internal value
-		local printedValue	-- value exposed to HUD
-		for g, v in pairs(tagGears) do
-			local gt = GetGearType(g)
-			if v == -1 then
-				if gt == gtCase then
-					if(band(GetGearPos(g), 0x2) ~= 0) then
-						v = AddVisualGear(0, 0, vgtHealthTag, GetHealth(g), true)
-						SetVisualGearValues(v, nil, nil, 0, 0, nil, nil, nil, nil, 240000, 0x808080FF)
-						tagGears[g] = v
-					else
-						tagGears[g] = nil
-					end
-				else
-					if gt == gtMine and GetHealth(g) == 0 then
-						local _, damage, health
-						_, _, _, _, _, _, _, _, _, _, _, damage = GetGearValues(g)
-						health = 36 - damage
-						v = AddVisualGear(0, 0, vgtHealthTag, health, true)
-						SetVisualGearValues(v, nil, nil, 0, 0, nil, nil, nil, nil, 240000, 0x808080FF)
-						tagGears[g] = v
-					end
-				end
-			end
-			-- Delete tag for drowning gears
-			if(band(GetState(g), gstDrowning) ~= 0) then
-				DeleteVisualGear(v)
-				tagGears[g] = nil
-			-- Delete tag for frozen mines and air mines
-			elseif(band(GetState(g), gstFrozen) ~= 0 and (gt == gtAirMine or gt == gtSMine)) then
-				DeleteVisualGear(v)
-				tagGears[g] = nil
-			elseif(tagGears[g] ~= nil and tagGears[g] ~= -1) then
-				local tag, actualvalue, offset_x, offset_y
-				tag = GetState(v)
-				if(gt == gtExplosives) then
-					actualValue = GetHealth(g)
-					printedValue = actualValue
-					offset_y = -20
-					offset_x = 0
-				elseif(gt == gtAirMine) then
-					if(band(GetState(g), gstAttacking) ~= 0) then
-						actualValue = GetTimer(g)
-						printedValue = actualValue
-					else
-						local _
-						_, _, actualValue = GetGearValues(g)
-						printedValue = actualValue
-					end
-					offset_y = 28
-					offset_x = 16
-				elseif(gt == gtCase) then
-					actualValue = GetHealth(g)
-					printedValue = actualValue
-					offset_y = -20
-					offset_x = 1
-				elseif(gt == gtMine) then
-					if(GetHealth(g) ~= 0) then
-						-- Non-dud: Show timer
-						actualValue = GetTimer(g)
-						printedValue = actualValue
-						offset_y = 28
-						offset_x = 16
-					else
-						-- Dud: Show health
-						local _
-						_, _, _, _, _, _, _, _, _, _, _, actualValue = GetGearValues(g)
-						printedValue = 36 - actualValue
-						offset_y = -12
-						offset_x = 0
-					end
-				elseif(gt == gtSMine) then
-					actualValue = GetTimer(g)
-					printedValue = actualValue
-					offset_y = 28
-					offset_x = 16
-				end
-				--[[ The timer tag normally disappears near the water line, this is a really
-				ugly hack to adjust the position of the tag so it is always displayed.
-				FIXME: Find a better solution to fix this. ]]
-				if (GetY(g) + offset_y) > WaterLine and (GetY(g) + offset_y) < WaterLine + 30 then
-					offset_y = (WaterLine - GetY(g))
-				end
-				local tint
-				if(not showGearTags) then
-					-- Hide the tags
-					tint = 0x00000000
-				elseif(gt == gtCase) then
-					tint = 0x80FF80FF
-				elseif(gt == gtExplosives or (gt == gtMine and GetHealth(g) == 0)) then
-					tint = 0x808080FF
-				elseif(band(GetState(g), gstAttacking) ~= 0) then
-					if(actualValue % 1000 > 500) then
-						tint = 0xFFA0A0FF
-					else
-						tint = 0xFF4040FF
-					end
-				else
-					tint = 0xFFFFFFFF
-				end
-				if(actualValue ~= tag) then
-					--[[ If timer/health changed, delete visual gear and add it again.
-					Changing the visual gear state does not have any effect, so we need this hack ]]
-					DeleteVisualGear(v)
-					v = AddVisualGear(GetX(g)+offset_x, GetY(g)+offset_y, vgtHealthTag, printedValue, true)
-					SetVisualGearValues(v, nil, nil, 0, 0, nil, nil, nil, nil, 240000, tint)
-					tagGears[g] = v
-				else
-					-- Just update position if the health did not change
-					SetVisualGearValues(v, GetX(g)+offset_x, GetY(g)+offset_y, 0, 0, nil, nil, nil, nil, 240000, tint)
-				end
-			end
-		end
-	end
 end
 
 --------------------------------------------------
@@ -3258,14 +3122,6 @@
 			AddCaption(loc("Help Enabled"), colorInfoMessage, capgrpVolume)
 		end
 		updateHelp()
-	elseif (preciseOn == true) and (s == 3) then
-		showGearTags = not(showGearTags)
-		if showGearTags then
-			AddCaption(loc("Gear information shown"), colorInfoMessage, capgrpVolume)
-		else
-			AddCaption(loc("Gear information hidden"), colorInfoMessage, capgrpVolume)
-		end
-
 	elseif (cat[cIndex] == loc("Sprite Placement Mode")) or (cat[cIndex] == loc("Girder Placement Mode")) or (cat[cIndex] == loc("Rubber Placement Mode")) or (cat[cIndex] == loc("Sprite Modification Mode")) then
 
 		if (cat[cIndex] == loc("Rubber Placement Mode")) then
@@ -3493,6 +3349,7 @@
 
 	Explosives = 0
 	MinesNum = 0
+	AirMinesNum = 0
 
 	EnableGameFlags(gfInfAttack, gfDisableWind)
 
@@ -3510,7 +3367,6 @@
 		loc("Place Rubber: Rubber") .. "|" ..
 		loc("Place Gears (and more): Gear Placement Tool") .. "|" ..
 		loc("Toggle Help: [Precise]+[1]") .. "|" ..
-		loc("Toggle Gear Information: [Precise]+[3]") .. "|" ..
 		" " .. "|" ..
 		loc("Editing Commands: (Use while no weapon is selected)") .. "|" ..
 		loc("Save Level: [Precise]+[4]") .. "|" ..
@@ -3842,37 +3698,10 @@
 
 	if (GetGearType(gear) == gtAirAttack and GetCurAmmoType() == amCMGearPlacementTool) or (GetGearType(gear) == gtGirder) then
 		cGear = gear
+		cGearPlacementDone = false
 	end
 
 	local tagTint
-	if showGearTags then
-		tagTint = 0xFFFFFFFF
-	else
-		tagTint = 0x00000000
-	end
-	if ((GetGearType(gear) == gtMine and GetHealth(gear) ~= 0) or (GetGearType(gear) == gtSMine and band(GetState(gear), gstFrozen) == 0)) then
-		local v = AddVisualGear(0, 0, vgtHealthTag, GetTimer(gear), true)
-		SetVisualGearValues(v, nil, nil, 0, 0, nil, nil, nil, nil, 240000, tagTint)
-		tagGears[gear] = v
-	elseif ((GetGearType(gear) == gtMine and GetHealth(gear) == 0)) then
-		local _, dmg
-		_, _, _, _, _, _, _, _, _, _, dmg = GetGearValues(gear)
-		local v = AddVisualGear(0, 0, vgtHealthTag, 36 - dmg, true)
-		SetVisualGearValues(v, nil, nil, 0, 0, nil, nil, nil, nil, 240000, tagTint)
-		tagGears[gear] = v
-	elseif (GetGearType(gear) == gtAirMine and band(GetState(gear), gstFrozen) == 0) then
-		local _, wdTimer
-		_, _, wdTimer = GetGearValues(gear)
-		local v = AddVisualGear(0, 0, vgtHealthTag, wdTimer, true)
-		SetVisualGearValues(v, nil, nil, 0, 0, nil, nil, nil, nil, 240000, tagTint)
-		tagGears[gear] = v
-	elseif (GetGearType(gear) == gtCase) then
-		tagGears[gear] = -1
-	elseif (GetGearType(gear) == gtExplosives) then 
-		local v = AddVisualGear(0, 0, vgtHealthTag, GetHealth(gear), true)
-		SetVisualGearValues(v, nil, nil, 0, 0, nil, nil, nil, nil, 240000, tagTint)
-		tagGears[gear] = v
-	end
 
 	if isATrackedGear(gear) then
 		trackGear(gear)
@@ -3896,14 +3725,6 @@
 		cGear = nil
 	end
 
-	if (gt == gtMine or gt == gtSMine or gt == gtAirMine or gt == gtExplosives or gt == gtCase) then 
-		if(tagGears[gear] ~= -1) then
-			DeleteVisualGear(tagGears[gear])
-		end
-		tagGears[gear] = nil
-	end
-
-
 	if isATrackedGear(gear) then
 
 		if getGearValue(gear, "tCirc") ~= nil then
--- a/share/hedgewars/Data/Scripts/Multiplayer/Highlander.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Highlander.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -239,7 +239,7 @@
 end
 
 function onGameInit()
-	EnableGameFlags(gfInfAttack, gfRandomOrder, gfPerHogAmmo)
+	EnableGameFlags(gfInfAttack, gfPerHogAmmo)
 	DisableGameFlags(gfResetWeps, gfSharedAmmo)
 	HealthCaseProb = 100
 	if loyal then
--- a/share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -57,6 +57,9 @@
 local hogsLimit = 1
 
 local teamsDead = {}
+local teamsDeleted = {}
+local hogLimitHit = false
+local cnthhs
 
 local circles = {}
 local circleFrame = -1
@@ -128,7 +131,7 @@
 
 function showStartingInfo()
 
-    ShowMission(loc("Mutant"), loc("A Hedgewars tag game"), rules(), 1, 5000)
+    ShowMission(loc("Mutant"), loc("A Hedgewars tag game"), rules(), -amWatermelon, 5000)
 
 end
 
@@ -143,7 +146,7 @@
 end
 
 
-function limitHogs(gear)
+function limitHogsTeam(gear)
     cnthhs = cnthhs + 1
     if cnthhs > 1 then
         hogLimitHit = true
@@ -153,6 +156,13 @@
     end
 end
 
+function limitHogsClan(gear)
+    hogLimitHit = true
+    SetEffect(gear, heResurrectable, 0)
+    setGearValue(gear, "excess", true)
+    DeleteGear(gear)
+end
+
 function onGameStart()
     if ClansCount >= 2 then
         SendHealthStatsOff()
@@ -163,14 +173,35 @@
     teamScan()
     runOnHogs(saveStuff)
 
+    -- Enforce team and hog limits
     hogLimitHit = false
+
+    -- Rule 1: One team per clan
+    if TeamsCount > ClansCount then
+        local usedClans = {}
+        for i=0, TeamsCount - 1 do
+            local teamName = GetTeamName(i)
+            local clanNumber = GetTeamClan(teamName)
+            if not usedClans[clanNumber] then
+                usedClans[clanNumber] = true
+            else
+                runOnHogsInTeam(limitHogsClan, teamName)
+                teamsDeleted[teamName] = true
+                setTeamValue(teamName, "Score", getTeamValue(teamName, "Score") -99999)
+            end
+        end
+    end
+
+    -- Rule 2: One hog per team
     for i=0 , TeamsCount - 1 do
         cnthhs = 0
-        runOnHogsInTeam(limitHogs, GetTeamName(i))
+        runOnHogsInTeam(limitHogsTeam, GetTeamName(i))
     end
     if hogLimitHit then
+        -- TODO: Update warning message to include excess teams as well
         WriteLnToChat(loc("Only one hog per team allowed! Excess hogs will be removed."))
     end
+    trackTeams()
     showStartingInfo()
 end
 
@@ -234,7 +265,6 @@
 
 function onNewTurn()
 
-    trackTeams()
     killsCounter = 0
 
     if mutant == nil and TotalRounds >= 0 then
@@ -244,7 +274,10 @@
     checkScore()
 
     for i=0, TeamsCount-1 do
-        SendStat(siClanHealth, getTeamValue(GetTeamName(i), "Score"), GetTeamName(i))
+        local teamName = GetTeamName(i)
+        if not teamsDeleted[teamName] then
+            SendStat(siClanHealth, getTeamValue(teamName, "Score"), teamName)
+        end
     end
 
     giveWeapons(CurrentHedgehog)
@@ -436,11 +469,22 @@
 
     -- Score and stats stuff
     local showScore = ""
+    local rank = 0
+    local rankPlus = 1
+    local prevScore
     table.sort(teamsSorted, function(team1, team2) return getTeamValue(team1, "Score") > getTeamValue(team2, "Score") end)
     for i=1, TeamsCount do
-        SendStat(siPointType, loc("point(s)"))
         local score = getTeamValue(teamsSorted[i], "Score")
         local deaths = getTeamValue(teamsSorted[i], "DeadHogs")
+        if i == 1 or score < prevScore then
+            rank = rank + rankPlus
+            rankPlus = 1
+            prevScore = score
+        else
+            rankPlus = rankPlus + 1
+        end
+        SendStat(siPointType, "!POINTS")
+        SendStat(siTeamRank, rank)
         SendStat(siPlayerKills, score, teamsSorted[i])
 
         showScore = showScore .. string.format(loc("%s: %d (deaths: %d)"), teamsSorted[i], score, deaths) .. "|"
@@ -454,7 +498,7 @@
     ShowMission(loc("Mutant"),
         loc("Final result"),
         string.format(loc("Winner: %s"), teamsSorted[1]) .. "| |" .. loc("Scores:") .. " |" ..
-        showScore, 0, 15000)
+        showScore, 4, 15000)
 
         -- return winning team
         return teamsSorted[1]
@@ -601,7 +645,7 @@
 function teamScan()
 
         for j=0, TeamsCount-1 do
-            teamName = GetTeamName(j)
+            local teamName = GetTeamName(j)
             teamsDead[teamName] = false
             setTeamValue(teamName, "Score",0)
             setTeamValue(teamName, "Suicides",0)
--- a/share/hedgewars/Data/Scripts/Multiplayer/Racer.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Racer.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -505,10 +505,16 @@
                         totalComment = totalComment .. teamComment[i]
         end
 
+        local icon
+        if roundNumber >= roundLimit then
+                icon = 0
+        else
+                icon = 2
+        end
         ShowMission(    loc("Racer"),
                                         loc("Status update"),
                                         string.format(loc("Rounds complete: %d/%d"), roundNumber, roundLimit) .. "|" .. " " .. "|" ..
-                                        loc("Best team times: ") .. "|" .. totalComment, 0, 4000)
+                                        loc("Best team times: ") .. "|" .. totalComment, icon, 4000)
 
         -- end game if its at round limit
         if roundNumber >= roundLimit then
@@ -560,7 +566,7 @@
 
                 -- Write all the stats!
                 for i = 1, #sortedTeams do
-                        SendStat(siPointType, loc("milliseconds"))
+                        SendStat(siPointType, "!TIME")
 			SendStat(siTeamRank, tostring(clanRanks[GetTeamClan(sortedTeams[i].name)]))
                         SendStat(siPlayerKills, sortedTeams[i].score, sortedTeams[i].name)
                 end
@@ -695,7 +701,7 @@
         ShowMission(loc("Racer"),
         	loc("A Hedgewars mini-game"),
         	loc("Touch all waypoints as fast as you can!"),
-		2, 4000)
+		1, 4000)
 end
 
 function onGameStart()
@@ -834,6 +840,7 @@
         trackTime = 0
 
         currCount = 0 -- hopefully this solves problem
+        fastIndex = 0
         AddAmmo(CurrentHedgehog, amAirAttack, 0)
         gTimer = 0
 
@@ -856,9 +863,13 @@
                                 infoString = loc("Place 2 waypoints using the waypoint placement tool.")
                         end
                         ShowMission(loc("Racer"),
-                        loc("Waypoint placement phase"), infoString, 2, 4000)
+                        loc("Waypoint placement phase"), infoString, -amAirAttack, 4000)
                         AddAmmo(CurrentHedgehog, amAirAttack, 4000)
                         SetWeapon(amAirAttack)
+                        -- Bots skip waypoint placement
+                        if GetHogLevel(CurrentHedgehog) ~= 0 then
+                                SkipTurn()
+                        end
                 end
         end
 
@@ -1066,6 +1077,10 @@
     end
 end
 
+function onSkipTurn()
+    turnSkipped = true
+end
+
 function onAchievementsDeclaration()
     usedWeapons[amSkip] = nil
     usedWeapons[amExtraTime] = nil
--- a/share/hedgewars/Data/Scripts/Multiplayer/ShoppaMap.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Scripts/Multiplayer/ShoppaMap.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -1,5 +1,6 @@
 HedgewarsScriptLoad("/Scripts/Params.lua")
-
+local overrideFeatureSize = true
+local paramPadding = 0
 local ObjectList = {}
 
 -- Overall padding for roping freedom
@@ -12,6 +13,12 @@
     if params["teamrope"] ~= nil then
         TeamRope = true
     end
+    if params["scalemap"] ~= nil then 
+        overrideFeatureSize = false 
+    end
+    if params["padding"] ~= nil then
+        paramPadding = tonumber(params["padding"])
+    end
 end
 
 function onGearAdd(gear)
@@ -328,13 +335,17 @@
 
 function onGameInit()
     -- Calculate padding, determined  by map feature size
-    if MapFeatureSize <= 20 then
+	if paramPadding > 0 then
+		Padding = paramPadding
+	elseif MapFeatureSize <= 20 then
         -- 10 .. 710. Step size=35
         Padding = 10 + MapFeatureSize * 35
     else
         -- 780 .. 1060. Step size=70
         Padding = 710 + (MapFeatureSize-20) * 70
     end
+    -- reset feature size after use, to disable scaling
+    if overrideFeatureSize then MapFeatureSize = 12 end
 
     MapGen = mgDrawn
     TemplateFilter = 0
--- a/share/hedgewars/Data/Scripts/Multiplayer/Space_Invasion.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Space_Invasion.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -571,23 +571,24 @@
 	else
 		displayTime = 1
 	end
+	local icon
+	if lGameOver then
+		icon = 4
+	else
+		icon = 2
+	end
 	ShowMission(	loc("Space Invasion"),
 			statusText,
 			string.format(loc("Rounds complete: %d/%d"), SI.roundNumber, SI.roundLimit) .. "| " .. "|" ..
-			scoreText .. " |" ..entireC, 4, displayTime)
+			scoreText .. " |" ..entireC, icon, displayTime)
 
 	if lGameOver then
 		local winnerTeam = teamStats[1].name
-		for i = 0, (SI.numhhs-1) do
-			if GetHogTeamName(SI.hhs[i]) == winnerTeam then
-				SetState(SI.hhs[i], bor(GetState(SI.hhs[i]), gstWinner))
-			end
-		end
 		AddCaption(string.format(loc("%s wins!"), winnerTeam), capcolDefault, capgrpGameState)
 		SendStat(siGameResult, string.format(loc("%s wins!"), winnerTeam))
 
 		for i = 1, TeamsCount do
-			SendStat(siPointType, loc("points"))
+			SendStat(siPointType, "!POINTS")
 			SendStat(siPlayerKills, tostring(teamStats[i].score), teamStats[i].name)
 		end
 
@@ -966,12 +967,12 @@
 			PlaySound(sndDenied)
 		elseif (SI.beam == false) and (SI.shieldHealth > 80) then
 			SI.beam = true
-			SetVisualGearValues(SI.pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), 40, 255, 1, 10, 0, 300, 1, SI.colorShield)
+			SetVisualGearValues(SI.pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), 40, 255, 1, 10, 0, nil, 1, SI.colorShield-0x000000FF - -math.min(SI.shieldHealth, 255))
 			AddCaption( string.format(loc("Shield ON: %d power remaining"), SI.shieldHealth - 80), SI.colorShield, capgrpAmmostate)
 			PlaySound(sndInvulnerable)
 		else
 			SI.beam = false
-			SetVisualGearValues(SI.pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), 0, 0, 1, 10, 0, 0, 0, SI.colorShield)
+			SetVisualGearValues(SI.pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), nil, nil, nil, nil, nil, nil, nil, 0x0)
 			AddCaption( string.format(loc("Shield OFF: %d power remaining"), SI.shieldHealth - 80), SI.colorShield, capgrpAmmostate)
 		end
 	end
@@ -1049,7 +1050,7 @@
 		SI.startRadShots = math.floor(tonumber(params["pings"]))
 	end
 	if params["shield"] ~= nil then
-		SI.startShield = math.floor(tonumber(params["shield"]))
+		SI.startShield = math.min(250-80, math.floor(tonumber(params["shield"])))
 	end
 
 	if params["barrelbonus"] ~= nil then
@@ -1091,7 +1092,6 @@
 	end
 	CaseFreq = 0
 	HealthCaseProb = 0
-	Delay = 1000
 	SuddenDeathTurns = 50
 	WaterRise = 0
 	HealthDecrease = 0
@@ -1109,6 +1109,8 @@
 
 	SI.wepCount = 3
 
+	SetSoundMask(sndFlyAway, true)
+
 end
 
 function onGameStart()
@@ -1140,7 +1142,7 @@
 				loc("Toggle Shield: [Long jump]") .. "|" ..
 				loc("Radar Ping: [High jump]") .. "|" ..
 
-				"", 4, 5000
+				"", 8, 5000
 				)
 
 	CreateMeSomeCircles()
@@ -1572,13 +1574,14 @@
 ------------------------------------------------------------
 ------------------------------------------------------------
 
-function DoHorribleThings(cUID)
+function HandleRadarBlip(cUID)
 
 	-- work out the distance to the target
 	local g1X, g1Y = GetGearPosition(CurrentHedgehog)
 	local g2X, g2Y = SI.vCircX[cUID], SI.vCircY[cUID]
 	local q = g1X - g2X
 	local w = g1Y - g2Y
+	-- Floating point operations are safe, it's only for visuals
 	local r = math.sqrt( (q*q) + (w*w) )	--alternate
 
 	local opp = w
@@ -1687,7 +1690,7 @@
 
 	end
 
-	SI.pShield = AddVisualGear(0,0,vgtCircle,0,true)
+	SI.pShield = AddVisualGear(0,0,vgtCircle,200,true)
 
 end
 
@@ -2254,7 +2257,7 @@
 			SI.vCircY[i] = SI.vCircY[i] + SI.vCircDY[i]
 
 			if (CurrentHedgehog ~= nil) and (SI.rAlpha ~= 255) then
-				DoHorribleThings(i)
+				HandleRadarBlip(i)
 			end
 
 		end
@@ -2284,10 +2287,10 @@
 
 	if (CurrentHedgehog ~= nil) then
 		if SI.beam == true then
-			SetVisualGearValues(SI.pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), nil, nil, nil, nil, nil, 200, nil, SI.colorShield-0x000000FF - -SI.shieldHealth )
+			SetVisualGearValues(SI.pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), nil, nil, nil, nil, nil, nil, nil, SI.colorShield-0x000000FF - -math.min(SI.shieldHealth, 255))
 			DrawTag(SI.TAG_SHIELD)
 		else
-			SetVisualGearValues(SI.pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), nil, nil, nil, nil, nil, 0)
+			SetVisualGearValues(SI.pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), nil, nil, nil, nil, nil, nil, nil, 0x0)
 		end
 
 	end
--- a/share/hedgewars/Data/Scripts/Multiplayer/TechRacer.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Scripts/Multiplayer/TechRacer.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -399,12 +399,18 @@
 		end
 	end
 
+	local icon
+	if roundNumber >= roundLimit then
+		icon = 0
+	else
+		icon = 2
+	end
 	ShowMission(loc("TechRacer"),
 		loc("Status update"),
 		string.format(loc("Rounds complete: %d/%d"), roundNumber, roundLimit) .. "| |" ..
 		loc("Best team times: ") .. "|" ..
 		totalComment,
-		0, 4000)
+		icon, 4000)
 
 	-- end game if its at round limit
 	if roundNumber >= roundLimit then
@@ -456,7 +462,7 @@
 
 		-- Write all the stats!
 		for i = 1, #sortedTeams do
-			SendStat(siPointType, loc("milliseconds"))
+			SendStat(siPointType, "!TIME")
 			SendStat(siTeamRank, tostring(clanRanks[GetTeamClan(sortedTeams[i].name)]))
 			SendStat(siPlayerKills, sortedTeams[i].score, sortedTeams[i].name)
 		end
@@ -695,6 +701,7 @@
 	else
 		MapGen = mgDrawn
 	end
+	MapFeatureSize = 12
 
 	if mapID == nil then
 		mapID = 2 + GetRandom(7)
--- a/share/hedgewars/Data/Scripts/Multiplayer/The_Specialists.cfg	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Scripts/Multiplayer/The_Specialists.cfg	Fri Aug 16 10:59:50 2019 -0600
@@ -1,2 +1,2 @@
-*
+The_Specialists
 locked
--- a/share/hedgewars/Data/Scripts/Multiplayer/The_Specialists.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Scripts/Multiplayer/The_Specialists.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -1,99 +1,141 @@
 ----------------------------------
--- THE SPECIALISTS MODE 0.7
--- by mikade
+-- THE SPECIALISTS
+-- original style by mikade
 ----------------------------------
 
--- version history
------------------
--- version 0.1
------------------
--- concept test
+-- SCRIPT PARAMETER SYNTAX
+--[[
+With the script parameter, you can change the order of specialists per team.
+
+== Changing the specialists for all teams ==
+In the script parameter, put:
+
+    t=XXXXXXXX
 
-----------------
--- version 0.2
-----------------
--- added gfRandomOrder to gameflags
--- removed some deprecated variables/methods
--- fixed lack of portal reset
+Where 'X' is a “specialist letter” (see below). Each letter stands for
+the role of a hedgehog in the team (in that order).
+If you leave out a letter, that hedgehog will be the default.
 
-----------------
--- version 0.3
-----------------
--- added switching on start
--- removed switch from engineer weaponset
+== Changing the specialists for on a per-team basis ==
+Same as above, but instead of “t”, you use “t1”, “t2”, ... “t8” for
+each of the teams (team 1 to team 8).
+
+== Specialist letters ==
 
-----------------
--- version 0.4
-----------------
--- Attempted to:
--- fix potential switch explit
--- improve user feedback on start
+  S = Soldier
+  E = Engineer
+  N = Ninja
+  D = Demo
+  X = Sniper
+  H = Saint
+  P = Pyro
+  L = Loon
+
+== Examples ==
+Example 1:
 
-----------------
--- version 0.5
-----------------
--- provision for variable minetimer / demo mines set to 5000ms
--- don't autoswitch if player only has 1 hog on his team
+    t=SSSSPPPP
+
+4 soldiers and 4 pyros for all teams.
+
+Example 2:
 
-----------------
--- version 0.6
-----------------
--- for the meanwhile, don't drop any crates except health crates
+    t1=LPHXDNES,t2=NNNNNNNN
 
-----------------
--- version 0.7
-----------------
--- perhogadmsdf :D :D :D :D
+Team 1: Loon, Pyro, Saint, Sniper, Demo, Ninja, Engineer, Soldier.
+Team 2: All-ninja team.
+All other teams use the default settings.
+
+]]
 
 --------------------
---TO DO
+-- TODO
 --------------------
+-- add proper gameflag checking, maybe (so that we can throw in a .cfg and let the users break everything)
 
--- balance hog health, maybe
--- add proper gameflag checking, maybe (so that we can throw in a .cfg and let the users break everything)
 
 HedgewarsScriptLoad("/Scripts/Locale.lua")
 HedgewarsScriptLoad("/Scripts/Tracker.lua")
+HedgewarsScriptLoad("/Scripts/Params.lua")
+
+-- default team values
+local currTeamIdx = 0;
+local teamRoles = {
+	{'S','E','N','D','X','H','P','L'},
+	{'S','E','N','D','X','H','P','L'},
+	{'S','E','N','D','X','H','P','L'},
+	{'S','E','N','D','X','H','P','L'},
+	{'S','E','N','D','X','H','P','L'},
+	{'S','E','N','D','X','H','P','L'},
+	{'S','E','N','D','X','H','P','L'},
+	{'S','E','N','D','X','H','P','L'}
+};
 
 local numhhs = 0
 local hhs = {}
 
 local started = false
 
+function onParameters()
+	parseParams()
+	-- All teams
+	if params['t'] ~= nil then
+		for i = 1, 8 do
+			for j = 1, 8 do
+				if string.len(params['t']) >= j  then
+					teamRoles[i][j] = string.upper(string.sub(params['t'],j,j));
+				end
+			end
+		end
+	end
+	-- Specific team
+	for i = 1, 8 do
+		if params['t'..i] ~= nil then
+			for j = 1, 8 do
+				if string.len(params['t'..i]) >= j  then
+					teamRoles[i][j] = string.upper(string.sub(params['t'..i],j,j));
+				end
+			end
+		end
+	end
+end
+
 function onNewAmmoStore(groupIndex, hogIndex)
 
 	SetAmmo(amSkip, 9, 0, 0, 0)
+	groupIndex = groupIndex + 1
+	hogIndex = hogIndex + 1
 
-	if hogIndex == 0 then
+	if teamRoles[groupIndex][hogIndex] == 'S' then
 		SetAmmo(amBazooka, 1, 0, 0, 0)
 		SetAmmo(amGrenade, 1, 0, 0, 0)
 		SetAmmo(amShotgun, 1, 0, 0, 0)
-	elseif hogIndex == 1 then
+	elseif teamRoles[groupIndex][hogIndex] == 'E' then
 		SetAmmo(amGirder, 2, 0, 0, 0)
 		SetAmmo(amBlowTorch, 1, 0, 0, 0)
 		SetAmmo(amPickHammer, 1, 0, 0, 0)
-	elseif hogIndex == 2 then
+	elseif teamRoles[groupIndex][hogIndex] == 'N' then
 		SetAmmo(amRope, 9, 0, 0, 0)
 		SetAmmo(amParachute, 9, 0, 0, 0)
 		SetAmmo(amFirePunch, 1, 0, 0, 0)
-	elseif hogIndex == 3 then
+	elseif teamRoles[groupIndex][hogIndex] == 'D' then
 		SetAmmo(amDynamite, 1, 0, 0, 0)
 		SetAmmo(amMine, 1, 0, 0, 0)
 		SetAmmo(amDrill, 1, 0, 0, 0)
-	elseif hogIndex == 4 then
+	elseif teamRoles[groupIndex][hogIndex] == 'X' then
 		SetAmmo(amSniperRifle, 1, 0, 0, 0)
 		SetAmmo(amDEagle, 1, 0, 0, 0)
 		SetAmmo(amPortalGun, 2, 0, 0, 0)
-	elseif hogIndex == 5 then
+	elseif teamRoles[groupIndex][hogIndex] == 'H' then
 		SetAmmo(amSeduction, 9, 0, 0, 0)
 		SetAmmo(amResurrector, 1, 0, 0, 0)
 		SetAmmo(amInvulnerable, 1, 0, 0, 0)
-        SetAmmo(amLowGravity, 1, 0, 0, 0)
-	elseif hogIndex == 6 then
+		SetAmmo(amLowGravity, 1, 0, 0, 0)
+	elseif teamRoles[groupIndex][hogIndex] == 'P' then
 		SetAmmo(amFlamethrower, 1, 0, 0, 0)
 		SetAmmo(amMolotov, 1, 0, 0, 0)
 		SetAmmo(amNapalm, 1, 0, 0, 0)
-	elseif hogIndex == 7 then
+	elseif teamRoles[groupIndex][hogIndex] == 'L' then
 		SetAmmo(amBaseballBat, 1, 0, 0, 0)
 		SetAmmo(amGasBomb, 1, 0, 0, 0)
 		SetAmmo(amKamikaze, 1, 0, 0, 0)
@@ -109,95 +151,101 @@
 
 	for i = 0, (numhhs-1) do
 
-			currTeam = GetHogTeamName(hhs[i])
+		currTeam = GetHogTeamName(hhs[i])
 
-			if currTeam == lastTeam then
-					z = z + 1
-			else
-					z = 1
-			end
-
-			if z == 1 then
+		if currTeam == lastTeam then
+			z = z + 1
+		else
+			z = 1
+			currTeamIdx = currTeamIdx + 1;
+		end
 
-					SetHogName(hhs[i],loc("Soldier"))
-					SetHogHat(hhs[i], "sf_vega")
-					SetHealth(hhs[i],200)
-
-			elseif z == 2 then
+		-- Scale health of each hog with “initial health” setting from game scheme.
+		-- 100 = default health
+		-- 200 = double health for all hogs
+		-- 50 = half health for all hogs
+		local function scaleHealth(health)
+			local newHealth = div(health * InitHealth, 100)
+			-- At least 1 health
+			if newHealth <= 0 then
+				newHealth = 1
+			end
+			return newHealth
+		end
 
-					SetHogHat(hhs[i], "Glasses")
-					SetHogName(hhs[i],loc("Engineer"))
+		if teamRoles[currTeamIdx][z] == 'S' then
 
-			elseif z == 3 then
+			SetHogName(hhs[i],loc("Soldier"))
+			SetHogHat(hhs[i], "sf_vega")
+			SetHealth(hhs[i], scaleHealth(200))
 
-					SetHogName(hhs[i],loc("Ninja"))
-					SetHogHat(hhs[i], "NinjaFull")
-					SetHealth(hhs[i],80)
+		elseif teamRoles[currTeamIdx][z] == 'E' then
 
-			elseif z == 4 then
+			SetHogHat(hhs[i], "Glasses")
+			SetHogName(hhs[i],loc("Engineer"))
+			SetHealth(hhs[i], scaleHealth(100))
+
+		elseif teamRoles[currTeamIdx][z] == 'N' then
 
-					SetHogName(hhs[i],loc("Demo"))
-					SetHogHat(hhs[i], "Skull")
-					SetHealth(hhs[i],200)
+			SetHogName(hhs[i],loc("Ninja"))
+			SetHogHat(hhs[i], "NinjaFull")
+			SetHealth(hhs[i], scaleHealth(80))
 
-			elseif z == 5 then
+		elseif teamRoles[currTeamIdx][z] == 'D' then
 
-					SetHogName(hhs[i],loc("Sniper"))
-					SetHogHat(hhs[i], "Sniper")
-					SetHealth(hhs[i],120)
+			SetHogName(hhs[i],loc("Demo"))
+			SetHogHat(hhs[i], "Skull")
+			SetHealth(hhs[i], scaleHealth(200))
+
+		elseif teamRoles[currTeamIdx][z] == 'X' then
 
-			elseif z == 6 then
+			SetHogName(hhs[i],loc("Sniper"))
+			SetHogHat(hhs[i], "Sniper")
+			SetHealth(hhs[i], scaleHealth(120))
 
-					SetHogName(hhs[i],loc("Saint"))
-					SetHogHat(hhs[i], "angel")
-					SetHealth(hhs[i],300)
+		elseif teamRoles[currTeamIdx][z] == 'H' then
 
-			elseif z == 7 then
+			SetHogName(hhs[i],loc("Saint"))
+			SetHogHat(hhs[i], "angel")
+			SetHealth(hhs[i], scaleHealth(300))
 
-					SetHogName(hhs[i],loc("Pyro"))
-					SetHogHat(hhs[i], "Gasmask")
-					SetHealth(hhs[i],150)
+		elseif teamRoles[currTeamIdx][z] == 'P' then
 
-			elseif z == 8 then
+			SetHogName(hhs[i],loc("Pyro"))
+			SetHogHat(hhs[i], "Gasmask")
+			SetHealth(hhs[i], scaleHealth(150))
 
-					SetHogName(hhs[i],loc("Loon"))
-					SetHogHat(hhs[i], "clown")
-					SetHealth(hhs[i],100)
+		elseif teamRoles[currTeamIdx][z] == 'L' then
 
-			end
+			SetHogName(hhs[i],loc("Loon"))
+			SetHogHat(hhs[i], "clown")
+			SetHealth(hhs[i], scaleHealth(100))
 
-			lastTeam = GetHogTeamName(hhs[i])
+		end
+
+		lastTeam = GetHogTeamName(hhs[i])
 
 	end
 
 end
 
 function onGameInit()
-	ClearGameFlags()
-	EnableGameFlags(gfRandomOrder, gfResetWeps, gfInfAttack, gfPlaceHog, gfPerHogAmmo, gfSwitchHog)
-	Delay = 10
+	-- Force-disable harmful game flags
+	DisableGameFlags(gfSharedAmmo, gfKing)
+	-- Force-enable game-critical game flags
+	EnableGameFlags(gfPerHogAmmo, gfResetWeps)
+	-- NOTE: For your game scheme, these game flags are recommended: gfResetWeps, gfPlaceHog, gfSwitchHog, gfInfAttack
+
+	-- No weapon crates
 	HealthCaseProb = 100
+
+	-- Instructions
+	Goals = loc("The Specialists: Each hedgehog starts with its own weapon set")
 end
 
 function onGameStart()
 
 	CreateTeam()
-
-	ShowMission     (
-                                loc("THE SPECIALISTS"),
-                                loc("a Hedgewars mini-game"),
-
-                                loc("Eliminate the enemy specialists.") .. "|" ..
-                                " " .. "|" ..
-
-                                loc("Game Modifiers: ") .. "|" ..
-                                loc("Per-Hog Ammo") .. "|" ..
-                                loc("Weapons Reset") .. "|" ..
-                                loc("Unlimited Attacks") .. "|" ..
-
-                                "", 4, 4000
-                                )
-
 	trackTeams()
 
 end
@@ -206,13 +254,13 @@
 function onNewTurn()
 
 	started = true
-	AddCaption(loc("Prepare yourself") .. ", " .. GetHogName(CurrentHedgehog).. "!")
+	AddCaption(string.format(loc("Prepare yourself, %s!"), GetHogName(CurrentHedgehog)))
 
 end
 
 function onGearAdd(gear)
 
-    if GetGearType(gear) == gtHedgehog then
+	if GetGearType(gear) == gtHedgehog then
 		hhs[numhhs] = gear
 		numhhs = numhhs + 1
 	elseif (GetGearType(gear) == gtMine) and (started == true) then
--- a/share/hedgewars/Data/Scripts/Multiplayer/Tumbler.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Tumbler.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -632,6 +632,7 @@
 	wepCount = 3
 
 	DisableGameFlags(gfArtillery + gfSharedAmmo + gfPerHogAmmo + gfTagTeam + gfPlaceHog + gfInvulnerable)
+	SetSoundMask(sndFlyAway, true)
 
 end
 
@@ -670,7 +671,7 @@
 			clockStr ..
 			loc("Ammo is reset at the end of your turn.") .. "|" ..
 
-			"", 4, 4000
+			"", -amMine, 4000
 			)
 
 end
--- a/share/hedgewars/Data/Scripts/Multiplayer/Tunnels.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Tunnels.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -7,9 +7,12 @@
 function onGameInit()
     MapGen = mgDrawn
     TemplateFilter = 0
+    local mapComplexity = MapFeatureSize
+    -- reset feature size after use, to disable scaling
+    MapFeatureSize = 12
     fillMap(false)
     side = 0
-    for i = 0,1+MapFeatureSize*2 do
+    for i = 0,1+mapComplexity*2 do
         if side > 3 then 
             size = GetRandom(4)+4
         else
--- a/share/hedgewars/Data/Scripts/Multiplayer/WxW.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Scripts/Multiplayer/WxW.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -696,7 +696,11 @@
 	end
 
 	local baseColor, radius, alpha
-	if getGearValue(gear, "frozen") then
+	if CurrentHedgehog == nil or band(GetState(CurrentHedgehog), gstHHDriven) == 0 then
+		radius = 40
+		baseColor = 0xFFFFFFFF
+		alpha = 255
+	elseif getGearValue(gear, "frozen") then
 		radius = 25
 		baseColor = 0xFFFFFFFF
 		alpha = math.min(255, rAlpha+127)
@@ -720,6 +724,7 @@
 	g2X, g2Y = GetX(gear), GetY(gear)
 	q = g1X - g2X
 	w = g1Y - g2Y
+	-- Floating point operations are safe, it's only for visuals
 	r = math.sqrt( (q*q) + (w*w) )	--alternate
 
 	RCX = getGearValue(gear,"RX")
@@ -848,9 +853,21 @@
 
 end
 
+function onCaseDrop()
+	local crates
+	if roundN == 100 then
+		allowCrate = crateGearsInGame < maxCrates
+		crates = CheckCrateConditions()
+	end
+	if type(crates) == "table" and #crates > 0 and CurrentHedgehog then
+		PlaySound(sndReinforce, CurrentHedgehog)
+	end
+end
+
 function CheckCrateConditions()
 
 	local crateSpawn = AreCratesUnlocked()
+	local crates = {}
 
 	if crateSpawn == true and crateSpawned == false then
 		UnfreezeCrates()
@@ -861,7 +878,7 @@
 				toSpawn = maxCrates - cratesInGame
 			end
 			for i=1,toSpawn do
-				SpawnSupplyCrate(0, 0, weapons[1+GetRandom(#weapons)] )
+				table.insert(crates, SpawnSupplyCrate(0, 0, weapons[1+GetRandom(#weapons)]))
 			end
 			rPingTimer = 0
 			rAlpha = 0
@@ -871,6 +888,7 @@
 		end
 	end
 
+	return crates
 end
 
 function onGearWaterSkip(gear)
@@ -935,6 +953,9 @@
 
 function HandleBorderEffects()
 
+	if CurrentHedgehog == nil or band(GetState(CurrentHedgehog), gstHHDriven) == 0 then
+		return
+	end
 	effectTimer = effectTimer + 1
 	if effectTimer > 15 then --25
 
@@ -956,7 +977,7 @@
 	AddCaption(loc("Please place your hedgehog first!"), msgColorWarn, capgrpMessage2)
 end
 
-function onLJump()
+function AcceptConfiguration()
 	if roundN == 1 then
 		PlaySound(sndPlaced)
 		SetInputMask(0xFFFFFFFF)
@@ -980,6 +1001,12 @@
 		end
 		PlaySound(sndYesSir, CurrentHedgehog)
 		FinalizeMenu()
+	end
+end
+
+function onLJump()
+	if roundN == 1 then
+		AcceptConfiguration()
 	elseif roundN == 2 then
 		PlaceWarn()
 	elseif roundN == 100 then
@@ -1255,7 +1282,8 @@
 	end
 
 	if useMenu then
-		ShowMission(loc("Wall to wall"), loc("Please wait …"), "", 2, 300000)
+		ShowMission(loc("Wall to wall"), loc("Please wait …"), "", 2, 0)
+		HideMission()
 		UpdateMenu()
 	else
 		if GetGameFlag(gfPlaceHog) then
@@ -1269,6 +1297,17 @@
 	end
 end
 
+function onEndTurn()
+	crateSpawned = false
+	crateCollected = false
+	wallsLeft = #wTouched
+	for i = 1, #wTouched do
+		wTouched[i] = false
+	end
+	hasSurfed = false
+	allWallsHit = false
+end
+
 function onNewTurn()
 	turnsCount = turnsCount + 1
 
@@ -1290,25 +1329,15 @@
 		end
 	end
 
-	wallsLeft = #wTouched
-
-	for i = 1, #wTouched do
-		wTouched[i] = false
-	end
-
-	hasSurfed = false
-	allWallsHit = false
-	crateCollected = false
-
-	crateSpawned = false
-
 	if roundN == 100 then
-		allowCrate = crateGearsInGame < maxCrates
 
 		local teamName = GetHogTeamName(CurrentHedgehog)
 
 		-- Restore team's radar mode
 		radarMode = getTeamValue(teamName, "radarMode")
+		if radarMode == nil then
+			radarMode = 0
+		end
 
 		if not AreCratesUnlocked() then
 			FreezeCrates()
@@ -1332,8 +1361,6 @@
 			setTeamValue(teamName, "skipPenalty", false)
 		end
 
-	else
-		allowCrate = false
 	end
 
 	if roundN == 1 then
@@ -1343,6 +1370,9 @@
 		UpdateMenu()
 		AddCaption(string.format(loc("%s may choose the rules."), GetHogTeamName(CurrentHedgehog)), msgColorTech, capgrpGameState)
 		HandleStartingStage()
+		if GetHogLevel(CurrentHedgehog) ~= 0 then
+			AcceptConfiguration()
+		end
 	end
 
 end
@@ -1559,7 +1589,7 @@
 				preMenuCfg..
 				missionComment ..
 				postMenuCfg ..
-				"", 2, 9999000, true
+				"", 3, 9999000, true
 				)
 
 end
@@ -1573,8 +1603,10 @@
 			gTimer = 1
 
 			if roundN == 100 then
-				CheckForWallCollision()
-				CheckCrateConditions()
+				if band(GetState(CurrentHedgehog), gstHHDriven) ~= 0 then
+					CheckForWallCollision()
+					CheckCrateConditions()
+				end
 
 				if (GetGearType(GetFollowGear()) == gtCase) then
 					FollowGear(CurrentHedgehog)
@@ -1620,11 +1652,12 @@
 
 		end
 
-		HandleBorderEffects()
-		HandleCircles()
 
 	end
 
+	HandleBorderEffects()
+	HandleCircles()
+
 end
 
 local menuRepeatTimer = 0
@@ -1654,7 +1687,7 @@
 		if vg then
 			table.insert(rCirc, vg)
 			setGearValue(gear,"CIRC",vg)
-			SetVisualGearValues(vg, 0, 0, 100, 255, 1, 10, 0, 40, 3, 0xff00ffff)
+			SetVisualGearValues(vg, 0, 0, 100, 255, 1, 10, 0, 40, 3, 0x0)
 		end
 		setGearValue(gear,"RX",0)
 		setGearValue(gear,"RY",0)
--- a/share/hedgewars/Data/Scripts/SimpleMission.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Scripts/SimpleMission.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -27,6 +27,7 @@
 
 HedgewarsScriptLoad("/Scripts/Locale.lua")
 HedgewarsScriptLoad("/Scripts/Tracker.lua")
+HedgewarsScriptLoad("/Scripts/Utils.lua")
 
 --[[
 SimpleMission(params)
@@ -53,27 +54,31 @@
 	- probability		probability in crates (default: 0)
 
 	TEAM DATA
+	- isMissionTeam		if true, this is the player's chosen team for this mission (default: false)
 	- hogs			table of hedgehogs in this team (must contain at least 1 hog)
-	- name			team name
 	- clanID		ID of the clan to which this team belongs to. Counting starts at 0.
 				By default, each team goes into its own clan.
 				Important: The clan of the player and allies MUST be 0.
 				Important: You MUST either set the clan ID explicitly for all teams or none of them.
+	These arguments will be ignored if this is a mission team:
+	- name			team name
 	- flag			flag name (default: hedgewars)
 	- grave			grave name (has default grave for each team)
 	- fort			fort name (default: Castle)
+	- voice			voicepack (default: Default_qau)
 
 	HEDGEHOG DATA:
 	- id			optional identifier for goals
-	- name			hog name
+	- health		hog health (default: 100)
+	- ammo			table of ammo types
 	- x, y			hog position (default: spawns randomly on land)
-	- botLevel		1-5: Bot level (lower=stronger). 0=human player (default: 0)
-	- hat			hat name (default: NoHat)
-	- health		hog health (default: 100)
 	- poisoned		if true, hedgehog starts poisoned with 5 poison damage. Set to a number for other poison damage (default: false)
 	- frozen		if true, hedgehogs starts frozen (default: false)
 	- faceLeft		initial facing direction. true=left, false=false (default: false)
-	- ammo			table of ammo types
+	These arguments will be ignored if the hog is in a mission team:
+	- name			hog name
+	- botLevel		1-5: Bot level (lower=stronger). 0=human player (default: 0)
+	- hat			hat name (default: NoHat)
 
 	GEAR TYPES:
 	- type			gear type
@@ -157,14 +162,14 @@
 	- type="distGearPos"	Distance between a gear and a fixed position
 		FAIL CONDITION:	Gear destroyed
 		- distance	goal distance to compare to
-		- relationship	"greaterThan" or "lowerThan"
+		- relationship	"greaterThan" or "smallerThan"
 		- id		gear to watch
 		- x		x coordinate to reach
 		- y		y coordinate to reach
 	- type="distGearGear"	Distance between two gears
 		FAIL CONDITION:	Any of both gears destroyed
 		- distance	goal distance to compare to
-		- relationship	"greaterThan" or "lowerThan"
+		- relationship	"greaterThan" or "smallerThan"
 		- id1		first gear to compare
 		- id2		second gear to compare
 	- type="damage"		Gear took damage or was destroyed
@@ -218,20 +223,6 @@
 	end
 end
 
--- Get hypotenuse of a triangle with legs x and y
-local function hypot(x, y)
-	local t
-	x = math.abs(x)
-	y = math.abs(y)
-	t = math.min(x, y)
-	x = math.max(x, y)
-	if x == 0 then
-		return 0
-	end
-	t = t / x
-	return x * math.sqrt(1 + t * t)
-end
-
 local errord = false
 
 -- This function generates the mission. See above for the meaning of params.
@@ -264,6 +255,8 @@
 
 	_G.sm.playerClan = 0
 
+	_G.sm.wonVarWritten = false
+
 	_G.sm.makeStats = function(winningClan, customAchievements)
 		for t=0, TeamsCount-1 do
 			local team = GetTeamName(t)
@@ -332,7 +325,7 @@
 			return (TotalRounds) >= goal.rounds
 		elseif goal.type == "inZone" then
 			if getGearValue(_G.sm.goalGears[goal.id], "sm_destroyed") then
-				return "fail", criticalGearFailText(goal.id)
+				return "fail", _G.sm.criticalGearFailText(goal.id)
 			end
 			local gX, gY = GetGearPosition(_G.sm.goalGears[goal.id])
 			-- 4 sub-goals, each optional
@@ -346,22 +339,22 @@
 			if goal.type == "distGearPos" then
 				if getGearValue(_G.sm.goalGears[goal.id], "sm_destroyed") then
 					-- Fail if gear was destroyed
-					return "fail", criticalGearFailText(goal.id)
+					return "fail", _G.sm.criticalGearFailText(goal.id)
 				end
 				gX, gY = GetGearPosition(_G.sm.goalGears[goal.id])
 				tX, tY = goal.x, goal.y
 			elseif goal.type == "distGearGear" then
 				-- Fail if one of the gears was destroyed
 				if getGearValue(_G.sm.goalGears[goal.id1], "sm_destroyed") then
-					return "fail", criticalGearFailText(goal.id1)
+					return "fail", _G.sm.criticalGearFailText(goal.id1)
 				elseif getGearValue(_G.sm.goalGears[goal.id2], "sm_destroyed") then
-					return "fail", criticalGearFailText(goal.id2)
+					return "fail", _G.sm.criticalGearFailText(goal.id2)
 				end
 				gX, gY = GetGearPosition(_G.sm.goalGears[goal.id1])
 				tX, tY = GetGearPosition(_G.sm.goalGears[goal.id2])
 			end
 
-			local h = hypot(gX - tX, gY - tY)
+			local h = integerHypotenuse(gX - tX, gY - tY)
 			if goal.relationship == "smallerThan" then
 				return h < goal.distance
 			elseif goal.relationship == "greaterThan" then
@@ -395,27 +388,27 @@
 			local drowned = getGearValue(_G.sm.goalGears[goal.id], "sm_drowned")
 			-- Fail if gear was destroyed by something other than drowning
 			if not drowned and getGearValue(_G.sm.goalGears[goal.id], "sm_destroyed") then
-				return "fail", criticalGearFailText(goal.id)
+				return "fail", _G.sm.criticalGearFailText(goal.id)
 			end
 			return drowned
 		elseif goal.type == "poison" then
 			if getGearValue(_G.sm.goalGears[goal.id], "sm_destroyed") then
-				return "fail", criticalGearFailText(goal.id)
+				return "fail", _G.sm.criticalGearFailText(goal.id)
 			end
 			return GetEffect(_G.sm.goalGears[goal.id], hePoisoned) >= 1
 		elseif goal.type == "freeze" then
 			if getGearValue(_G.sm.goalGears[goal.id], "sm_destroyed") then
-				return "fail", criticalGearFailText(goal.id)
+				return "fail", _G.sm.criticalGearFailText(goal.id)
 			end
 			return GetEffect(_G.sm.goalGears[goal.id], heFrozen) >= 256
 		elseif goal.type == "cure" then
 			if getGearValue(_G.sm.goalGears[goal.id], "sm_destroyed") then
-				return "fail", criticalGearFailText(goal.id)
+				return "fail", _G.sm.criticalGearFailText(goal.id)
 			end
 			return GetEffect(_G.sm.goalGears[goal.id], hePoisoned) == 0
 		elseif goal.type == "melt" then
 			if getGearValue(_G.sm.goalGears[goal.id], "sm_destroyed") then
-				return "fail", criticalGearFailText(goal.id)
+				return "fail", _G.sm.criticalGearFailText(goal.id)
 			end
 			return GetEffect(_G.sm.goalGears[goal.id], heFrozen) == 0
 		elseif goal.type == "waterSkip" then
@@ -423,7 +416,7 @@
 			local hasEnoughSkips = getGearValue(_G.sm.goalGears[goal.id], "sm_waterSkips") >= skips
 			-- Fail if gear was destroyed before it got the required number of skips
 			if not hasEnoughSkips and getGearValue(_G.sm.goalGears[goal.id], "sm_destroyed") then
-				return "fail", criticalGearFailText(goal.id)
+				return "fail", _G.sm.criticalGearFailText(goal.id)
 			end
 			return hasEnoughSkips
 		elseif goal.type == "teamDefeat" then
@@ -524,23 +517,28 @@
 	_G.sm.win = function()
 		if not _G.sm.gameEnded then
 			_G.sm.gameEnded = true
+			if not _G.sm.wonVarWritten then
+				SaveMissionVar("Won", "true")
+				_G.sm.wonVarWritten = true
+			end
 			AddCaption(loc("Victory!"), capcolDefault, capgrpGameState)
-			SendStat(siGameResult, loc("You win!"))
-			if GetHogLevel(CurrentHedgehog) == 0 then
-				SetState(CurrentHedgehog, bor(GetState(CurrentHedgehog), gstWinner))
-				SetState(CurrentHedgehog, band(GetState(CurrentHedgehog), bnot(gstHHDriven)))
-				PlaySound(sndVictory, CurrentHedgehog)
-			end
+			SendStat(siGameResult, loc("Mission succeeded!"))
 			_G.sm.makeStats(_G.sm.playerClan)
 			EndGame()
+			if GetHogLevel(CurrentHedgehog) == 0 then
+				for team, hog in pairs(teamHogs[GetHogTeamName(CurrentHedgehog)]) do
+					SetState(hog, gstWinner)
+					PlaySound(sndVictory, hog)
+				end
+			end
 		end
 	end
 
 	_G.sm.lose = function(failReason)
 		if not _G.sm.gameEnded then
 			_G.sm.gameEnded = true
-			AddCaption(loc("Scenario failed!"), capcolDefault, capgrpGameState)
-			SendStat(siGameResult, loc("You lose!"))
+			AddCaption(loc("Mission failed!"), capcolDefault, capgrpGameState)
+			SendStat(siGameResult, loc("Mission failed!"))
 			if failReason then
 				SendStat(siCustomAchievement, failReason)
 			end
@@ -650,12 +648,35 @@
 			else
 				clanID = teamData.clanID
 			end
-			grave = def(teamData.grave, defaultGraves[math.min(teamID, 8)])
-			fort = def(teamData.fort, "Castle")
-			voice = def(teamData.voice, "Default")
-			flag = def(teamData.flag, defaultFlags[math.min(teamID, 8)])
+
+			local realName
+			if teamData.isMissionTeam then
+				realName = AddMissionTeam(-(clanID+1))
+				_G.sm.playerClan = clanID
+			else
+				grave = def(teamData.grave, defaultGraves[math.min(teamID, 8)])
+				fort = def(teamData.fort, "Castle")
+				voice = def(teamData.voice, "Default_qau")
+				flag = def(teamData.flag, defaultFlags[math.min(teamID, 8)])
+
+				realName = AddTeam(name, -(clanID+1), grave, fort, voice, flag)
+			end
 
-			AddTeam(name, -(clanID+1), grave, fort, voice, flag)
+			-- Update all teamDefeat goals if the real team name differs from the
+			-- team configuration.
+			-- (AddTeam might change the name due to naming collisions)
+			if name ~= realName then
+				local checks = { params.customGoals, params.customNonGoals }
+				for c=1, 2 do
+					if checks[c] then
+						for k,goal in pairs(checks[c]) do
+							if goal.type == "teamDefeat" and goal.teamName == name then
+								goal.teamName = realName
+							end
+						end
+					end
+				end
+			end
 
 			for hogID, hogData in pairs(teamData.hogs) do
 				local name, botLevel, health, hat
@@ -663,7 +684,12 @@
 				botLevel = def(hogData.botLevel, 0)
 				health = def(hogData.health, 100)
 				hat = def(hogData.hat, "NoHat")
-				local hog = AddHog(name, botLevel, health, hat)
+				local hog
+				if teamData.isMissionTeam then
+					hog = AddMissionHog(health)
+				else
+					hog = AddHog(name, botLevel, health, hat)
+				end
 				if hogData.x ~= nil and hogData.y ~= nil then
 					SetGearPosition(hog, hogData.x, hogData.y)
 				end
@@ -708,6 +734,16 @@
 		end
 	end
 
+	_G.onGameResult = function(winningClan)
+		if (params.customGoals == nil) and (not _G.sm.wonVarWritten) and (winningClan == _G.sm.playerClan) then
+			SendStat(siGameResult, loc("Mission succeeded!"))
+			SaveMissionVar("Won", "true")
+			_G.sm.wonVarWritten = true
+		else
+			SendStat(siGameResult, loc("Mission failed!"))
+		end
+	end
+
 	_G.onAmmoStoreInit = function()
 		local ammoTypesDone = {}
 		-- Read script's stated ammo wishes
--- a/share/hedgewars/Data/Scripts/SpeedShoppa.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Scripts/SpeedShoppa.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -21,6 +21,7 @@
 
 ]=]
 
+HedgewarsScriptLoad("/Scripts/Utils.lua")
 HedgewarsScriptLoad("/Scripts/Locale.lua")
 
 --[[
@@ -44,11 +45,6 @@
 
 	optional fields:
 	- missionTitle:		the name of the mission (optional but highly recommended) (default: "Speed Shoppa")
-	- hogHat:		hat of the hedgehog (default: "NoHat")
-	- hogName:		name of the hedgehog (default: "Roper")
-	- teamName:		name of the hedgehog’s team (default: "Shoppers")
-	- teamGrave:		name of the hedgehog’s grave (default: "Statue")
-	- teamFlag:		name of the team’s flag (default: "cm_shoppa")
 	- clanColor:		color of the (only) clan (default: -1, default first clan color)
 	- goalText:		A short string explaining the goal of the mission
 				(default: "Use your rope to collect all crates as fast as possible.")
@@ -73,14 +69,9 @@
 local crates
 
 function SpeedShoppaMission(params)
-	if params.hogHat == nil then params.hogHat = "NoHat" end
-	if params.hogName == nil then params.hogName = loc("Roper") end
-	if params.teamName == nil then params.teamName = loc("Shoppers") end
 	if params.goalText == nil then params.goalText = loc("Use your rope to collect all crates as fast as possible.") end
 	if params.missionTitle == nil then params.missionTitle = loc("Speed Shoppa") end
 	if params.clanColor == nil then params.clanColor = -1 end
-	if params.teamGrave == nil then params.teamGrave = "Statue" end
-	if params.teamFlag == nil then params.teamFlag = "cm_shoppa" end
 	if params.extra_onGameInit == nil then params.extra_onGameInit = function() end end
 	if params.extra_onGameStart == nil then params.extra_onGameStart = function() end end
 	if params.faceLeft == nil then params.faceLeft = false end
@@ -94,15 +85,14 @@
 		CaseFreq = 0 
 		MinesNum = 0 
 		Explosives = 0 
-		Delay = 10 
 		Theme = params.theme
 		Map = params.map
 		-- Disable Sudden Death
 		WaterRise = 0
 		HealthDecrease = 0
 	
-		AddTeam(params.teamName, params.clanColor, params.teamGrave, "Castle", "Default", params.teamFlag)
-		playerHog = AddHog(params.hogName, 0, 1, params.hogHat)
+		AddMissionTeam(params.clanColor)
+		playerHog = AddMissionHog(1)
 		HogTurnLeft(playerHog, params.faceLeft)
 		
 		SetGearPosition(playerHog, params.hog_x, params.hog_y)
@@ -116,9 +106,10 @@
 
 	_G.onGameStart = function()
 		SendHealthStatsOff()
-		ShowMission(params.missionTitle, loc("Challenge"), params.goalText, -amRope, 5000) 
+		local append = getReadableChallengeRecord("TimeRecord")
+		ShowMission(params.missionTitle, loc("Challenge"), params.goalText .. "|" .. append, -amRope, 5000)
 		-- <crates collected>/<total number of crates>
-		SetTeamLabel(params.teamName, string.format(loc("%d/%d"), cratesCollected, #crates))
+		SetTeamLabel(GetHogTeamName(playerHog), string.format(loc("%d/%d"), cratesCollected, #crates))
 		for i=1,#crates do
 			spawnCrate(crates[i].x, crates[i].y)
 		end
@@ -133,7 +124,7 @@
 		if GetGearType(gear) == gtCase and not hogHurt and not timeOut then
 			cratesCollected = cratesCollected + 1
 			-- <crates collected>/<total number of crates>
-			SetTeamLabel(params.teamName, string.format(loc("%d/%d"), cratesCollected, #crates))
+			SetTeamLabel(GetHogTeamName(playerHog), string.format(loc("%d/%d"), cratesCollected, #crates))
 			PlaySound(sndShotgunReload)
 			if cratesCollected == #crates then
 				endTime = TurnTimeLeft
@@ -165,25 +156,30 @@
 	_G.finalize = function()
 		if not gameEnded then
 			if cratesCollected == #crates then
+				SaveMissionVar("Won", "true")
 				PlaySound(sndVictory, playerHog)
 				SetEffect(playerHog, heInvulnerable, 1)
-				SetState(playerHog, bor(GetState(playerHog), gstWinner))
-				SetState(playerHog, band(GetState(playerHog), bnot(gstHHDriven)))
+				local dx, dy = GetGearVelocity(playerHog)
+				SetGearVelocity(playerHog, 0, dy)
 				AddCaption(loc("Challenge completed!"))
 				SendStat(siGameResult, loc("Challenge completed!"))
-				SendStat(siPointType, loc("milliseconds"))
+				SendStat(siPointType, "!TIME")
 				local time = startTime - endTime
-				SendStat(siPlayerKills, tostring(time), params.teamName)
+				SendStat(siPlayerKills, tostring(time), GetHogTeamName(playerHog))
 				SendStat(siCustomAchievement, string.format(loc("You have finished the challenge in %.3f s."), (time/1000)))
 				SetTurnTimeLeft(0)
+				updateChallengeRecord("TimeRecord", time)
 			else
 				SendStat(siGameResult, loc("Challenge failed!"))
-				SendStat(siPointType, loc("crate(s)"))
-				SendStat(siPlayerKills, tostring(cratesCollected), params.teamName)
+				SendStat(siPointType, "!CRATES")
+				SendStat(siPlayerKills, tostring(cratesCollected), GetHogTeamName(playerHog))
 				SendStat(siCustomAchievement, string.format(loc("You have collected %d out of %d crate(s)."), cratesCollected, #crates))
 			end
 			gameEnded = true
 			EndGame()
+			if cratesCollected == #crates then
+				SetState(playerHog, gstWinner)
+			end
 		end
 	end
 
@@ -193,7 +189,8 @@
 		elseif params.crateType == "ammo" then
 			SpawnFakeAmmoCrate(x, y, false, false)
 		elseif params.crateType == "health" then
-			SpawnFakeHealthCrate(x, y, false, false)
+			local crate = SpawnFakeHealthCrate(x, y, false, false)
+			SetGearValues(crate, nil, nil, nil, nil, nil, 0) -- Karma
 		else
 			SpawnFakeAmmoCrate(x, y, false, false)
 		end
--- a/share/hedgewars/Data/Scripts/TargetPractice.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Scripts/TargetPractice.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -43,10 +43,6 @@
 	wind = ,
 	solidLand = ,
 	artillery = ,
-	hogHat = ,
-	hogName = ,
-	teamName = ,
-	teamGrave = ,
 	clanColor = ,
 	goalText = ,
 	shootText =
@@ -55,6 +51,7 @@
 ----- snip -----
 ]=]
 
+HedgewarsScriptLoad("/Scripts/Utils.lua")
 HedgewarsScriptLoad("/Scripts/Locale.lua")
 
 local player = nil
@@ -65,6 +62,8 @@
 local time_goal = 0
 local total_targets
 local targets
+local target_radar = false
+local next_target_circle = nil
 local gearsInGameCount = 0
 local gearsInGame = {}
 
@@ -95,17 +94,17 @@
 	- wind:		the initial wind (-100 to 100) (default: 0 (no wind))
 	- solidLand:	weather the terrain is indestructible (default: false)
 	- artillery:	if true, the hog can’t move (default: false)
-	- hogHat:	hat of the hedgehog (default: "NoHat")
-	- hogName:	name of the hedgehog (default: "Trainee")
-	- teamName:	name of the hedgehog’s team (default: "Training Team")
-	- teamGrave:	name of the hedgehog’s grave
-	- teamFlag:	name of the team’s flag (default: "cm_crosshair")
 	- secGearType:	cluster of projectile gear (if present) (used to re-center camera)
 	- clanColor:	color of the (only) clan (default: -1, default first clan color)
+	- faceLeft:	if true, hog starts facing left, otherwise right (default: false)
 	- goalText:	A short string explaining the goal of the mission
 			(default: "Destroy all targets within the time!")
 	- shootText:	A string which says how many times the player shot, “%d” is replaced
 			by the number of shots. (default: "You have shot %d times.")
+	- useRadar	Whether to use target radar (small circles that mark the position
+			of the next target). (default: true). Note: Still needs to be unlocked.
+	- radarTint:	RGBA color of the target radar  (default: 0xFF3030FF). Use this field
+			if the target radar would be hard to see against the background.
 ]]
 
 
@@ -114,15 +113,13 @@
 end
 
 function TargetPracticeMission(params)
-	if params.hogHat == nil then params.hogHat = "NoHat" end
-	if params.hogName == nil then params.hogName = loc("Trainee") end
-	if params.teamName == nil then params.teamName = loc("Training Team") end
 	if params.goalText == nil then params.goalText = loc("Eliminate all targets before your time runs out.|You have unlimited ammo for this mission.") end
 	if params.shootText == nil then params.shootText = loc("You have shot %d times.") end
 	if params.clanColor == nil then params.clanColor = -1 end
-	if params.teamGrave == nil then params.teamGrave= "Statue" end
-	if params.teamFlag == nil then params.teamFlag = "cm_crosshair" end
+	if params.faceLeft == nil then params.faceLeft = false end
 	if params.wind == nil then params.wind = 0 end
+	if params.radarTint == nil then params.radarTint = 0xFF3030FF end
+	if params.useRadar == nil then params.useRadar = true end
 
 	local solid, artillery
 	if params.solidLand == true then solid = gfSolidLand else solid = 0 end
@@ -159,16 +156,27 @@
 
 		SetWind(params.wind)
 
-		AddTeam(loc(params.teamName), params.clanColor, params.teamGrave, "Flowerhog", "Default", params.teamFlag)
+		AddMissionTeam(params.clanColor)
+
+		player = AddMissionHog(1)
+		SetGearPosition(player, params.hog_x, params.hog_y)
+		HogTurnLeft(player, params.faceLeft)
 
-		player = AddHog(loc(params.hogName), 0, 1, params.hogHat)
-		SetGearPosition(player, params.hog_x, params.hog_y)
+		local won = GetMissionVar("Won")
+		-- Unlock the target radar when the player has completed
+		-- the target practice before (any score).
+		-- Target radar might be disabled by config, however.
+		if won == "true" and params.useRadar == true then
+			target_radar = true
+		end
+
 	end
 
 	_G.onGameStart = function()
 		SendHealthStatsOff()
-		ShowMission(params.missionTitle, loc("Aiming practice"), params.goalText, -params.ammoType, 5000)
-		SetTeamLabel(params.teamName, "0")
+		local recordInfo = getReadableChallengeRecord("Highscore")
+		ShowMission(params.missionTitle, loc("Aiming practice"), params.goalText .. "|" .. recordInfo, -params.ammoType, 5000)
+		SetTeamLabel(GetHogTeamName(player), "0")
 		spawnTarget()
 	end
 
@@ -177,6 +185,7 @@
 	end
 
 	_G.spawnTarget = function()
+		-- Spawn next target
 		local gear = AddGear(0, 0, gtTarget, 0, 0, 0, 0)
 
 		local x = targets[scored+1].x
@@ -184,6 +193,20 @@
 
 		SetGearPosition(gear, x, y)
 
+		-- Target radar: Highlight position of the upcoming target.
+		-- This must be unlocked by the player first.
+		if target_radar then
+			if (not next_target_circle) and targets[scored+2] then
+				next_target_circle = AddVisualGear(0,0,vgtCircle,90,true)
+			end
+			if targets[scored+2] then
+				SetVisualGearValues(next_target_circle, targets[scored+2].x, targets[scored+2].y, 205, 255, 1, 20, nil, nil, 3, params.radarTint)
+			elseif next_target_circle then
+				DeleteVisualGear(next_target_circle)
+				next_target_circle = nil
+			end
+		end
+
 		return gear
 	end
 
@@ -191,7 +214,6 @@
 		if TurnTimeLeft < 40 and TurnTimeLeft > 0 and scored < total_targets and game_lost == false then
 			game_lost = true
 			AddCaption(loc("Time’s up!"), capcolDefault, capgrpGameState)
-			ShowMission(params.missionTitle, loc("Aiming practice"), loc("Oh no! Time's up! Just try again."), -amSkip, 0)
 			SetHealth(player, 0)
 			time_goal = 1
 		end
@@ -199,18 +221,17 @@
 		if band(GetState(player), gstDrowning) == gstDrowning and game_lost == false and scored < total_targets then
 			game_lost = true
 			time_goal = 1
-			AddCaption(loc("You lose!"), capcolDefault, capgrpGameState)
-			ShowMission(params.missionTitle, loc("Aiming practice"), loc("Oh no! You failed! Just try again."), -amSkip, 0)
 		end
 
 		if scored == total_targets  or game_lost then
 			if end_timer == 0 then
 				generateStats()
 				EndGame()
-			else
-				SetTurnTimeLeft(time_goal)
+				if scored == total_targets then
+					SetState(player, gstWinner)
+				end
 			end
-	   	     end_timer = end_timer - 20
+			end_timer = end_timer - 20
 		end
 
 		for gear, _ in pairs(gearsInGame) do
@@ -238,21 +259,27 @@
 	_G.onGearDamage = function(gear, damage)
 		if GetGearType(gear) == gtTarget then
 			scored = scored + 1
-			SetTeamLabel(params.teamName, tostring(getTargetsScore()))
+			SetTeamLabel(GetHogTeamName(player), tostring(getTargetsScore()))
 			if scored < total_targets then
 				AddCaption(string.format(loc("Targets left: %d"), (total_targets-scored)), capcolDefault, capgrpMessage)
 				spawnTarget()
 			else
 				if not game_lost then
+					SaveMissionVar("Won", "true")
 					AddCaption(loc("You have destroyed all targets!"), capcolDefault, capgrpGameState)
 					ShowMission(params.missionTitle, loc("Aiming practice"), loc("Congratulations! You have destroyed all targets within the time."), 0, 0)
-					PlaySound(sndVictory, player)
+					if shots <= scored then
+						-- No misses!
+						PlaySound(sndFlawless, player)
+					else
+						PlaySound(sndVictory, player)
+					end
 					SetEffect(player, heInvulnerable, 1)
-					SetState(player, bor(GetState(player), gstWinner))
 					time_goal = TurnTimeLeft
 					-- Disable control
 					SetInputMask(0)
 					AddAmmo(player, params.ammoType, 0)
+					SetTurnTimePaused(true)
 				end
 			end
 		end
@@ -260,8 +287,6 @@
 		if GetGearType(gear) == gtHedgehog then
 			if not game_lost then
 				game_lost = true
-				AddCaption(loc("You lose!"), capcolDefault, capgrpGameState)
-				ShowMission(params.missionTitle, loc("Aiming practice"), loc("Oh no! You failed! Just try again."), -amSkip, 0)
 
 				SetHealth(player, 0)
 				time_goal = 1
@@ -289,23 +314,39 @@
 	end
 
 	_G.generateStats = function()
-		local accuracy = (scored/shots)*100
+		local accuracy, accuracy_int
+		if(shots > 0) then
+			accuracy = (scored/shots)*100
+			accuracy_int = div(scored*100, shots)
+		end
 		local end_score_targets = getTargetsScore()
 		local end_score_overall
 		if not game_lost then
 			local end_score_time = math.ceil(time_goal/(params.time/6000))
-			local end_score_accuracy = math.ceil(accuracy * 60)
+			local end_score_accuracy = 0
+			if(shots > 0) then
+				end_score_accuracy = math.ceil(accuracy * 60)
+			end
 			end_score_overall = end_score_time + end_score_targets + end_score_accuracy
-			SetTeamLabel(params.teamName, tostring(end_score_overall))
+			SetTeamLabel(GetHogTeamName(player), tostring(end_score_overall))
 
 			SendStat(siGameResult, loc("You have finished the target practice!"))
 
 			SendStat(siCustomAchievement, string.format(loc("You have destroyed %d of %d targets (+%d points)."), scored, total_targets, end_score_targets))
 			SendStat(siCustomAchievement, string.format(params.shootText, shots))
-			SendStat(siCustomAchievement, string.format(loc("Your accuracy was %.1f%% (+%d points)."), accuracy, end_score_accuracy))
+			if(shots > 0) then
+				SendStat(siCustomAchievement, string.format(loc("Your accuracy was %.1f%% (+%d points)."), accuracy, end_score_accuracy))
+			end
 			SendStat(siCustomAchievement, string.format(loc("You had %.1fs remaining on the clock (+%d points)."), (time_goal/1000), end_score_time))
+			if (not target_radar) and (#targets > 1) and (params.useRadar == true) then
+				SendStat(siCustomAchievement, loc("You have unlocked the target radar!"))
+			end
+
+			if(shots > 0) then
+				updateChallengeRecord("AccuracyRecord", accuracy_int)
+			end
 		else
-			SendStat(siGameResult, loc("You lose!"))
+			SendStat(siGameResult, loc("Challenge over!"))
 
 			SendStat(siCustomAchievement, string.format(loc("You have destroyed %d of %d targets (+%d points)."), scored, total_targets, end_score_targets))
 			SendStat(siCustomAchievement, string.format(params.shootText, shots))
@@ -314,7 +355,9 @@
 			end
 			end_score_overall = end_score_targets
 		end
-		SendStat(siPointType, loc("point(s)"))
-		SendStat(siPlayerKills, tostring(end_score_overall), loc(params.teamName))
+		SendStat(siPointType, "!POINTS")
+		SendStat(siPlayerKills, tostring(end_score_overall), GetHogTeamName(player))
+		-- Update highscore
+		updateChallengeRecord("Highscore", end_score_overall)
 	end
 end
--- a/share/hedgewars/Data/Scripts/Utils.lua	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Scripts/Utils.lua	Fri Aug 16 10:59:50 2019 -0600
@@ -1,5 +1,7 @@
 -- Library for miscellaneous utilitiy functions and global helper variables
 
+HedgewarsScriptLoad("/Scripts/Locale.lua")
+
 --[[ FUNCTIONS ]]
 -- Check if a gear is inside a box
 function gearIsInBox(gear, x, y, w, h)
@@ -33,6 +35,63 @@
 	end
 end
 
+local function challengeRecordToString(recordType, value)
+	if recordType == "TimeRecord" then
+		return string.format(loc("Team's best time: %.3fs"), value/1000)
+	elseif recordType == "TimeRecordHigh" then
+		return string.format(loc("Team's longest time: %.3fs"), value/1000)
+	elseif recordType == "Highscore" then
+		return string.format(loc("Team highscore: %d"), value)
+	elseif recordType == "Lowscore" then
+		return string.format(loc("Team lowscore: %d"), value)
+	elseif recordType == "AccuracyRecord" then
+		return string.format(loc("Team's top accuracy: %d%"), value)
+	end
+end
+
+function getReadableChallengeRecord(recordType)
+	local record = tonumber(GetMissionVar(recordType))
+	if type(record) ~= "number" then
+		return ""
+	else
+		return challengeRecordToString(recordType, record)
+	end
+end
+
+function updateChallengeRecord(recordType, value, stat)
+	local oldRecord = tonumber(GetMissionVar(recordType))
+	local newRecord = false
+	if stat == nil then
+		stat = recordType ~= "AccuracyRecord"
+	end
+	if type(oldRecord) ~= "number" then
+		newRecord = true
+	else
+		local recordBeaten = false
+		if recordType == "Lowscore" or recordType == "TimeRecord" then
+			if value < oldRecord then
+				recordBeaten = true
+				newRecord = true
+			end
+		else
+			if value > oldRecord then
+				recordBeaten = true
+				newRecord = true
+			end
+		end
+		if stat then
+			if recordBeaten then
+				SendStat(siCustomAchievement, loc("You have beaten the team record, congratulations!"))
+			else
+				SendStat(siCustomAchievement, challengeRecordToString(recordType, oldRecord))
+			end
+		end
+	end
+	if newRecord then
+		SaveMissionVar(recordType, value)
+	end
+end
+
 -- Completely fill the map with land. Requires MapGen=mgDrawn.
 -- If flush is false, FlushPoints() is not called.
 function fillMap(flush)
@@ -45,6 +104,28 @@
 	drawFullMap(true, flush)
 end
 
+-- Approximative but desync-safe version of square root. This function follows the Babylonian method.
+function integerSqrt(num)
+	local temp = num
+	while (temp*temp - div(temp, 2) > num)
+	do
+		temp = div((temp + div(num, temp)), 2)
+	end
+	return math.abs(temp)
+end
+
+-- Integer square root of (x^2, y^2), works without desyncs. Is approximative.
+-- This is the same as the length of the hypotenuse of a triangle with legs x, y.
+function integerHypotenuse(x, y)
+	-- To fix overflows
+	if(((math.abs(x)^2) + (math.abs(y)^2)) > 2^26)
+	then
+		local bitr = 2^13
+		return integerSqrt((div(math.abs(x), bitr)^2) + (div(math.abs(y), bitr)^2)) * bitr
+	else
+		return integerSqrt((math.abs(x)^2) + (math.abs(y) ^ 2))
+	end
+end
 
 --[[ GLOBAL VARIABLES ]]
 
--- a/share/hedgewars/Data/Shaders/default.fs	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Shaders/default.fs	Fri Aug 16 10:59:50 2019 -0600
@@ -14,8 +14,8 @@
 {
     if(enableTexture){
         if (tintAdd){
-            tint.a = 0.0;
-            gl_FragColor = clamp(texture2D(tex0, tex) + tint, 0.0, 1.1);
+            vec4 tint_ = vec4(tint.xyz, 0.0);
+            gl_FragColor = clamp(texture2D(tex0, tex) + tint_, 0.0, 1.1);
         }else{
             gl_FragColor = texture2D(tex0, tex) * tint;
         }
Binary file share/hedgewars/Data/Sounds/Kiss.ogg has changed
Binary file share/hedgewars/Data/Sounds/Yoohoo.ogg has changed
Binary file share/hedgewars/Data/Sounds/planewater.ogg has changed
--- a/share/hedgewars/Data/Sounds/voices/British/CMakeLists.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Sounds/voices/British/CMakeLists.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -14,6 +14,7 @@
 Fire.ogg
 Firepunch*.ogg
 Flawless.ogg
+Flyaway.ogg
 Gonnagetyou.ogg
 Grenade.ogg
 Hello.ogg
@@ -35,8 +36,6 @@
 Oops.ogg
 Ouch.ogg
 Ow*.ogg
-PoisonCough.ogg
-PoisonMoan.ogg
 Reinforcements.ogg
 Revenge.ogg
 Runaway.ogg
Binary file share/hedgewars/Data/Sounds/voices/British/Flyaway.ogg has changed
Binary file share/hedgewars/Data/Sounds/voices/British/PoisonCough.ogg has changed
Binary file share/hedgewars/Data/Sounds/voices/British/PoisonMoan.ogg has changed
--- a/share/hedgewars/Data/Sounds/voices/Classic/CMakeLists.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Sounds/voices/Classic/CMakeLists.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -14,6 +14,7 @@
 Fire.ogg
 Firepunch*.ogg
 Flawless.ogg
+Flyaway.ogg
 Gonnagetyou.ogg
 Grenade.ogg
 Hello.ogg
@@ -35,8 +36,6 @@
 Oops.ogg
 Ouch.ogg
 Ow*.ogg
-PoisonCough.ogg
-PoisonMoan.ogg
 Reinforcements.ogg
 # FIXME: Revenge.ogg is "I'll get you back" but this taunt is meant for
 # successful reveng, not the announcement thereof.
Binary file share/hedgewars/Data/Sounds/voices/Classic/Flyaway.ogg has changed
Binary file share/hedgewars/Data/Sounds/voices/Classic/PoisonCough.ogg has changed
Binary file share/hedgewars/Data/Sounds/voices/Classic/PoisonMoan.ogg has changed
--- a/share/hedgewars/Data/Sounds/voices/Default/CMakeLists.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Sounds/voices/Default/CMakeLists.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -14,6 +14,7 @@
 Fire.ogg
 Firepunch*.ogg
 Flawless.ogg
+Flyaway.ogg
 Gonnagetyou.ogg
 Grenade.ogg
 Hello.ogg
Binary file share/hedgewars/Data/Sounds/voices/Default/Flyaway.ogg has changed
--- a/share/hedgewars/Data/Sounds/voices/Default_es/CMakeLists.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Sounds/voices/Default_es/CMakeLists.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -2,11 +2,11 @@
 Boring.ogg
 Byebye.ogg
 Comeonthen.ogg
-Coward.ogg
 Enemydown.ogg
 Firstblood.ogg
 Firepunch*.ogg
 Flawless.ogg
+Flyaway.ogg
 Hello.ogg
 Hurry.ogg
 Illgetyou.ogg
Binary file share/hedgewars/Data/Sounds/voices/Default_es/Coward.ogg has changed
Binary file share/hedgewars/Data/Sounds/voices/Default_es/Flyaway.ogg has changed
--- a/share/hedgewars/Data/Sounds/voices/Default_pl/CMakeLists.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Sounds/voices/Default_pl/CMakeLists.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -7,6 +7,7 @@
 Firstblood.ogg
 Firepunch*.ogg
 Flawless.ogg
+Flyaway.ogg
 Hello.ogg
 Hurry.ogg
 Illgetyou.ogg
Binary file share/hedgewars/Data/Sounds/voices/Default_pl/Flyaway.ogg has changed
--- a/share/hedgewars/Data/Sounds/voices/Default_ru/CMakeLists.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Sounds/voices/Default_ru/CMakeLists.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -7,7 +7,9 @@
 Firstblood.ogg
 Firepunch*.ogg
 Flawless.ogg
+Flyaway.ogg
 Hello.ogg
+Hmm.ogg
 Hurry.ogg
 Illgetyou.ogg
 Incoming.ogg
Binary file share/hedgewars/Data/Sounds/voices/Default_ru/Hmm.ogg has changed
--- a/share/hedgewars/Data/Sounds/voices/Default_uk/CMakeLists.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Sounds/voices/Default_uk/CMakeLists.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -14,6 +14,7 @@
 Fire.ogg
 Firepunch*.ogg
 Flawless.ogg
+Flyaway.ogg
 Gonnagetyou.ogg
 Grenade.ogg
 Hello.ogg
@@ -35,8 +36,6 @@
 Oops.ogg
 Ouch.ogg
 Ow*.ogg
-PoisonCough.ogg
-PoisonMoan.ogg
 Reinforcements.ogg
 Revenge.ogg
 Runaway.ogg
Binary file share/hedgewars/Data/Sounds/voices/Default_uk/Flyaway.ogg has changed
Binary file share/hedgewars/Data/Sounds/voices/Default_uk/PoisonCough.ogg has changed
Binary file share/hedgewars/Data/Sounds/voices/Default_uk/PoisonMoan.ogg has changed
--- a/share/hedgewars/Data/Sounds/voices/Mobster/CMakeLists.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Sounds/voices/Mobster/CMakeLists.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -14,6 +14,7 @@
 Fire.ogg
 Firepunch*.ogg
 Flawless.ogg
+Flyaway.ogg
 Gonnagetyou.ogg
 Grenade.ogg
 Hello.ogg
@@ -35,8 +36,6 @@
 Oops.ogg
 Ouch.ogg
 Ow*.ogg
-PoisonCough.ogg
-PoisonMoan.ogg
 Reinforcements.ogg
 Revenge.ogg
 Runaway.ogg
Binary file share/hedgewars/Data/Sounds/voices/Mobster/Flyaway.ogg has changed
Binary file share/hedgewars/Data/Sounds/voices/Mobster/PoisonCough.ogg has changed
Binary file share/hedgewars/Data/Sounds/voices/Mobster/PoisonMoan.ogg has changed
--- a/share/hedgewars/Data/Sounds/voices/Pirate/CMakeLists.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Sounds/voices/Pirate/CMakeLists.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -14,6 +14,7 @@
 Fire.ogg
 Firepunch*.ogg
 Flawless.ogg
+Flyaway.ogg
 Gonnagetyou.ogg
 Grenade.ogg
 Hello.ogg
@@ -35,8 +36,6 @@
 Oops.ogg
 Ouch.ogg
 Ow*.ogg
-PoisonCough.ogg
-PoisonMoan.ogg
 Reinforcements.ogg
 Revenge.ogg
 Runaway.ogg
Binary file share/hedgewars/Data/Sounds/voices/Pirate/Flyaway.ogg has changed
Binary file share/hedgewars/Data/Sounds/voices/Pirate/PoisonCough.ogg has changed
Binary file share/hedgewars/Data/Sounds/voices/Pirate/PoisonMoan.ogg has changed
--- a/share/hedgewars/Data/Sounds/voices/Robot/CMakeLists.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Sounds/voices/Robot/CMakeLists.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -14,6 +14,7 @@
 Fire.ogg
 Firepunch*.ogg
 Flawless.ogg
+Flyaway.ogg
 Gonnagetyou.ogg
 Grenade.ogg
 Hello.ogg
@@ -35,8 +36,6 @@
 Oops.ogg
 Ouch.ogg
 Ow*.ogg
-PoisonCough.ogg
-PoisonMoan.ogg
 Reinforcements.ogg
 Revenge.ogg
 Runaway.ogg
Binary file share/hedgewars/Data/Sounds/voices/Robot/Flyaway.ogg has changed
Binary file share/hedgewars/Data/Sounds/voices/Robot/PoisonCough.ogg has changed
Binary file share/hedgewars/Data/Sounds/voices/Robot/PoisonMoan.ogg has changed
--- a/share/hedgewars/Data/Sounds/voices/Russian/CMakeLists.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Sounds/voices/Russian/CMakeLists.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -14,6 +14,7 @@
 Fire.ogg
 Firepunch*.ogg
 Flawless.ogg
+Flyaway.ogg
 Gonnagetyou.ogg
 Grenade.ogg
 Hello.ogg
@@ -35,8 +36,6 @@
 Oops.ogg
 Ouch.ogg
 Ow*.ogg
-PoisonCough.ogg
-PoisonMoan.ogg
 Reinforcements.ogg
 Revenge.ogg
 Runaway.ogg
Binary file share/hedgewars/Data/Sounds/voices/Russian/Flyaway.ogg has changed
Binary file share/hedgewars/Data/Sounds/voices/Russian/PoisonCough.ogg has changed
Binary file share/hedgewars/Data/Sounds/voices/Russian/PoisonMoan.ogg has changed
--- a/share/hedgewars/Data/Sounds/voices/Russian_pl/CMakeLists.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Sounds/voices/Russian_pl/CMakeLists.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -7,6 +7,7 @@
 Firstblood.ogg
 Firepunch*.ogg
 Flawless.ogg
+Flyaway.ogg
 Hello.ogg
 Hurry.ogg
 Illgetyou.ogg
Binary file share/hedgewars/Data/Sounds/voices/Russian_pl/Flyaway.ogg has changed
--- a/share/hedgewars/Data/Sounds/voices/Singer/CMakeLists.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Sounds/voices/Singer/CMakeLists.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -14,6 +14,7 @@
 Fire.ogg
 Firepunch*.ogg
 Flawless.ogg
+Flyaway.ogg
 Gonnagetyou.ogg
 Grenade.ogg
 Hello.ogg
@@ -35,8 +36,6 @@
 Oops.ogg
 Ouch.ogg
 Ow*.ogg
-PoisonCough.ogg
-PoisonMoan.ogg
 Reinforcements.ogg
 Revenge.ogg
 Runaway.ogg
Binary file share/hedgewars/Data/Sounds/voices/Singer/Flyaway.ogg has changed
Binary file share/hedgewars/Data/Sounds/voices/Singer/PoisonCough.ogg has changed
Binary file share/hedgewars/Data/Sounds/voices/Singer/PoisonMoan.ogg has changed
--- a/share/hedgewars/Data/Sounds/voices/Surfer/CMakeLists.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Sounds/voices/Surfer/CMakeLists.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -35,8 +35,6 @@
 Oops.ogg
 Ouch.ogg
 Ow*.ogg
-PoisonCough.ogg
-PoisonMoan.ogg
 Reinforcements.ogg
 Revenge.ogg
 Runaway.ogg
Binary file share/hedgewars/Data/Sounds/voices/Surfer/PoisonCough.ogg has changed
Binary file share/hedgewars/Data/Sounds/voices/Surfer/PoisonMoan.ogg has changed
Binary file share/hedgewars/Data/Themes/Art/SDSplash.png has changed
Binary file share/hedgewars/Data/Themes/Art/Splash.png has changed
--- a/share/hedgewars/Data/Themes/Bath/credits.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Themes/Bath/credits.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -1,1 +1,1 @@
-Finn Brice
+John Dum
Binary file share/hedgewars/Data/Themes/Beach/Splash.png has changed
Binary file share/hedgewars/Data/Themes/Blox/Border.png has changed
Binary file share/hedgewars/Data/Themes/Brick/SDSplash.png has changed
Binary file share/hedgewars/Data/Themes/Brick/Splash.png has changed
Binary file share/hedgewars/Data/Themes/Cake/SDSplash.png has changed
Binary file share/hedgewars/Data/Themes/Cake/Splash.png has changed
Binary file share/hedgewars/Data/Themes/Castle/SDSplash.png has changed
Binary file share/hedgewars/Data/Themes/Castle/Splash.png has changed
--- a/share/hedgewars/Data/Themes/Castle/credits.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Themes/Castle/credits.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -1,1 +1,1 @@
-Finn Brice
+John Dum
Binary file share/hedgewars/Data/Themes/Compost/SDSplash.png has changed
Binary file share/hedgewars/Data/Themes/Compost/Splash.png has changed
Binary file share/hedgewars/Data/Themes/CrazyMission/SDSplash.png has changed
Binary file share/hedgewars/Data/Themes/CrazyMission/Splash.png has changed
Binary file share/hedgewars/Data/Themes/Deepspace/SDSplash.png has changed
Binary file share/hedgewars/Data/Themes/Deepspace/Splash.png has changed
Binary file share/hedgewars/Data/Themes/Desert/SDSplash.png has changed
Binary file share/hedgewars/Data/Themes/Desert/Splash.png has changed
Binary file share/hedgewars/Data/Themes/Digital/Splash.png has changed
Binary file share/hedgewars/Data/Themes/Eyes/Border.png has changed
Binary file share/hedgewars/Data/Themes/Eyes/LandTex.png has changed
Binary file share/hedgewars/Data/Themes/Eyes/SDSplash.png has changed
Binary file share/hedgewars/Data/Themes/Eyes/Splash.png has changed
Binary file share/hedgewars/Data/Themes/Fruit/SDSplash.png has changed
Binary file share/hedgewars/Data/Themes/Fruit/Splash.png has changed
Binary file share/hedgewars/Data/Themes/Golf/SDSplash.png has changed
Binary file share/hedgewars/Data/Themes/Golf/Splash.png has changed
Binary file share/hedgewars/Data/Themes/Halloween/SDSplash.png has changed
Binary file share/hedgewars/Data/Themes/Halloween/Splash.png has changed
--- a/share/hedgewars/Data/Themes/Halloween/credits.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Themes/Halloween/credits.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -1,1 +1,1 @@
-Finn Brice
+John Dum
Binary file share/hedgewars/Data/Themes/Hell/SDSplash.png has changed
Binary file share/hedgewars/Data/Themes/Hell/Splash.png has changed
--- a/share/hedgewars/Data/Themes/Island/credits.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Themes/Island/credits.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -1,1 +1,1 @@
-Finn Brice
+John Dum
Binary file share/hedgewars/Data/Themes/Jungle/Splash.png has changed
Binary file share/hedgewars/Data/Themes/Planes/Border.png has changed
Binary file share/hedgewars/Data/Themes/Planes/LandTex.png has changed
--- a/share/hedgewars/Data/Themes/Planes/credits.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/Themes/Planes/credits.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -1,1 +1,1 @@
-Finn Brice
+John Dum
Binary file share/hedgewars/Data/Themes/Stage/SDSplash.png has changed
Binary file share/hedgewars/Data/Themes/Stage/Splash.png has changed
Binary file share/hedgewars/Data/Themes/Underwater/SDSplash.png has changed
Binary file share/hedgewars/Data/Themes/Underwater/Splash.png has changed
--- a/share/hedgewars/Data/misc/CMakeLists.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/misc/CMakeLists.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -2,10 +2,13 @@
 if(UNIX AND NOT APPLE)
     configure_file(hwengine.desktop.in hwengine.desktop)
 
-    file(GLOB miscfiles *.svg *.xml *.desktop)
+    file(GLOB miscfiles *.svg *.xml *.desktop *.csv)
 
-    install(FILES ${miscfiles} DESTINATION ${SHAREPATH}/Data/misc)
     install(FILES hedgewars.xpm DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps)
     install(FILES hedgewars.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications)
+else()
+    file(GLOB miscfiles *.csv)
 endif()
 
+install(FILES ${miscfiles} DESTINATION ${SHAREPATH}/Data/misc)
+
--- a/share/hedgewars/Data/misc/hedgewars-mimeinfo.xml	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/misc/hedgewars-mimeinfo.xml	Fri Aug 16 10:59:50 2019 -0600
@@ -10,6 +10,7 @@
     <comment xml:lang="de">Hedgewars-Wiederholung</comment>
     <comment xml:lang="es">Demo de Hedgewars</comment>
     <comment xml:lang="fr">Démonstration d'Hedgewars</comment>
+    <comment xml:lang="gd">Ath-chluiche Hedgewars</comment>
     <comment xml:lang="it">Demo di Hedgewars</comment>
     <comment xml:lang="ko">헤즈와스 데모</comment>
     <comment xml:lang="pl">Demo gry Hedgewars</comment>
@@ -32,6 +33,7 @@
     <comment xml:lang="de">Hedgewars-Spielstand</comment>
     <comment xml:lang="es">Partida guardada de Hedgewars</comment>
     <comment xml:lang="fr">Parties enregistrées d'Hedgewars</comment>
+    <comment xml:lang="gd">Geama Hedgewars</comment>
     <comment xml:lang="ko">헤즈와스 저장된 게임</comment>
     <comment xml:lang="it">Partita salvata di Hedgewars</comment>
     <comment xml:lang="pl">Zapis gry Hedgewars</comment>
--- a/share/hedgewars/Data/misc/hedgewars.desktop	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/misc/hedgewars.desktop	Fri Aug 16 10:59:50 2019 -0600
@@ -7,6 +7,7 @@
 GenericName[de]=Kämpfende Igel
 GenericName[es]=Batallas entre erizos
 GenericName[fr]=Bataille de hérissons
+GenericName[gd]=Blàr ghràineagan
 GenericName[ko]=고슴도치 싸우기
 GenericName[ja]=ファイチングハリネズミ
 GenericName[it]=Ricci combattenti
@@ -19,6 +20,7 @@
 GenericName[tr]=Dövüşen Kirpiler
 Comment=Funny turn-based artillery game, featuring fighting hedgehogs!
 Comment[de]=Lustiges zugbasiertes Artilleriespiel mit kämpfenden Igeln!
+Comment[gd]=Geama sabaid èibhinn le gràineagan a’ losgadh air a chèile tè mu seach!
 Comment[it]=Gioco divertente di artiglieria a turni, con ricci combattenti!
 Comment[ru]=Весёлая пошаговая стратегия про воюющих ёжиков!
 Icon=hedgewars
--- a/share/hedgewars/Data/misc/hwengine.desktop.in	Mon Jan 14 15:11:15 2019 -0500
+++ b/share/hedgewars/Data/misc/hwengine.desktop.in	Fri Aug 16 10:59:50 2019 -0600
@@ -3,10 +3,12 @@
 Version=1.0
 Name=Hedgewars Engine
 Name[de]=Hedgewars-Engine
+Name[gd]=Einnsean Hedgewars
 Comment=For the playback of saves and demos of Hedgewars
 Comment[de]=Für die Wiedergabe von gespeicherten Spielen und Wiederholungen von Hedgewars
 Comment[es]=Motor del juego Hedgewars, reproduce demos y partidas guardadas
 Comment[fr]=Moteur graphique d'Hedgewars, pour revoir les parties enregistrées et de démonstration.
+Comment[gd]=Inneal-cluiche airson ath-chluichean agus geamannan Hedgewars air an sàbhaladh
 Comment[it]=Motore grafico di Hedgewars, riproduce le demo e riprende le partite salvate
 Comment[ko]=헤즈와즈 게임 엔진, 데모 와 저장한 게임을 재생함
 Comment[pl]=Silnik gry Hedgewars do odtwarzania dem i zapisów gier
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/misc/keys.csv	Fri Aug 16 10:59:50 2019 -0600
@@ -0,0 +1,224 @@
+4,"a"
+5,"b"
+6,"c"
+7,"d"
+8,"e"
+9,"f"
+10,"g"
+11,"h"
+12,"i"
+13,"j"
+14,"k"
+15,"l"
+16,"m"
+17,"n"
+18,"o"
+19,"p"
+20,"q"
+21,"r"
+22,"s"
+23,"t"
+24,"u"
+25,"v"
+26,"w"
+27,"x"
+28,"y"
+29,"z"
+30,"1"
+31,"2"
+32,"3"
+33,"4"
+34,"5"
+35,"6"
+36,"7"
+37,"8"
+38,"9"
+39,"0"
+40,"return"
+41,"escape"
+42,"backspace"
+43,"tab"
+44,"space"
+45,"-"
+46,"="
+47,"["
+48,"]"
+49,"\"
+50,"nonushash"
+51,";"
+52,"'"
+53,"`"
+54,","
+55,"."
+56,"/"
+57,"capslock"
+58,"f1"
+59,"f2"
+60,"f3"
+61,"f4"
+62,"f5"
+63,"f6"
+64,"f7"
+65,"f8"
+66,"f9"
+67,"f10"
+68,"f11"
+69,"f12"
+70,"printscreen"
+71,"scrolllock"
+72,"pause"
+73,"insert"
+74,"home"
+75,"pageup"
+76,"delete"
+77,"end"
+78,"pagedown"
+79,"right"
+80,"left"
+81,"down"
+82,"up"
+83,"numlock"
+84,"keypad_/"
+85,"keypad_*"
+86,"keypad_-"
+87,"keypad_+"
+88,"keypad_enter"
+89,"keypad_1"
+90,"keypad_2"
+91,"keypad_3"
+92,"keypad_4"
+93,"keypad_5"
+94,"keypad_6"
+95,"keypad_7"
+96,"keypad_8"
+97,"keypad_9"
+98,"keypad_0"
+99,"keypad_."
+100,"nonusbackslash"
+101,"menu"
+102,"power"
+103,"keypad_="
+104,"f13"
+105,"f14"
+106,"f15"
+107,"f16"
+108,"f17"
+109,"f18"
+110,"f19"
+111,"f20"
+112,"f21"
+113,"f22"
+114,"f23"
+115,"f24"
+116,"execute"
+117,"help"
+118,"menu"
+119,"select"
+120,"stop"
+121,"again"
+122,"undo"
+123,"cut"
+124,"copy"
+125,"paste"
+126,"find"
+127,"mute"
+128,"volumeup"
+129,"volumedown"
+133,"keypad_,"
+134,"keypad_=_(as400"
+153,"alterase"
+154,"sysreq"
+155,"cancel"
+156,"clear"
+157,"prior"
+158,"return2"
+159,"separator"
+160,"out"
+161,"oper"
+162,"clear_/_again"
+163,"crsel"
+164,"exsel"
+176,"keypad_00"
+177,"keypad_000"
+178,"thousandssepara"
+179,"decimalseparato"
+180,"currencyunit"
+181,"currencysubunit"
+182,"keypad_("
+183,"keypad_)"
+184,"keypad_{"
+185,"keypad_}"
+186,"keypad_tab"
+187,"keypad_backspac"
+188,"keypad_a"
+189,"keypad_b"
+190,"keypad_c"
+191,"keypad_d"
+192,"keypad_e"
+193,"keypad_f"
+194,"keypad_xor"
+195,"keypad_^"
+196,"keypad_%"
+197,"keypad_<"
+198,"keypad_>"
+199,"keypad_&"
+200,"keypad_&&"
+201,"keypad_|"
+202,"keypad_||"
+203,"keypad_:"
+204,"keypad_#"
+205,"keypad_space"
+206,"keypad_@"
+207,"keypad_!"
+208,"keypad_memstore"
+209,"keypad_memrecal"
+210,"keypad_memclear"
+211,"keypad_memadd"
+212,"keypad_memsubtr"
+213,"keypad_memmulti"
+214,"keypad_memdivid"
+215,"keypad_+/-"
+216,"keypad_clear"
+217,"keypad_clearent"
+218,"keypad_binary"
+219,"keypad_octal"
+220,"keypad_decimal"
+221,"keypad_hexadeci"
+224,"left_ctrl"
+225,"left_shift"
+226,"left_alt"
+227,"left_gui"
+228,"right_ctrl"
+229,"right_shift"
+230,"right_alt"
+231,"right_gui"
+257,"modeswitch"
+258,"audionext"
+259,"audioprev"
+260,"audiostop"
+261,"audioplay"
+262,"audiomute"
+263,"mediaselect"
+264,"www"
+265,"mail"
+266,"calculator"
+267,"computer"
+268,"ac_search"
+269,"ac_home"
+270,"ac_back"
+271,"ac_forward"
+272,"ac_stop"
+273,"ac_refresh"
+274,"ac_bookmarks"
+275,"brightnessdown"
+276,"brightnessup"
+277,"displayswitch"
+278,"kbdillumtoggle"
+279,"kbdillumdown"
+280,"kbdillumup"
+281,"eject"
+282,"sleep"
+283,"app1"
+284,"app2"
+285,"audiorewind"
+286,"audiofastforwar"
--- a/tools/CMakeLists.txt	Mon Jan 14 15:11:15 2019 -0500
+++ b/tools/CMakeLists.txt	Fri Aug 16 10:59:50 2019 -0600
@@ -26,9 +26,6 @@
         endif()
     endif()
 
-    #use the associated tool from the libraries we've selected
-    string(REGEX REPLACE "(.*)/include.*" "\\1" qt_base_dir "${QT_INCLUDE_DIR}")
-
     #remove the ";-framework Cocoa" from the SDL2_LIBRARY variable
     string(REGEX REPLACE "(.*);-.*" "\\1" sdl_library_only "${SDL2_LIBRARY}")
     #remove the "libSDLmain.a" from the SDL2_LIBRARY variable
@@ -39,24 +36,75 @@
     string(REGEX REPLACE ".*/(.*)$" "\\1" ZLIB_LIBNAME "${ZLIB_LIBRARY}")
 
     set(frameworks_dir ${CMAKE_INSTALL_PREFIX}/${target_library_install_dir})
+    
     if(${BUILD_ENGINE_LIBRARY})
         set(engine_full_path "${frameworks_dir}/${CMAKE_SHARED_LIBRARY_PREFIX}hwengine${CMAKE_SHARED_LIBRARY_SUFFIX}")
     else()
         set(engine_full_path "${CMAKE_INSTALL_PREFIX}/hwengine${CMAKE_EXECUTABLE_SUFFIX}")
     endif()
 
-    #this tool is present in qt 4.5 but only if you compile from sources
-    #from qt 4.6 is present also in the binary version
-    find_program(macdeployqt_executable NAMES macdeployqt macdeployqt-mac PATHS ${qt_base_dir}/bin)
-    if(NOT macdeployqt_executable)
-        message(FATAL_ERROR "The utility macdeployqt is required to create the bundle (seached: ${qt_base_dir})")
+
+    #create the .app bundle using BundleUtilities instead of old macdeployqt
+    set(APP_DIR "Hedgewars.app")
+    set(APP_BASE_DIR "${CMAKE_INSTALL_PREFIX}/../")  # should be, Hedgewars.app/Contents/MacOS/../
+
+    # macro to install qt5 plugins 
+    # modified from https://github.com/Kitware/CMake/blob/master/Source/QtDialog/CMakeLists.txt
+    macro(install_qt5_plugin _qt_plugin_name _qt_plugins_var)
+      get_target_property(_qt_plugin_path "${_qt_plugin_name}" LOCATION)
+      if(EXISTS "${_qt_plugin_path}")
+        get_filename_component(_qt_plugin_file "${_qt_plugin_path}" NAME)
+        get_filename_component(_qt_plugin_type "${_qt_plugin_path}" PATH)
+        get_filename_component(_qt_plugin_type "${_qt_plugin_type}" NAME)
+        set(_qt_plugin_dir "PlugIns")
+        set(_qt_plugin_dest "${_qt_plugin_dir}/${_qt_plugin_type}")
+        install(FILES "${_qt_plugin_path}"
+          DESTINATION "../${_qt_plugin_dest}" # relative to install dir
+          ${COMPONENT})
+        list(APPEND ${_qt_plugins_var}
+          "\${CMAKE_BINARY_DIR}/${APP_BASE_DIR}/${_qt_plugin_dest}/${_qt_plugin_file}")
+      else()
+        message(FATAL_ERROR "QT plugin ${_qt_plugin_name} not found")
+      endif()
+    endmacro()
+
+    # install cocoa plugin and build list to send to fixup_bundle
+    install_qt5_plugin("Qt5::QCocoaIntegrationPlugin" QT_PLUGINS)
+    file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/qt.conf"
+        "[Paths]\nPlugins = ${_qt_plugin_dir}\n")
+    install(FILES "${CMAKE_CURRENT_BINARY_DIR}/qt.conf"
+        DESTINATION "../Resources"  # relative to install dir
+        ${COMPONENT})
+
+    # Build up search directories for fixup_bundle
+    set(DIRS "")
+    # Add QT bin and lib paths
+    if(CMAKE_PREFIX_PATH)
+        foreach(dir ${CMAKE_PREFIX_PATH})
+            list(APPEND DIRS "${dir}/bin" "${dir}/lib")
+        endforeach()
     endif()
+    # Add other lib folder from around the system
+    list(APPEND DIRS 
+        ~/Library/Frameworks
+        /Library/Frameworks
+        /usr/local/lib
+        /opt/local/lib
+    )
 
-    #create the .app bundle
-    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/CreateMacBundle.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/CreateMacBundle.cmake)
-    install(SCRIPT ${CMAKE_CURRENT_BINARY_DIR}/CreateMacBundle.cmake
-            CODE "message(STATUS \"Your app bundle is ready\")")
+    # operate on the Hedgewars.app
+    set(APPS ${CMAKE_BINARY_DIR}/${APP_DIR})
+    
+    # debugging
+    message(STATUS "APPS: ${APPS}")
+    message(STATUS "QT_PLUGINS: ${QT_PLUGINS}")
+    message(STATUS "DIRS: ${DIRS}")
 
+    # properly fixup the .app to include all dependencies    
+    install(CODE "include(BundleUtilities)
+        fixup_bundle(\"${APPS}\" \"${QT_PLUGINS}\" \"${DIRS}\")")
+    
+    
     #create the .dmg for deployment
     #first make sure .app exists, then remove any old .dmg with same name, finally run the script
     add_custom_target(dmg COMMAND make install
@@ -70,7 +118,7 @@
                                   --app-drop-link 410 190
                                   --background "${CMAKE_CURRENT_SOURCE_DIR}/../misc/dmgBackground.png"
                                   ${CMAKE_BINARY_DIR}/Hedgewars-${HEDGEWARS_VERSION}.dmg
-                                  ${CMAKE_BINARY_DIR}/Hedgewars.app
+                                  ${CMAKE_BINARY_DIR}/${APP_DIR}
                           WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
 endif()
 
--- a/tools/CreateMacBundle.cmake.in	Mon Jan 14 15:11:15 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-# check for a well known-framework
-execute_process(COMMAND stat ${frameworks_dir}/QtCore.framework RESULT_VARIABLE doBundle OUTPUT_QUIET ERROR_QUIET)
-# prepare Frameworks directory
-execute_process(COMMAND mkdir -p ${frameworks_dir})
-# macdeployqt will convert safely any absolute path library for 'hedgewars'
-execute_process(COMMAND ${macdeployqt_executable} ${CMAKE_BINARY_DIR}/Hedgewars.app OUTPUT_QUIET ERROR_QUIET)
-
-# but macdeployqt will not work for a second executable, so employ this series of ridiculous commands to work around it
-execute_process(COMMAND mv ${CMAKE_BINARY_DIR}/Hedgewars.app/Contents/MacOS/hedgewars ${CMAKE_BINARY_DIR}/Hedgewars.app/Contents/MacOS/tmp)
-execute_process(COMMAND mv ${CMAKE_BINARY_DIR}/Hedgewars.app/Contents/MacOS/hwengine ${CMAKE_BINARY_DIR}/Hedgewars.app/Contents/MacOS/hedgewars)
-execute_process(COMMAND ${macdeployqt_executable} ${CMAKE_BINARY_DIR}/Hedgewars.app OUTPUT_QUIET ERROR_QUIET)
-execute_process(COMMAND mv ${CMAKE_BINARY_DIR}/Hedgewars.app/Contents/MacOS/hedgewars ${CMAKE_BINARY_DIR}/Hedgewars.app/Contents/MacOS/hwengine)
-execute_process(COMMAND mv ${CMAKE_BINARY_DIR}/Hedgewars.app/Contents/MacOS/tmp ${CMAKE_BINARY_DIR}/Hedgewars.app/Contents/MacOS/hedgewars)
-
-if(doBundle EQUAL 1)
-    if(${SPARKLE_FOUND})
-        execute_process(COMMAND cp -pPR ${SPARKLE_LIBRARY} ${frameworks_dir})
-    endif()
-    message(STATUS "Frameworks and libraries successfully copied...")
-else()
-    message(STATUS "Frameworks already present, skipping...")
-endif()
--- a/tools/build_vcpkg_basic.bat	Mon Jan 14 15:11:15 2019 -0500
+++ b/tools/build_vcpkg_basic.bat	Fri Aug 16 10:59:50 2019 -0600
@@ -1,6 +1,6 @@
 @echo off
 ::edit these variables if necessary
-set BUILD_TYPE="Debug"
+set BUILD_TYPE="Release"
 ::set if vcpkg is not on path
 set VCPKG_PATH=%VCPKG_ROOT%
 ::set if CMake is not on path
@@ -17,7 +17,7 @@
 echo Running cmake...
 set ERRORLEVEL=
 
-cmake . -DCMAKE_TOOLCHAIN_FILE="%VCPKG_PATH%\scripts\buildsystems\vcpkg.cmake" -G"NMake Makefiles" -DNOPNG=1 -DNOSERVER=1 -DNOVIDEOREC=1 -DCMAKE_BUILD_TYPE="%BUILD_TYPE%" -DSDL2_BUILDING_LIBRARY=1
+cmake . -DCMAKE_TOOLCHAIN_FILE="%VCPKG_PATH%\scripts\buildsystems\vcpkg.cmake" -G"NMake Makefiles"  -DNOSERVER=1 -DNOVIDEOREC=1 -DCMAKE_BUILD_TYPE="%BUILD_TYPE%" -DSDL2_BUILDING_LIBRARY=1
 
 if %ERRORLEVEL% NEQ 0 goto exitpoint
 
@@ -32,6 +32,8 @@
 
 echo Build completed successfully
 
+nmake install
+
 :exitpoint
 cd %CURRDIR%
 pause